本文共 22117 字,大约阅读时间需要 73 分钟。
目录
Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 2019年3月11日 F5 Networks 6.7亿美元的价格收购。
Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器。
解决C10K问题(10K Connections)。
Nginx官网:
nginx的其它的二次发行版:

web请求处理机制
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。

主进程(master process)的功能:
工作进程(worker process)的功能:

工作进程是由主进程生成的,主进程使用fork()函数,在Nginx服务器启动过程中主进程根据配置文件决 定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生 成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进 程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出 的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。
主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送 正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就 会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。
worker进程之间的通信原理基本上和主进程与worker进程之间的通信是一样的,只要worker进程之间能够 取得彼此的信息,建立管道即可通信,但是由于worker进程之间是完全隔离的,因此一个进程想要知道另外一 个进程的状态信息,就只能通过主进程来实现。
为了实现worker进程之间的交互,master进程在生成worker进程之后,在worker进程表中进行遍历,将该 新进程的PID以及针对该进程建立的管道句柄传递给worker进程中的其他进程,为worker进程之间的通信做 准备,当worker进程1向worker进程2发送指令的时候,首先在master进程给它的其他worker进程工作信息 中找到2的进程PID,然后将正确的指令写入指向进程2的管道,worker进程2捕获到管道中的事件后,解析指 令并进行相关操作,这样就完成了worker进程之间的通信。
worker进程可以通过共享内存来通讯的,比如upstream中的zone,或者limit_req、limit_conn中的 zone等。操作系统提供了共享内存机制。



nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载
模块分类:
核心模块:core module
标准模块:
HTTP 模块: ngx_http_*
HTTP Core modules #默认功能
HTTP Optional modules #需编译时指定
Mail 模块: ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块

