目录
- 一、Nginx 介绍
- 1、 Nginx 功能介绍
- 2、基础特性
- 3、Nginx 模块介绍
- 二、Nginx 编译安装
- 1、编写systemd服务
- 三、平滑升级和回滚
- 1、平滑升级的流程
- 2、升级
- 2、回滚
- 四、 Nginx 核心配置详解
- 1、实现 nginx 的高并发配置
- 2、Nginx 账户认证功能
- 3、nginx作为下载服务器配置
- 五、rewrite 指令
- 1、 rewrite flag 使用介绍
- 2、 rewrite案例: 自动跳转 https
- 3、Nginx 防盗链
- 4、实现防盗链
- 六 Nginx 反向代理功能
- 1、实战案例: 反向代理单台 web 服务器
- 2、针对特定资源实现动静分离
- 3、反向代理示例: 缓存功能
- 4、非缓存场景压测
- 准备缓存配置
- 七、http 反向代理负载均衡
- 1、反向代理示例: 后端多台 web服务器
- 2、实战案例: 基于Cookie 实现会话绑定
- 八、实现 Nginx 四层负载均衡
- 1、负载均衡实例: MySQL
- 九、实现 FastCGI
- 1、FastCGI实战案例 : Nginx与php-fpm在同一服务器
- 十、php的动态扩展模块(php的缓存模块)
- 1、安装memcache模块
- 2、配置php加载memcache模块
- 3、部署memcached
- 十一、php高速缓存
一、Nginx 介绍
1、Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )
2、2019年3月11日 F5 Networks 6.7亿美元的价格收购
3、Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器
4、解决C10K问题(10K Connections)
Nginx官网:http://nginx.org
二次开发的发行版:
- Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine成为一个开源项目官网: http://tengine.taobao.org/
- OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网 : https://openresty.org/cn/
1、 Nginx 功能介绍
- 静态的web资源服务器html,图片,js,css,txt等静态资源
- http/https协议的反向代理
- 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求、
- tcp/udp协议的请求转发(反向代理)
- imap4/pop3协议的反向代理
2、基础特性
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
3、Nginx 模块介绍
nginx 有多种模块:
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件
驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应
头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的
支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支
持等
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载
二、Nginx 编译安装
官方源码包下载地址:https://nginx.org/en/download.html
[root@nginx-1 ~]# https://nginx.org/download/nginx-1.24.0.tar.gz
[root@nginx-1 ~]# tar -xvf nginx-1.24.0.tar.gz
#查看检查配置的参数
[root@nginx-1 nginx-1.24.0]# ./configure --help./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加密
缺少依赖:
依次推:
[root@nginx-1 nginx-1.24.0]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
[root@nginx-1 nginx-1.24.0]# make
执行make的命令会生成:
执行make install 就是把这里面的nginx文件拷贝到/usr/local/nginx这个目录下
[root@nginx-1 nginx-1.24.0]# make install
#添加一个没有系统用户
[root@nginx-1 nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
#安装好会生成这些文件
[root@nginx-1 nginx-1.24.0]# ll /usr/local/nginx/
total 4
drwxr-xr-x. 2 root root 4096 Aug 15 23:11 conf
drwxr-xr-x. 2 root root 40 Aug 15 23:11 html
drwxr-xr-x. 2 root root 6 Aug 15 23:11 logs
drwxr-xr-x. 2 root root 19 Aug 15 23:11 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二进制启动脚本,可以接受不同的参数以实现不同的功能。
为了方便执行nginx程序:
[root@nginx-1 nginx-1.24.0]# grep export ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
[root@nginx-1 nginx-1.24.0]# source ~/.bash_profile[root@nginx-1 ~]# nginx -v
nginx version: nginx/1.24.0
nginx常用的命令:
-t : test configuration and exit #检查nginx的配置-s signal : send signal to a master process: stop, quit, reopen, reload
在这种方式他不能实现开机自启:
1、编写systemd服务
[root@nginx-1 ~]# cat /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@nginx-1 ~]# systemctl daemon-reload
[root@nginx-1 ~]# systemctl restart nginx.service
三、平滑升级和回滚
有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级。
1、平滑升级的流程
将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
向master进程发送USR2信号
master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主
进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进
程的PID存放至新生成的pid文件nginx.pid
向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
2、升级
#下载升级的nginx源码
[root@nginx-1 ~]# wget https://nginx.org/download/nginx-1.26.2.tar.gz
[root@nginx-1 ~]# tar -xvf nginx-1.26.2.tar.gz
[root@nginx-1 nginx-1.26.2]# ./configure --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-1 nginx-1.26.2]# make #不要make install
#备份nginx文件
[root@nginx-1 nginx-1.26.2]# cd /usr/local/nginx/sbin/
[root@nginx-1 sbin]# ll
total 5524
-rwxr-xr-x. 1 root root 5654232 Aug 15 23:11 nginx
[root@nginx-1 sbin]# \cp -f nginx nginx.old
[root@nginx-1 sbin]# ll
total 11048
-rwxr-xr-x. 1 root root 5654232 Aug 15 23:11 nginx
-rwxr-xr-x. 1 root root 5654232 Aug 15 23:42 nginx.old
这个时候nginx是启动的,可以开始平滑升级,用户也不知
#将新的nginx文件copy过来,覆盖nginx
[root@nginx-1 sbin]# \cp -f /root/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin/
#查看nginx的pid文件
[root@nginx-1 sbin]# cat ../logs/nginx.pid
18696
[root@nginx-1 sbin]# kill -USR2 18696
[root@nginx-1 sbin]# ps -aux|grep nginx
#回收旧版本
[root@nginx-1 sbin]# kill -WINCH 18696
[root@nginx-1 sbin]# nginx -v
nginx version: nginx/1.26.2
升级成功
2、回滚
#如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker
[root@nginx-1 sbin]# \cp -f nginx.old nginx
[root@nginx-1 sbin]# \cp -f nginx.old nginx
[root@nginx-1 sbin]# kill -HUP 18696
[root@nginx-1 sbin]# ps -aux|grep nginx
root 18696 0.0 0.0 9888 2616 ? Ss 23:29 0:00 nginx: master process /usr/local/nginx/sbin/nginx
root 21814 0.0 0.1 9896 6356 ? S 23:47 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 21815 0.0 0.1 13704 4604 ? S 23:47 0:00 nginx: worker process
nginx 21839 0.0 0.1 13696 4740 ? S 23:52 0:00 nginx: worker process
root 21841 0.0 0.0 6412 2252 pts/0 S+ 23:52 0:00 grep --color=auto nginx
[root@nginx-1 sbin]# kill -WINCH 21814
#关闭老master
[root@nginx-1 sbin]# kill -QUIT 21814
[root@nginx-1 sbin]# nginx -v
nginx version: nginx/1.24.0
回滚成功
四、 Nginx 核心配置详解
nginx 官方帮助文档:http://nginx.org/en/docs/
1、实现 nginx 的高并发配置
编辑主配置文件
worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU #将Nginx工作进程绑定到指定的CPU核心
[root@nginx ~]# nginx -s reload
发现有两个woker进程了
修改nginx的并发连接数
worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为
2、Nginx 账户认证功能
由 ngx_http_auth_basic_module 模块提供此功能
#创建一个用户,并把账号密码保存到.htpasswd这个文件中
[root@nginx ~]# htpasswd -cm /usr/local/nginx/conf/.htpasswd gang
New password:
Re-type new password:
Adding password for user gang#nginx的配置
[root@nginx ~]# cat /usr/local/nginx/conf.d/php.conf
server {listen 80;server_name 172.25.254.100;root /data/php;location / {root /data/html;index index.html;auth_basic "login password";auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";}
}
测试:
3、nginx作为下载服务器配置
ngx_http_autoindex_module 模块处理以斜杠字符 “/” 结尾的请求,并生成目录列表,可以做为下载服务配置使用。
autoindex on | off; #自动文件索引功能,默为off
autoindex_exact_size on | off; #计算文件确切大小(单位bytes),off 显示大概大小(单位K、
M),默认on
autoindex_localtime on | off ; #显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp; #显示索引的页面文件风格,默认html
limit_rate rate; #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位
B/s,bytes/second, #默认值0,表示无限制,此指令由
ngx_http_core_module提供
set $limit_rate 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.
nginx配置:
重载配置文件进行测试:
测试:
五、rewrite 指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,
rewrite主要是针对用户请求的URL或者是URI做具体处理。
官网:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html
语法格式:
rewrite regex replacement [flag];
rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI。
如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向
301。
1、 rewrite flag 使用介绍
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时
重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型。
redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作
#而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用
#适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,
#而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户
永久重定向和临时重定向的一个区别:1、状态码不同;2、永久重定向会缓存DNS解析记录,临时重定向不会。
2、 rewrite案例: 自动跳转 https
案例:基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全部自动跳转至 https,另外也可以实现部分 location 跳转。
#制作证书,创建证书的目录
[root@nginx ~]# mkdir /usr/local/nginx/certs
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/gang.key \
-x509 -days 365 -out /usr/local/nginx/certs/gang.crt[root@nginx ~]# cat /usr/local/nginx/conf.d/https.conf
server{listen 80;listen 443 ssl;server_name 172.25.254.100;root /data/web/;index index.html;ssl_certificate /usr/local/nginx/certs/gang.crt;ssl_certificate_key /usr/local/nginx/certs/gang.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;location / {if ( $scheme = http ){rewrite /(.*) https://$host/$1 redirect;}if ( !-e $request_filename ){rewrite /(.*) https://$host/index.html redirect;}}
}
解释:第一个if语句就是匹配用户如果是输入的http协议,给它临时定向到https,第二个if就是他访问的uri不存在,就给他定向到默认发布目录。
测试:http访问,跳转到https页面
测试:访问一个不存在的页面,定向到默认发布页面
3、Nginx 防盗链
防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有以下几种。
none: #请求报文首部没有referer首部,
#比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked: #请求报文有referer首部,但无有效值,比如为空。
server_names: #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string: #自定义指定字符串,但可使用*作通配符。示例: *.timinglee.org
www.timinglee.*
regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:
~.*\.timinglee\.com
4、实现防盗链
nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效实现防盗链功能。
#定义防盗链:创建一个目录存放图片
[root@nginx conf.d]# mkdir /data/web/images -p
[root@nginx conf.d]# cat https.conf
server{listen 80;listen 443 ssl;server_name 172.25.254.100;root /data/web/;index index.html;ssl_certificate /usr/local/nginx/certs/gang.crt;ssl_certificate_key /usr/local/nginx/certs/gang.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;location /images {valid_referers none blocked server_names 172.25.254.* ~\.baidu\.;}location / {if ( $scheme = http ){rewrite /(.*) https://$host/$1 redirect;}if ( !-e $request_filename ){rewrite /(.*) https://$host/index.html redirect;}}
}
#新建一台虚拟机,安装httpd服务
[root@web ~]# yum install httpd
[root@web ~]# vim /var/www/html/index.html
#准备盗链web页面:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><img src="https://172.25.254.100/images/index.png" alt="" width="100px" height="100px"><p><a href="https://172.25.254.100/">从这里点进去</a></p>
</body>
</html>
[root@web ~]# systemctl restart httpd
测试:正常访问
查看172.25.254.100的访问日志,可以看到172.25.254.110盗链了他的资源:
要是防止别人盗链的话:加上下面的命令
测试:110这台主机不能看到我的图片呀!
如果110这台主机盗用我的盗链,我还可以给他看同一个图片,对他好点,全给他看美女吧!
编辑配置文件,重启,测试:
六 Nginx 反向代理功能
反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能。
ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass
#等指令引用的后端服务器分组
ngx_stream_proxy_module: #将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module: #将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理
关于同构代理和异构代理:
同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需要经过处理才能被访问
1、实战案例: 反向代理单台 web 服务器
#110作为真实的rs,100做反向代理服务器
[root@nginx conf.d]# cat fx.conf
server{listen 80;server_name 172.25.254.100;location / {proxy_pass http://172.25.254.110;}
}
测试:
2、针对特定资源实现动静分离
#nginx这台服务器配置
[root@nginx conf.d]# cat fx.conf
server{listen 80;server_name 172.25.254.100;location /php {proxy_pass http://172.25.254.110;}location /static {proxy_pass http://172.25.254.120;}
}
[root@nginx conf.d]# nginx -s reload
#110这台服务器配置
[root@web ~]# yum install php-fpm
[root@web ~]# systemctl restart httpd
[root@web ~]# mkdir /var/www/html/php
[root@web ~]# vim /var/www/html/php/index.php
[root@web ~]# cat /var/www/html/php/index.php
<?php
echo "Hello, World!";
?>
#120这台服务器的配置
[root@web2 ~]# mkdir /var/www/html/static -p
[root@web2 ~]# echo static page > /var/www/html/static/index.html
测试:
访问nginx的服务器地址:
3、反向代理示例: 缓存功能
缓存功能默认关闭状态,需要先动配置才能启用.
4、非缓存场景压测
[root@web ~]# ab -n10000 -c100 http://172.25.254.100/static/index.html
Failed requests: 0
Total transferred: 2620000 bytes
HTML transferred: 120000 bytes
Requests per second: 2017.71 [#/sec] (mean)
Time per request: 49.561 [ms] (mean)
准备缓存配置
在主配置文件nginx.conf的http配置段添加:
子配置文件的配置添加项:
访问之后就会自动生成缓存数据的目录:
#再次访问测试:
[root@web ~]# ab -n10000 -c100 http://172.25.254.100/static/index.html
Concurrency Level: 100
Time taken for tests: 2.964 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2620000 bytes
HTML transferred: 120000 bytes
Requests per second: 3373.59 [#/sec] (mean)
Time per request: 29.642 [ms] (mean)
进行对比发现处理请求快了不少:
Requests per second: 2017.71 [#/sec] (mean)
Requests per second: 3373.59 [#/sec] (mean)
七、http 反向代理负载均衡
在上一个节中Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能。
官方文档: https://nginx.org/en/docs/http/ngx_http_upstream_module.html
1、反向代理示例: 后端多台 web服务器
环境说明:
172.25.254.100 #Nginx 代理服务器
172.25.254.110 #后端web A,Apache部署
172.25.254.120 #后端web B,Apache部署
分别测试访问,确保后端服务器没撒问题。
配置 nginx 反向代理
注意: 本节实验过程中先关闭缓存
子配置文件配置:
测试:轮询调度成功!
2、实战案例: 基于Cookie 实现会话绑定
测试:同一个cookie会被调度到同一台服务器上
八、实现 Nginx 四层负载均衡
Nginx在1.9.0版本开始支持tcp模式的负载均衡,在1.9.13版本开始支持udp协议的负载,udp主要用于
DNS的域名解析,其配置方式和指令和http 代理类似,其基于ngx_stream_proxy_module模块实现tcp负载,另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、调度算法等高级功能。
1、负载均衡实例: MySQL
后端两台服务器安装 MySQL
[root@web ~]# yum install mariadb-server -y
[root@web ~]# systemctl start mariadb
[root@web ~]# grep server-id /etc/my.cnf.d/mariadb-server.cnf
server-id=1
另一台数据库服务设置为2就行。
[root@web ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"
[root@web ~]# systemctl restart mariadb.service
注意,两台数据库服务器都要做相应的配置
编辑子配置文件重新加载配置:
[root@nginx conf]# vim /usr/local/nginx/conf/tcp/tcp.conf
不能写在conf.d的目录里,因为那是http的子配置文件;
并且在主配置文件添加这个目录,在http的外部写。
测试:成功
九、实现 FastCGI
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?
FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。
进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server
的请求worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理
1、FastCGI实战案例 : Nginx与php-fpm在同一服务器
php官方网站:www.php.net
[root@nginx-1 ~]# yum install php-fpm -y
[root@nginx-1 ~]# systemctl start php-fpm.service
[root@nginx-1 ~]# egrep "^user|^group" /etc/php-fpm.d/www.conf
user = nginx
group = nginx
[root@nginx-1 conf]# vim /etc/php-fpm.d/www.conf
添加:listen = 9000
#创建一个php的目录
[root@nginx-1 ~]# mkdir /data/php -p
[root@nginx-1 ~]# cat /data/php/index.php
<?phpphpinfo();
?>
Nginx配置转发
Nginx安装完成之后默认生成了与fastcgi的相关配置文件,一般保存在nginx的安装路径的conf目录当
中,比如/apps/nginx/conf/fastcgi.conf、/apps/nginx/conf/fastcgi_params。
[root@nginx-1 conf.d]# cat /usr/local/nginx/conf.d/php.conf
server {listen 80;server_name 127.0.0.1;root /data/php;location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}
}
#加载配置文件
[root@nginx-1 conf.d]# nginx -s reload
测试下:
用ab命令进行压力测试:
[root@nginx-1 ~]# yum install httpd-tools
[root@nginx-1 ~]# ab -n500 -c100 http://172.25.254.200/index.php
php处理请求太慢了;
十、php的动态扩展模块(php的缓存模块)
软件下载:http://pecl.php.net/package/memcache
1、安装memcache模块
解压:
[root@nginx-1 ~]# tar -xvf memcache-8.2.tgz
[root@nginx-1 memcache-8.2]# yum install autoconf -y
[root@nginx-1 memcache-8.2]# ./configure && make && make install
[root@Nginx memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-
20230831/
memcache.so opcache.so[root@Nginx memcache-8.2]# cp example.php memcache.php /data/php/
[root@Nginx ~]# vim /data/php/memcache.php
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','gang'); // Admin Password
define('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
2、配置php加载memcache模块
[root@Nginx ~]# vim /usr/local/php/etc/php.ini
;extension=zip
extension=memcache
;zend_extension=opcache
[root@Nginx ~]# systemctl reload php-fpm
[root@Nginx no-debug-non-zts-20230831]# php -m | grep mem
memcache
3、部署memcached
[root@Nginx ~]# yum install memcached -y
[root@Nginx ~]# systemctl enable --now memcached.service
[root@Nginx ~]# netstat -antlupe | grep memcache
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN
976 1037243 186762/memcached
[root@Nginx ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1"
测试:
性能对比:
[root@nginx memcache-8.2]# ab -n500 -c10 http://172.25.254.100/example.php
十一、php高速缓存
在我们安装的nginx中默认不支持memc和srcache功能,需要借助第三方模块来让nginx支持此功能,所以nginx需要重新编译。
[root@Nginx ~]# rm -fr /urs/local/nginx/
[root@Nginx ~]# tar zxf srcache-nginx-module-0.33.tar.gz
[root@Nginx ~]# tar zxf memc-nginx-module-0.20.tar.gz
[root@Nginx ~]# cd nginx-1.26.1/
[root@Nginx nginx-1.26.1]# ./configure --prefix=/urs/local/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-module-
0.33
[root@Nginx nginx-1.26.1]# make && make install
[root@Nginx ~]# vim /urs/local/nginx/conf.d/php.conf
upstream memcache {
server 127.0.0.1:11211;
keepalive 512;
}
server {
listen 80;
server_name php.timinglee.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