Nginx企业级优化
Nginx企业级优化
配置Nginx隐藏版本号
在生产环境中,需要隐藏Nginx的版本号,以避免安全漏洞的泄漏
查看方法
- 使用fiddler工具在Windows客户端查看Nginx版本号
- 在CentOS系统中使用“curl -I 网址”命令查看
- Nginx隐藏版本号的方法
- 修改配置文件法
修改源码法
- 修改配置文件法
# 主配置文件
[root@lnmp conf]# vim nginx.conf
在http{}里面添加
server_tokens off;
# 打开浏览器测试 F12
Server: nginx
# 也可以在本地测试 curl -I
[root@lnmp conf]# curl -I http://192.168.188.188/
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 24 Mar 2021 02:04:03 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.38
# 修改源码实现隐藏版本号 (可选)
[root@lnmp nginx]# vim /root/nginx-1.14.2/src/core/nginx.h
#define NGINX_VERSION “1.1.1”,修改版本号为1.1.1
#define NGINX_VER “IIS/”,修改软件类型为IIS
# 重新编译安装,隐藏版本信息
# 重启服务,访问网站使用curl -I 命令检测
通过浏览器查看发现版本号已经隐藏
修改nginx用户及组
- Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制
- Nginx默认使用nobody用户账号与组账号,一般也要进行修改
- 修改的方法
- 编译安装时指定用户与组
修改配置文件指定用户与组
- 编译安装时指定用户与组
# 编译时设置
--user=nginx
--group=nginx
# 修改配置文件
# 原本是 #user nobody; 改成
user nginx nginx;
设置网页缓存时间
- 当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度
- 一般针对静态网页设置,对动态网页不设置缓存时间
- 可在Windows客户端中使用fiddler查看网页缓存时间
# 修改主配置文件 在location段加入expires 参数
location ~ \.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ \.(js|css)$
{
expires 1h;
}
# 写入测试页面
# 在index.html里面添加图片
<img src="./mao.jpg"/>
打开浏览器查看
Nginx的日志切割
-
随着Nginx运行时间增加,日志也会增加。为了方便掌握Nginx运行状态,需要时刻关注Nginx日志文件
太大的日志文件对监控是一个大灾难 -
定期进行日志文件的切割
-
Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割,并通过Linux的计划任务周期性地进行日志切割
# 编写脚本进行日志切割
# vim fenge.sh
#!/bin/bash
# nginx日志分割脚本 by stanZ 2021-3-24
d=$(date -d "-1 day" "+%Y%m%d") # 昨天的日期
logs_path="/var/log/nginx" # 分割后的日志存放文件路径
pid_path="/usr/local/nginx/logs/nginx.pid" # nginx的pid文件路径
[ -d $logs_path ] || mkdir -p $logs_path # 判断存放路径是否存在 如果不存在则创建
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d # 将nginx产生的日志 重命名后移动到我们新的存放路径
# 用kill -USR1创建新日志文件/usr/local/nginx/logs/access.log
kill -USR1 $(cat $pid_path) # 通过kill信号 重启nginx 产生新的当日文件
find $logs_path -mtime +30 |xargs rm -rf # find超过30天的日志 将其全部删除
# 将脚本放入任务计划
[root@lnmp shell]# crontab -e
1 0 * * * /bin/bash /root/shell/fenge.sh # 每日凌晨第1分钟时候执行
# 将系统任务重启并开机启动
[root@lnmp shell]# systemctl restart crond
[root@lnmp shell]# systemctl enable crond
执行脚本之后 /var/logs/nginx下有了新分割的日志
配置Nginx实现连接超时
在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
超时参数讲解
- Keepalive_timeout
- 设置连接保持超时时间,一般可只设置该参数,默认为75秒,可根据网站的情况设置,或者关闭,可在http段、server段、或者location段设置
- Client_header_timeout
- 指定等待客户端发送请求头的超时时间
- Client_body_timeout
- 设置请求体读超时时间
keepalive_timeout 65 180; //连接保持超时时间,65为服务端超时时间,180为客户端超时时间,单位秒
client_header_timeout 80; //等待客户端发送请求头部的超时时间
client_body_timeout 80; //请求体读超时时间
更改Nginx运行进程数
在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞
可以使用ps aux命令查看Nginx运行进程的个数
- worker_processes:设置进程数,一般设为CPU的个数或者核数,在高并发的情况下可设置为CPU个数或者核数的2倍
- 查看CPU核数:cat /proc/cpuinfo | grep -c physical
- 默认情况下,nginx的多个进程可能更多的跑在一个CPU上,通过设置worker_cpu_affinity 0001 0010 0011 0100使每个进程分别由不同CPU核心处理(双核:0101 1010;)
# 查看服务器cpu核数
[root@lnmp conf]# cat /proc/cpuinfo |grep -c physical
8
# 修改主配置文件
[root@lnmp conf]# vim nginx.conf
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
# 开启了四个进程,它们分别对应着开启2个CPU内核
# 测试 没重启之前
[root@lnmp conf]# ps aux |grep nginx
root 1653 0.0 0.0 20548 704 ? Ss 22:37 0:00 nginx: master process /usr/local/sbin/nginx
nginx 1655 0.0 0.0 22224 2740 ? S 22:37 0:00 nginx: worker process
nginx 1656 0.0 0.0 22224 2484 ? S 22:37 0:00 nginx: worker process
# 重启后
[root@lnmp conf]# ps aux |grep nginx
root 1771 0.0 0.0 20548 704 ? Ss 23:03 0:00 nginx: master process /usr/local/sbin/nginx
nginx 1773 0.0 0.0 22224 2488 ? S 23:03 0:00 nginx: worker process
nginx 1774 0.0 0.0 22224 2488 ? S 23:03 0:00 nginx: worker process
nginx 1775 0.0 0.0 22224 2488 ? S 23:03 0:00 nginx: worker process
nginx 1776 0.0 0.0 22224 2488 ? S 23:03 0:00 nginx: worker process
详解
Nginx默认没有开启利用多核CPU,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU。CPU是任务处理,计算最关键的资源,CPU核越多,性能就越好。
配置Nginx多核CPU,worker_cpu_affinity使用方法和范例
1. 2核CPU,开启2个进程
worker_processes 2;
worker_cpu_affinity 01 10;
01表示启用第一个CPU内核,10表示启用第二个CPU内核
worker_cpu_affinity 01 10;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。
2. 2核CPU,开启4个进程
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
开启了四个进程,它们分别对应着开启2个CPU内核
3. 4核CPU,开户4个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
4. 4核CPU,开启2个进程
worker_processes 2;
worker_cpu_affinity 0101 1010;
0101表示开启第一个和第三个内核,1010表示开启第二个和第四个内核
2个进程对应着四个内核
worker_cpu_affinity配置是写在/etc/nginx/nginx.conf里面的。
2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
5. 8核CPU,开户8个进程
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
配置完毕后,重启nginx ,执行/etc/init.d/nginx restart
配置Nginx实现网页压缩功能
Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
可在配置文件中加入相应的压缩功能参数对压缩性能进行优化
压缩模块:ngx_http_gzip_module,默认已安装
压缩功能参数讲解
- 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压缩的页面
# 修改主配置文件
在http{}里面添加
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain;
gzip_vary on;
# 打开网页测试
配置Nginx实现防盗链
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失
Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理
IP地址 | 域名 |
---|---|
192.168.188.188 | 源主机 |
192.168.188.132 | 盗链主机 |
# 盗链主机设置盗链图片
<img src="http://192.168.188.188/mao.jpg">
# 查看源主机日志
# 发现 192.168.188.132 盗链图片
192.168.188.1 - - [23/Mar/2021:23:24:29 -0400] "GET /mao.jpg HTTP/1.1" 200 136764 "http://192.168.188.132/" "M
ozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"
# 配置防盗链
# 在对应的server{}里面设置
location ~ \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers 192.168.188.188;
if ($invalid_referer) {
return 403;
}
}
# 配置说明
# valid_referers:设置信任的网站,即能引用相应图片的网站
# none:浏览器中referer为空的情况,就是直接在浏览器访问图片
# blocked:referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或者https://开头后面的网址或者域名:referer中包含相关字符串的网址
# if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面
浏览器清除缓存 然后再次访问
图片已经不能显示了
防盗链成功
对FPM模块进行参数优化
-
Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整
-
FPM模块参数调整,要根据服务器的内存与服务负载进行调整
-
启动fpm进程方式 有两种
- static:将产生固定数量的fpm进程 static使用pm.max_children指定启动进程数
- dynamic:将以动态的方式产生fpm进程 dynamic根据服务器内存与服务负载进行调整
- 通过pm参数指定
-
FPM优化参数讲解
-
Static的方式的参数
- pm.max_children:指定启动的进程数量
-
Dynamic方式的参数
- pm.max_children:指定启动的进程数量最大的数量
pm.start_servers:动态方式下初始的fpm进程数量
pm.min_spare_servers:动态方式下最小的fpm空闭进程数
pm.max_spare_servers:动态方式下最大的fpm空闭进程数
- pm.max_children:指定启动的进程数量最大的数量
-
动态方式因为会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据 内存/20M 得到。(比如说512M,建议pm.max_spare_servers设置为20(512*0.8/20)。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。)
-
对于比较大内存的服务器来说,设置为静态的话会提高效率。(比如说2GB内存的服务器,可以设置为50;4GB内存可以设置为100等。)
本机实例
# 编辑php-fpm配置文件
[root@lnmp logs]# cd /usr/local/php5/etc
[root@lnmp etc]# vim php-fpm.conf
# 我的主机内存4g 因此这样配置
pm = dynamic # 动态模式
pm.max_children = 40 # 最多40个进程
pm.start_servers = 10 # php-fpm启动时候有10个进程
m.min_spare_servers = 5 # 最小空闲5个进程
pm.max_spare_servers = 10 # 最大空闲10个进程