呕心沥血书写,看完后对Nginx了如执掌,不看真的后悔!!
- shell脚本日志分割
- 设置连接超时
- Nginx深入优化
-
-
- 更改进程数
- 配置网页压缩
- 配置防盗链
-
-
- 20.0.0.25 主机:开始盗链
- 20.0.0.26主机:配置防盗链
-
-
- FPM 参数优化
shell脚本日志分割
●随着Nginx运行时间的增加,产生的日志也会逐渐增加,为了方便掌握 Nginx的运行
状态,需要时刻关注Nginx日志文件。太大的日志文件对监控是一个大灾难,不便于分析
排查,需要定期的进行日志文件的切割。
●编写脚本/opt/fenge.sh##
把Nginx的日志文件/usr/local/nginx/logs/access.log移动到,目录/var/log/nginx下面,
以当前时间做为日志文件的名称,然后用kill -USR1创建新的日志文件/usr/local/nginx/logs/access.log,
最后删除30天之前的日志文件。
[root@www logs]# vi /opt/fenge.sh
#!/bin/bash
#Filename: fenge.sh
d=$(date -d "-1 day" "+%Y%m%d")
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path
mv /usr/local/nginx/logs/access.log ${ logs_path}/51xit.top-access.log-$d
kill -USR1 $(cat $pid_path)
find $logs_path -mtime +30 | xargs rm -rf
命令解析
####创建日志文件目录
[ -d $logs_path ] || mkdir -p $logs_path
###移动并重命名日志文件
mv /usr/local/nginx/logs/access.log l o g s p a t h / 51 x i t . t o p − a c c e s s . l o g − {logs_path}/51xit.top-access.log- logspath/51xit.top−access.log−d
###重建新日志文件
kill -USR1 $(cat $pid_path)
####翩除30天之前的日志文件
find $logs_path -mtime +30 | xargs rm -rf
执行/opt/fenge.sh,测试日志文件是否被切割
[root@localhost ~]# chmod +x fengge.sh
[root@localhost ~]# ./fengge.sh
[root@localhost ~]# ls /var/log/nginx/
51xit.top-access.log-20200908
这里可以看到按日期分割了日志文件
[root@localhost ~]# cat /usr/local/nginx/logs/access.log
原来的日志文件没有了 重新创建了
设置连接超时
●在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连
接超时参数,实现控制连接访问时间。可以修改配置文件nginx.conf,设置keepalive_timeout
超时时间。
●keepalive_timeout第一个参数指定了与client的keep-alive连接超时时间,服务器将
会在这个时间后关闭连接。可选的第二个参数指定了在响应头Keep-Alive: timeout=time中
的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。
没有这个参数,nginx不会发送Keep-Alive响应头。
●访问网址抓取数据报文,响应头中显示了超时时间是180秒。一般只设置Keepalive_timeout参数即可。
同时在优化后可能还会增加其它超时参数,比如Client_header_timeout参数,指定等
待客户端发送请求头的超时时间,Client_body_timeout指定请求体读超时时间
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
http {
........//省略内容
keepalive_timeout 65 180; ####修改
client_header_timeout 80; ##在下面添加
client_body_timeout 80; ##在下面添加
........//省略内容
[root@localhost ~]# systemctl restart nginx
清除浏览器缓存访问验证: 20.0.0.26
keep-Alive: timeout=180\r\n
成功了
Nginx深入优化
更改进程数
在高并发环境中,需要启动更多的Nginx进程以保证快速响应,用以处理用户的请求,
避免造成阻塞
首先查看以下Nginx运行进程的个数
[root@localhost ~]# ps aux | grep nginx
root 11926 0.0 0.0 20556 628 ? Ss 07:47 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 11927 0.0 0.0 21008 1596 ? S 07:47 0:00 nginx: worker process
root 11932 0.0 0.0 112724 988 pts/0 S+ 07:51 0:00 grep --color=auto nginx
这里我们看到其中master process 是Nginx的主进程,开启了1个,worker process是子进程,子
进程也是开启了1个。
●修改Nginx的配置文件的worker_processes参数,一般设为CPU 的个数或者核数
在高并发的情况下可设置为CPU个数或者核数,可以查看CPU的核数以确定参数
[root@localhost ~]# cat /proc/cpuinfo | grep -c "physical"
8
参数设置为8,和CPU的核数相同。运行进程数多一些,响应客户端访问请求时,Nginx
就不会临时启动新的进程提供服务,减少了系统的开销,提升了服务速度
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
worker_processes 8;
修改完后,重启服务,使用 ps aux 查看运行进程数的变化情况。
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# ps aux | grep nginx
root 11948 0.0 0.0 20556 692 ? Ss 07:55 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 11949 0.0 0.0 21008 1344 ? S 07:55 0:00 nginx: worker process
nginx 11950 0.0 0.0 21008 1344 ? S 07:55 0:00 nginx: worker process
nginx 11951 0.0 0.0 21008 1344 ? S 07:55 0:00 nginx: worker process
nginx 11952 0.0 0.0 21008 1344 ? S 07:55 0:00 nginx: worker process
nginx 11953 0.0 0.0 21008 1344 ? S 07:55 0:00 nginx: worker process
nginx 11954 0.0 0.0 21008 1344 ? S 07:55 0:00 nginx: worker process
nginx 11955 0.0 0.0 21008 1344 ? S 07:55 0:00 nginx: worker process
nginx 11956 0.0 0.0 21008 1344 ? S 07:55 0:00 nginx: worker process
root 11958 0.0 0.0 112724 988 pts/0 S+ 07:56 0:00 grep --color=auto nginx
●开启了1个主进程和8个子进程,参数设置起到了作用。
默认情况下,Nginx的多个进程可能更多的跑在一颗CPU上,可以分配不同的进程给
不同的CPU处理,充分利用硬件多核多CPU。在一台8核CPU服务器上,可以设置每个
进程分别由不同的 CPU 核心处理,达到CPU 的性能最大化。
配置网页压缩
●Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许Nginx
服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验,
默认 Nginx 已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进
行优化即可。
# gzip on; 开启gzip压缩输出;
# gzip_min_length 1k:用于设置允许压缩的页面最小字节数;
# gzip_buffers 4 16k:表示申请4个单位为16k的内存作为压缩结果流缓存,默认值
是申请与原始数据大小相同的内存空间来存储gzip压缩结果;
# Zip_http_version 1.0:用于设置识别http 协议版本,默认是1.1,目前大部分浏览
器已经支持gzip解压,但处理最慢,也比较消耗服务器CPU 资源;
# Gzip_comp_level 2:用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩
比最大,传输速度快,但处理速度最慢,使用默认即可;
# Gzip_types text/plain:压缩类型,是对哪些网页文档启用压缩功能;
# Gzip_vary on:选项可以让前端的缓存服务器缓存经过gzip压缩的页面
下面开始配置
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
gzip on; 去掉#
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_min_length 1k;
gzip_vary on;
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss;
[root@localhost ~]# systemctl restart nginx
验证:
在Nginx工作目录建立一个超过1K大小的html文件,然后访问网址抓取数据报文
配置防盗链
●在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济
损失,也避免了不必要的带宽浪费。Nginx的防盗链功能也非常强大,在默认情况下,只需
要进行很简单的配置,即可实现防盗链处理。
●防盗链需要准备两台主机,有一台模拟盗链
IP地址
20.0.0.26
20.0.0.25
域名
26:www.51xit.top 源主机
25:www.52.xit.top 盗链主机
为了方便验证需要修改Windows的C:\Windows\System32\drivers\etc\hosts文件,设置域名和映射关系:
20.0.0.26 www.51xit.top Nginx
20.0.0.25 www.test.com Apache
做完以后ping一下这两个网站,通了继续
这里我用工具添加了一张图片进去
[root@localhost html]# systemctl restart nginx
#刷新一下Nginx程序,用浏览器访问www.51xit.top
20.0.0.25 主机:开始盗链
首先打开20.0.0.26主机的域名:www.51xit.top,把网页地址复制下来
#下面为主机20.0.0.25的盗图配置操作:
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# cd /usr/local/httpd/htdocs/
[root@localhost htdocs]# vi index.html
!DOCTYPE html>
<html>
<head>
<p><em>盗版图网站</em></p>
<img src="http://www.51xit.top/zz.jpg" / >
</body>
</html>
#这里把你复制的网址填进去
接下来我们正常访问www.52xit.top 可以看到图片正常打开,盗图成功
20.0.0.26主机:配置防盗链
●Nginx的防盗链原理是加入location项,用正则表达式过滤图片类型文件,对于信任的
网址可以正常使用,不信任的网址返回相应的错误图片。在源主机(bt.com)的配置文件中
加入以下代码:
[root@localhost html]# vi /usr/local/nginx/conf/nginx.conf
#########在第一个 location / { } 下面插入 ###############
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
root html;
expires 1d;
valid_referers none blocked *.51xit.top 51xit.top;
if ($invalid_referer) {
rewrite ^/ https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2135575968,1508481517&fm=15&gp=0.jpg;
}
}
#这里用if判断,用rewrite跳转,后面的地址是我从百度搜来的图片
#哈哈,等我盗了别人的图片,给了第三个人用
[root@localhost html]# systemctl restart nginx 重启
~* .(jpglgif|swf)$ : 这段正则表达式表示匹配不区分大小写,以.jpg或.gif或.swf结尾的图片格式
接下来我们清除浏览器缓存重新打开www.52.xit.top,图片实现跳转了!!
FPM 参数优化
ginx的PHP解析功能实现如果是交由FPM处理的,为了提高 PHP的处理速度,可
对FPM模块进行参数的调整。
下面是执行步骤:
1)安装带 FPM 模块的 PHP环境,保证 PHP可以正常运行。
2) FPM进程有两种启动方式,由pm 参数指定,分别是 static和dynamic,前者将产
生固定数据的fpm进程,后者将以动态的方式产生fpm进程。
Static的方式可以使用pm.max_children 指定启动的进程数量。Dynamic方式的参数要
根据服务器的内存与服务负载进行调整,
选项 描述
Pm.max children 指定启动的进程数量最大的数量
Pm.start.servers 动态方式下初始的ftpm进程数量
Pm.min_spare_servers 动态方式下最小的fpm空闲进程数
Pm_max_spare_servers 动态方式下最大的空闲进程数
假设:现有云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近
1G,处理比较慢,对参数进行优化处理。
[root@localhost html]# cd /usr/local/php/etc/php-fpm.d
[root@localhost html]# vi www.conf
pm=dynamic
pm.max_children=20
pm.start_servers=5
pm.min_spare_servers=2
pm.max_spare_servers=8
#FPM启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多可以有20个
进程存在