Web服务器群集——Nginx企业级优化
Posted Pakho`
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web服务器群集——Nginx企业级优化相关的知识,希望对你有一定的参考价值。
Nginx企业级优化
nginx.x86_64 1:1.16.1-3.el7
[root@pakho ~]# yum -y install nginx #下载nginx
[root@pakho ~]# systemctl enable nginx --now #设置开机自启同时立即启动
隐藏版本号
- 在生产环境中,需要隐藏Nginx的版本号,以避免泄露Nginx的版本,使攻击者不能针对特定版本进行攻击
- 可以使用Fiddler工具抓取数据包,查看Nginx版本
- 也可以在CentOS中使用命令curl -I http://192.168.100.10/查看
[root@pakho ~]# curl -I http://192.168.100.10
HTTP/1.1 200 OK
Server: nginx/1.16.1
- 隐藏版本号有两种方式,第一种修改Nginx源码文件,指定不显示版本,第二种修改Nginx配置文件
#使用Nginx配置文件方式
[root@pakho ~]# vim /etc/nginx/nginx.conf
#在http{}里面添加
server_tokens off; #关闭版本号
...
[root@pakho ~]# systemctl restart nginx #重启Nginx
#本地测试
[root@pakho ~]# curl -I http://192.168.100.10
HTTP/1.1 200 OK
Server: nginx
...
通过浏览器查看发现版本号已经隐藏
修改用户和组
- Nginx运行时进程需要有用户和组的支持,用以实现对网站文件读取时进行访问控制
- 主进程由root进程创建,子进程由指定的用户和组创建
- Nginx默认使用nobody用户账户与组账户,一般也要进行修改(针对编译安装)
- 修改Nginx用户与组有两种方法,一种编译安装时指定用户和组,另一种修改配置文件指定用户和组
# 编译时设置
--user=nginx
--group=nginx
#修改配置文件
[root@pakho ~]# vim /etc/nginx/nginx.conf
user nginx nginx; #修改用户为nginx,组为nginx
[root@pakho ~]# systemctl restart nginx #重启Nginx
- 重启Nginx查看进程运行状态,主进程由root创建,子进程由nginx创建
配置网页缓存时间
- 当Nginx将网页数据返回给客户端时,可设置缓存的时间,以方便日后进行相同内容的请求时直接返回,避免重复请求,加快访问速度
- 一般只针对静态资源进行设置,动态网页一般不用设置缓存时间
[root@pakho ~]# vim /usr/share/nginx/html/index.html #默认配置文件中加入图片
<img src="1.jpg"/>
#修改主配置文件
[root@pakho ~]# vim /etc/nginx/nginx.conf
#在location段加入expires参数
location / {
root html;
index index.html index.htm;
}
location ~ \\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location
root html;
expires 1d; #指定缓存时间为1天
}
...
[root@pakho ~]# systemctl restart nginx
- 其中的Cache-Control:max-age=864000表示缓存864000秒,也就是缓存10天,10天之内浏览器访问这个页面,都使用缓存中的数据,不需要向Nginx重新发送请求,减少服务器使用频率
日志切割
- 随着Nginx运行时间的增加,产生的日志也会增加,为了方便掌握Nginx的运行状态,需要时刻关注Nginx日志文件,太大的日志文件对监控是个大灾难,非常不便于分析排查,因此需要定期地进行日志文件的切割
- Nginx没有类似Apache的cronlog日志分割处理功能,但可以通过Nginx的信号控制功能脚本来实现日志的自动切割,并将脚本加入Linux的计划任务中,让脚本在每天固定的时间执行,便可实现日志切割功能
针对编译安装Nginx位于/usr/local/nginx下的日志切割脚本
[root@pakho ~]# vim fenge.sh
#!/bin/bash
#Filename:fenge.sh
#by Pakho 2021-6-15
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 #移动并重命名日志文件
kill -USR1 $(cat $pid_path) #通过kill信号重启nginx产生新日志
find $logs_path -mtime +30 | xargs rm -rf #删除30天前的日志文件
#设置crontab任务,定期执行脚本进行日志分割
[root@pakho ~]# crontab -e
30 1 * * * /bin/bash /root/fenge.sh #每天凌晨1:30执行脚本进行日志分割
#设置定时任务开机自动并重启
[root@pakho ~]# systemctl restart crond
[root@pakho ~]# systemctl enable crond
设置连接超时
- 在企业网站中,为了避免一个客户长时间占用连接,造成资源浪费,可设置相应超时参数,实现对连接访问时间的控制
- Keepalive_timeout :设置连接保持超时时间,一般可只设置该参数,默认为75秒,可根据网站的情况设置,或者关闭
- Client_header_timeout :指定等待客户端发送请求头的超时时间
- Client_body_timeout :设置请求体读超时时间
[root@pakho ~]# vim /etc/nginx/nginx.conf
#http{} server{} 或 location{}
...
keepalive_timeout 65 180; #连接保持超时时间,65为服务端超时时间,180为客户端超时时间,单位秒
client_header_timeout 80; #等待客户端发送请求头的超时时间
client_body_timeout 80; #请求体读超时时间
...
更改进程数
- 在高并发环境中,需要启动更多的Nginx进程以保证快速响应,用以处理用户的请求,避免造成堵塞
- 使用ps aux命令查看Nginx运行进程个数
[root@pakho ~]# ps aux | grep nginx
- 其中master process是Nginx的主进程,开启了一个,worker process是子进程,也开启了一个
- 修改Nginx配置文件中的worker_processes参数,一般设为CPU的个数或核数,在高并发的情况下设置为CPU的个数或者核数的两倍,可以查看CPU的核数以确定参数
[root@pakho ~]# cat /proc/cpuinfo | grep -c "physical"
2
[root@pakho ~]# vim /etc/nginx/nginx.conf #修改主配置文件
worker_processes 4; #开启4个进程
...
[root@pakho ~]# systemctl restart nginx
- 开启了1个主进程4个子进程,可见参数起了作用
- 默认情况下,Nginx的多个进程可能更多地跑在一颗CPU上,可以分配不同的进程给不同的CPU处理,以充分利用硬件多核CPU,在一台4核CPU服务器上,设置每个进程分别由不同的CPU核心处理,以达到CPU性能最大化
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
配置网页压缩
- Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,
- 运行Nginx服务器将输出内容发送到客户端之前的压缩,以节约网站的带宽,提升用户访问体验,
- 默认Nginx已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可
压缩功能参数
- gzip on:开启gzip压缩输出
- gzip_min_length 1k:用于设置允许压缩的页面最小字节数
- gzip_buffers 4 16k:表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
- gzip_http_version 1.1:用于设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,但处理最慢,也比较消耗服务器CPU资源
- gzip_comp_level 2:用来指定gzip压缩比,压缩比1最小,处理速度最快;压缩比9最大,传输速度快,但处理速度最慢,使用默认即可
- gzip_types text/plain:压缩类型,是就对哪些网页文档启用压缩功能
- gzip_vary on:选项可以让前端的缓存服务器缓存经过gzip压缩的页面
[root@pakho ~]# vim /etc/nginx/nginx.conf
#http{}
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;
...
[root@pakho ~]# systemctl restart nginx
配置防盗链
- 在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免不必要的浪费,Nginx的防盗链功能非常强大,在默认情况下,只需进行简单的配置即可实现防盗链功能
IP地址 | 用途 |
---|---|
192.168.100.10 | 源主机 |
192.168.100.80 | 盗链主机 |
[root@daolian ~]# yum -y install httpd #盗链主机安装Apache
[root@daolian ~]# systemctl enable httpd --now #设置开机自启及立即启动
[root@daolian ~]# vim /var/www/html/index.html
# 盗链主机设置盗链图片
<img src="http://192.168.100.10/1.jpg"/>
#查看被盗主机日志 192.168.100.10
[root@pakho ~]# cat /var/log/nginx/access.log
192.168.100.1 - - [16/Jun/2021:00:02:34 +0800] "GET /1.jpg HTTP/1.1" 200 165061 "http://192.168.100.80/"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0" "-"
#配置防盗链
[root@pakho ~]# vim /etc/nginx/nginx.conf
location ~ \\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers 192.168.100.10;
if ($invalid_referer) {
return 403;
}
}
图片已无法正常显示,防盗链成功!
参数说明
- valid_referers:设置信任的网站,即能引用相应图片的网站
- blocked:referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或者https://开头后面的网址或者域名:referer中包含相关字符串的网址
- if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面
FPM参数优化
详解参考我另一篇文章
以上是关于Web服务器群集——Nginx企业级优化的主要内容,如果未能解决你的问题,请参考以下文章