Nginx版本:
Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安装:
编译器介绍:
源码安装需要提前准备标准的编译器,GCC的全称是(GNU Compiler collection),其有GNU开发,并以 GPL即LGPL许可,是自由的类UNIX即苹果电脑Mac OS X操作系统的标准编译器,因为GCC原本只能处理C语 言,所以原名为GNU C语言编译器,后来得到快速发展,可以处理C++,Fortran,pascal,objective C, java以及Ada等其他语言,此外还需要Automake工具,以完成自动创建Makefile的工作,Nginx的一些模块 需要依赖第三方库,比如: pcre(支持rewrite),zlib(支持gzip模块)和openssl(支持ssl模块) 等。
官方源码包下载地址:
编译安装:
[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
[root@Nginx nginx]# tar zxf nginx-1.24.0.tar.gz
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
[root@Nginx nginx]# cd nginx-1.24.0/
[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx
–user=nginx # 指定nginx运行用户
–group=nginx # 指定nginx运行组
–with-http_ssl_module # 支持https://
–with-http_v2_module # 支持http版本2
–with-http_realip_module # 支持ip透传
–with-http_stub_status_module # 支持状态页面
–with-http_gzip_static_module # 支持压缩
–with-pcre # 支持正则
–with-stream # 支持tcp反向代理
–with-stream_ssl_module # 支持tcp的ssl加密
–with-stream_realip_module# 支持tcp的透传ip
[root@Nginx nginx-1.24.0]# make && make install
nginx完成安装以后,有四个主要的目录
[root@Nginx nginx-1.24.0]# ls /usr/local/nginx/
conf html logs sbin
conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他 的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params 两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀 去掉即可。
html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web 文件是默认的错误页面提示页面。
logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比 如/var/logs/nginx里面。
sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。
[root@Nginx ~]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
[root@Nginx ~]# source ~/.bash_profile
[root@Nginx ~]# nginx -V
nginx version: nginx/1.24.0
官方文档:
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行 配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:
if (条件匹配) {
action
}
使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间 使用以下符号链接:
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真-f 和 !-f #判断请求的文件是否存在和是否不存在-d 和 !-d #判断请求的目录是否存在和是否不存在-x 和 !-x #判断文件是否可执行和是否不可执行-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)#注意:#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效 位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用。
注意:如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行。
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重 定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配 置都将不被执行,return可以在server、if 和 location块进行配置。
语法格式:
return code; #返回给客户端指定的HTTP状态码
return code [text];#返回给客户端的状态码及响应报文的实体内容,
#可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者是URI做具体处理。
语法格式:
rewrite regex replacement [flag];
rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI。
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成 后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的 标志位用于控制此循环机制。
如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301。
正则表达式格式:
. #匹配除换行符以外的任意字符w #匹配字母或数字或下划线或汉字s #匹配任意的空白符d #匹配数字 #匹配单词的开始或结束^ #匹配字付串的开始$ #匹配字符串的结束* #匹配重复零次或更多次+ #匹配重复一次或更多次? #匹配重复零次或一次(n) #匹配重复n次{n,} #匹配重复n次或更多次{n,m} #匹配重复n到m次*? #匹配重复任意次,但尽可能少重复+? #匹配重复1次或更多次,但尽可能少重复?? #匹配重复0次或1次,但尽可能少重复{n,m}? #匹配重复n到m次,但尽可能少重复{n,}? #匹配重复n次以上,但尽可能少重复W ? #匹配任意不是字母,数字,下划线,汉字的字符S #匹配任意不是空白符的字符D #匹配任意非数字的字符B #匹配不是单词开头或结束的位置[^x] #匹配除了x以外的任意字符[^lee] #匹配除了magedu 这几个字母以外的任意字符 利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时 重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型。
rewrite 格式:
Syntax: rewrite regex replacement [flag]; #通过正则表达式处理用户请求并返回替换后的数据 包。
Default: —
Context: server, location, if
flag 说明:
redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求,状态码:301 break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作 #而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用 #适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,
#而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户
名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳 转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。
示例: 因业务需要,将访问源域名 www.qisheng.org 的请求永久重定向到 www.qisheng.com
location / { ? root /data/nginx/html/pc; ? index index.html; ? rewrite / http://www.qisheng.com permanent; ? #rewrite / http://www.qisheng.com redirect; } #重启Nginx并访问域名 http://www.qisheng.org 进行测试 域名永久型调整,即域名永远跳转至另外一个新的域名,之前的域名再也不使用,跳转记录可以缓存到 客户端浏览器。
永久重定向会缓存DNS解析记录, 浏览器中有 from disk cache 信息,即使nginx服务器无法访问,浏览器也 会利用缓存进行重定向。
比如: 京东早期的域名 www.360buy.com 由于与360公司类似,于是后期永久重定向到了 www.jd.com。
示例:
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.confserver { listen 80; server_name ou.qisheng.org; root /webdata/nginx/qisheng.org/ou/html; location / { ? #rewrite / http://ou.qisheng.com redirect; ? rewrite / http://lee.qisheng.com permanent; }}server { listen 80; server_name ou.qisheng.com; root /webdata/nginx/qisheng.com/ou/html;} 域名临时重定向,告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器 不会缓存当前域名的解析记录,而浏览器会缓存永久重定向的DNS解析记录,这也是临时重定向与永久 重定向最大的本质区别。
即当nginx服务器无法访问时,浏览器不能利用缓存,而导致重定向失败。
示例:
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.confserver { listen 80; server_name ou.qisheng.org; root /webdata/nginx/qisheng.org/ou/html; location / { ? rewrite / http://ou.qisheng.com redirect; ? #rewrite / http://ou.qisheng.com permanent; }}server { listen 80; server_name ou.qisheng.com; root /webdata/nginx/qisheng.com/ou/html;} 测试: 访问break请求被rewrite至test1,而访问test1转递请求再次被rewrite发送至test2,此测试last和break 分别有什么区别。
4.2.3.1break和last区别案例
[root@Nginx ~]# mkdir /webdata/nginx/qisheng.org/ou/html/{test1,test2,break}[root@Nginx ~]# echo test1 > /webdata/nginx/qisheng.org/ou/html/test1/index.html[root@Nginx ~]# echo test2 > /webdata/nginx/qisheng.org/ou/html/test2/index.html[root@Nginx ~]# echo break > /webdata/nginx/qisheng.org/ou/html/break/index.html[root@centos8 ~]#cat /usr/local/nginx/conf.d/vhosts.conf server { listen 80; server_name ou.qisheng.org; root /webdata/nginx/qisheng.org/ou/html; location /break { ? root /webdata/nginx/qisheng.org/ou/html; ? rewrite ^/break/(.*) /test1/$1 last; ? rewrite ^/test1/(.*) /test2/$1 break; } location /last { ? root /webdata/nginx/qisheng.org/ou/html; ? rewrite ^/last/(.*) /test1/$1 last; ? rewrite ^/test1/(.*) /test2/$1 last; } location /test1 { ? ? default_type text/html; ? ? return 666 "new test1"; } location /test2 { ? root /webdata/nginx/qisheng.org/ou/html; }}[root@client ~]# curl -L ou.qisheng.org/break/index.htmltest1[root@client ~]# curl -L ou.qisheng.org/last/index.htmlnew test1[root@client ~]# 案例:基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全 部自动跳转至 https,另外也可以实现部分 location 跳转。
1、创建认证目录
mkdir -p /usr/local/nginx/certs
2、生成证书
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/qisheng.org.key -x509 -days 365 -out /usr/local/nginx/certs/qisheng.org.crt
3、编辑配置文件
vim /usr/local/nginx/conf.d/vhosts.conf

[root@centos8 ~]#vim /usr/local/nginx/conf.d/vhosts.confserver { listen 443 ssl; listen 80; ssl_certificate /usr/local/nginx/certs/qisheng.org.crt; ssl_certificate_key /usr/local/nginx/certs/qisheng.org.key; ssl_session_cache shared:sslcache:20m; ssl_session_timeout 10m; server_name ou.qisheng.org; location / { ? ?#针对全站跳转 ? root /data/nginx/html; ? index index.html; ? ? if ($scheme = http ){ ? #如果没有加条件判断,会导致死循环 ? rewrite / https://$host redirect; ? } ? } location /login { ? ? #针对特定的URL进行跳转https if ($scheme = http ){ ? #如果没有加条件判断,会导致死循环 ? rewrite / https://$host/login redirect; ? } }}#重启Nginx并访问测试[root@centos7 ~]#curl -ikL www.timinglee.org 4、测试结果


4.2.5rewrite 案例: 判断文件是否存在
案例:当用户访问到公司网站的时输入了一个错误的URL,可以将用户重定向至官网首页
1、编辑配置文件
vim /usr/local/nginx/conf.d/vhosts.conf

2、重启nginx,并测试
nginx -s reload

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标 记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗 链,referer就是之前的那个网站域名,正常的referer信息有以下几种:
(1)none: 请求报文首部没有referer首部, 比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
(2)blocked: 请求报文有referer首部,但无有效值,比如为空。
(3)server_names: referer首部中包含本主机名及即nginx 监听的server_name。
(4)arbitrary_string: 自定义指定字符串,但可使用*作通配符。
(5)regular expression: 被指定的正则表达式模式匹配到的字符串,要使用~开头。
在一个web 站点盗链另一个站点的资源信息,比如:图片、视频等
新建一个主机172.25.254.20,盗取另一台主机ou.qisheng.org/images/logo.png的图片
1、安装httpd
yum install httpd -y
2、准备盗链web页面
vim /var/www/html/index.html
? ?盗链 ??
欢迎大家
?点击有惊喜!!!
3、重启apche服务并访问测试
重启apache并访问http://172.25.254.20 测试,验证两个域名的日志,是否会在被盗连的web站点的日志中出现以下盗链日志信息。
oot@Nginx ~]# cat /usr/local/nginx/logs/access.log
基于访问安全考虑,nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效 实现防盗链功能。
官方文档:
1、定义防盗链
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server { listen 80; server_name ou.qisheng.org; root /webdata/nginx/qisheng.org/ou/html; location /images { ? valid_referers none blocked server_names *.qisheng.org ~.baidu.; ? if ($invalid_referer){ ? ? #return 403; ? ? rewrite ^/ http://ou.qisheng.org/daolian.png permanent; ? } }} 2、重启nginx并访问测试


CGI的由来: 最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏 览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动态技 术,比如像php(1995年)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不 能直接运行 php、java这样的文件,apache实现的方式是打补丁,但是nginx缺通过与第三方基于协议实 现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户 的请求,处理完成后返回数据给Nginx并回收进程,最后nginx在返回给客户端,那这个约定就是通用网 关接口(common gateway interface,简称CGI),CGI(协议) 是web服务器和外部应用程序之间的接口 标准,是cgi程序和web服务器之间传递信息的标准化接口。

为什么会有FastCGI?
CGI协议虽然解决了语言解析器和 Web Server 之间通讯的问题,但是它的效率很低,因为 Web Server 每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候 再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGI是用来提高CGI性 能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请 求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。
什么是PHP-FPM?
PHP-FPM(FastCGI Process Manager:
Nginx基于模块ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处 理,其配置指令如下:
fastcgi_pass address:port;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in locationfastcgi_index name;#fastcgi默认的主页资源,示例:fastcgi_index index.php;fastcgi_param parameter value [if_not_empty];#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义keyfastcgi_param REMOTE_ADDR ? ? ? ?$remote_addr; #客户端源IPfastcgi_param REMOTE_PORT ? ? ? ?$remote_port; #客户端源端口fastcgi_param SERVER_ADDR ? ? ? ?$server_addr; #请求的服务器IP地址fastcgi_param SERVER_PORT ? ? ? ?$server_port; #请求的服务器端口fastcgi_param SERVER_NAME ? ? ? ?$server_name; #请求的server nameNginx默认配置示例: ? location ~ .php$ { ? ? root ? ? ? ? ? /scripts; ? ? fastcgi_pass ? 127.0.0.1:9000; ? ? fastcgi_index index.php; ? ? fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #默认脚本路径 ? ? #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ? ? include ? ? ? fastcgi_params; ? ?#此文件默认系统已提供,存放的相对路径为prefix/conf ? } 编译安装更方便自定义参数或选项,所以推荐大家使用源码编译
官方网站:
源码编译php:
1、安装php依赖
[root@Nginx ~]# yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel
2、解压源码并安装
[root@Nginx ~]# ./configure
–prefix=/usr/local/php #安装路径
–with-config-file-path=/usr/local/php/etc #指定配置路径 –enable-fpm #用cgi方式启动程序 –with-fpm-user=nginx #指定运行用户身份 –with-fpm-group=nginx –with-curl #打开curl浏览器支持 –with-iconv #启用iconv函数,转换字符编码 –with-mhash #mhash加密方式扩展库 –with-zlib #支持zlib库,用于压缩http压缩传输 –with-openssl #支持ssl加密 –enable-mysqlnd #mysql数据库 –with-mysqli –with-pdo-mysql –disable-debug #关闭debug功能 –enable-sockets #支持套接字访问 –enable-soap #支持soap扩展协议 –enable-xml #支持xml –enable-ftp #支持ftp –enable-gd #支持gd库 –enable-exif #支持图片元数据 –enable-mbstring #支持多字节字符串 –enable-bcmath #打开图片大小调整,用到zabbix监控的时候用到了这个模块 –with-fpm-systemd #支持systemctl 管理cgiphp相关配置优化:
[root@Nginx ~]# cd /usr/local/php/etc
[root@Nginx etc]# cp php-fpm.conf.default php-fpm.conf
[root@Nginx etc]# vim php-fpm.conf
去掉注释
pid = run/php-fpm.pid #指定pid文件存放位置
[root@Nginx etc]# cd php-fpm.d/
[root@Nginx php-fpm.d]# cp www.conf.default www.conf
#生成主配置文件
[root@Nginx php-fpm.d]# cd /root/php-8.3.9
[root@Nginx php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini
[root@Nginx ~]# vim /usr/local/php/etc/php.ini
[Date]; Defines the default timezone used by the date functions; https://php.net/date.timezonedate.timezone = Asia/Shanghai #修改时区
#生成启动文件
[root@Nginx ~]# cd /root/php-8.3.9/
[root@Nginx php-8.3.9]# cp sapi/fpm/php-fpm.service /lib/systemd/system/
# Mounts the /usr, /boot, and /etc directories read-only for processes invoked by this unit.#ProtectSystem=full #注释该内容
[root@Nginx php-8.3.9]# systemctl start php-fpm.service
[root@Nginx php-8.3.9]# netstat -antlupe | grep php
准备php测试页面:
[root@Nginx ~]# mkdir /data/php -p
[root@centos8 ~]# cat /data/php/index.php #php测试页面
Nginx配置转发:
Nginx安装完成之后默认生成了与fastcgi的相关配置文件,一般保存在nginx的安装路径的conf目录当 中,比如/apps/nginx/conf/fastcgi.conf、/apps/nginx/conf/fastcgi_params。
[root@Nginx ~]# vim /usr/local/nginx/conf.d/php.conf
server { listen 80; server_name php.timinglee.org; root /data/php; location ~ .php$ { ? fastcgi_pass 127.0.0.1:9000; ? fastcgi_index index.php; ? include fastcgi.conf; }} 重启nginx并访问web测试:
[root@Nginx ~]# nginx -s reload
添加php环境变量:
[root@Nginx ~]# vim .bash_profile
# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/bin:/apps/nginx/sbin:/usr/local/php/binexport PATH
[root@Nginx ~]# source .bash_profile
软件下载:

安装memcache模块:
[root@Nginx ~]# tar zxf memcache-8.2.tgz
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# yum install autoconf
[root@Nginx memcache-8.2]# phpize
[root@Nginx memcache-8.2]# ./configure && make && make instal
复制测试文件到nginx发布目录中:
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# cp example.php memcache.php /data/php/
[root@Nginx ~]# vim /data/php/memcache.php
define('ADMIN_USERNAME','admin'); ? // Admin Usernamedefine('ADMIN_PASSWORD','123456'); ? // Admin Passworddefine('DATE_FORMAT','Y/m/d H:i:s');define('GRAPH_SIZE',200);define('MAX_ITEM_DUMP',50);$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array 配置php加载memcache模块:
[root@Nginx ~]# vim /usr/local/php/etc/php.ini
;extension=zipextension=memcache;zend_extension=opcache[root@Nginx ~]# systemctl reload php-fpm[root@Nginx no-debug-non-zts-20230831]# php -m | grep memmemcache
部署memcached:
[root@Nginx ~]# yum install memcached -y
[root@Nginx ~]# systemctl enable --now memcached.service
[root@Nginx ~]# cat /etc/sysconfig/memcached
PORT=“11211”
USER=“memcached”
MAXCONN=“1024”
CACHESIZE=“64”
OPTIONS=“-l 127.0.0.1,::1”
测试:
访问 http://ou.qisheng.org/example.php 不断刷新
访问 http://ou.qisheng.org/memcache.php 查看命中效果

性能对比:
压测
ab -n500 -c10

ab -n500 -c10


部署方法:在我们安装的nginx中默认不支持memc和srcache功能,需要借助第三方模块来让nginx支持此功能,所 以nginx需要重新编译。
[root@Nginx ~]# cd nginx-1.26.2/
[root@Nginx nginx-1.26.2]# ./configure --prefix=/apps/nginx --user=nginx – group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module – add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module0.33
[root@Nginx nginx-1.26.2]# make && make install
[root@Nginx ~]# vim /usr/local/nginx/conf.d/php.conf
upstream memcache { ? server 127.0.0.1:11211; ? keepalive 512;}server { listen 80; server_name ou.qisheng.org; root /data/php; location /memc { ? internal; ? memc_connect_timeout 100ms; ? memc_send_timeout 100ms; ? memc_read_timeout 100ms; ? set $memc_key $query_string; #使用内置变量$query_string来作为key ? set $memc_exptime 300; #缓存失效时间300秒 ? memc_pass memcache; } location ~ .php$ { set $key $uri$args; #设定key的值 ? srcache_fetch GET /memc $key; #检测mem中是否有要访问的php ? srcache_store PUT /memc $key; #缓存为加载的php数据 ? fastcgi_pass 127.0.0.1:9000; ? fastcgi_index index.php; ? include fastcgi.conf; }} [root@Nginx ~]# systemctl start nginx.service
测试结果:


Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中, 实现了 OpenResty 这个高性能服务端解决方案。
OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方 模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服 务和动态网关。
OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言 调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高 性能 Web 应用系统。
OpenResty 由于有功能强大且方便的的API,可扩展性更强,如果需要实现定制功能,OpenResty是个不错的 选择。
官网:
[root@Nginx ~]#dnf -yq install gcc pcre-devel openssl-devel perl
[root@Nginx ~]#useradd -r -s /sbin/nologin nginx
[root@Nginx ~]#cd /usr/local/src
[root@Nginx src]#wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
[root@Nginx src]#tar xf openresty-1.17.8.2.tar.gz
[root@Nginx src]#cd openresty-1.17.8.2/
[root@Nginx openresty-1.17.8.2]#./configure
–prefix=/apps/openresty
–user=nginx --group=nginx
–with-http_ssl_module
–with-http_v2_module
–with_http_realip_module
–with-http_stub_status_module
–with-http_gzip_static_module --with-pcre --with-stream
–with-stream_ssl_module
–with-stream_realip_module
[root@Nginx openresty-1.17.8.2]#make && make install
[root@Nginx openresty-1.17.8.2]#ln -s /apps/openresty/bin/* /usr/bin/
[root@Nginx openresty-1.17.8.2]#openresty -v
nginx version: openresty/1.17.8.2
[root@Nginx openresty-1.17.8.2]#openresty
[root@Nginx openresty-1.17.8.2]#ps -ef |grep nginx
[root@Nginx ~]#curl 10.0.0.18
转载地址:http://izjfk.baihongyu.com/