目录
前言:
在企业信息化应用环境中。服务器的安全性和响应速度需要根据实际的情况进行相应的参数
配置,达到最优的用户体验。
默认的nginx安装参数只能提供最基本的服务,还需要调整如网页时间、连接超时、网页压缩
等相应参数,才能发挥服务器的最大作用。
一、隐藏版本号
在生产环境中,需要隐藏Ng的版本号,使攻击者不能针对特定版本进行攻击,以免安全漏洞
的泄露。隐藏Ng的版本号有两种方式:第一种是修改nginx源码文件,指定不显示版本号;第二种
1、修改nginx源码文件
初始源码文件配置文件如下:
我们将nginx源码文件修改如下:
[root@kaka ~]# vim /opt/nginx-1.12.2/src/core/nginx.h
……
#define nginx_version 1012002
#define NGINX_VERSION "11.12.112" #修改版本号
#define NGINX_VER "buibui/" NGINX_VERSION #修改服务器类型
……
[root@kaka ~]# cd /opt/nginx-1.12.2/ # /opt/nginx-1.12.2/目录下,重新编译安装
[root@kaka nginx-1.12.2]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_stub_status_module
……
[root@kaka nginx-1.12.2]# make && make install
[root@kaka nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf #修改配置文件如下
……
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; #开启版本
……
[root@kaka nginx-1.12.2]# nginx -t #保存并退出上述配置文件,并检查语法
[root@kaka nginx-1.12.2]# systemctl restart nginx #重启nginx
结果验证如下:
[root@kaka nginx-1.12.2]# curl -I http://193.168.100.128
HTTP/1.1 200 OK
Server: buibui/11.12.112 #可以看到服务名称版本号都变了
Date: Tue, 12 Oct 2021 11:43:07 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 24
Last-Modified: Fri, 08 Oct 2021 10:54:44 GMT
Connection: keep-alive
ETag: "61602374-18"
Accept-Ranges: bytes
[root@kaka nginx-1.12.2]#
也可以在网页登陆验证:
2、修改nginx的主配置文件
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #添加,关闭版本号选项
......
[root@kaka ~]# nginx -t
[root@kaka ~]# systemctl restart nginx
[root@kaka nginx-1.12.2]# curl -I http://193.168.100.128
HTTP/1.1 200 OK
Server: nginx #可以看到版本号已隐藏,但是软件名还是显示的
二、修改用户与组
Nginx 运行时进程需要有用户与组的支持,用以实现对网站文件读取时进行访问控制。主进程
由 root 创建,子进程由指定的用户与组创建。Nginx 默认使用 nobody 用户账号与组账号,一般需
要进行修改。
修改 Nginx 用户和组有两种方法:
1.编译安装时指定用户和组
[root@kaka ~]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
2.修改配置文件指定用户和组
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
#user nobody; #第一行去掉注释,修改用户为 nginx ,组为 nginx
worker_processes 1;
……
[root@kaka ~]# systemctl restart nginx.service
[root@kaka ~]# ps aux |grep nginx
root 24339 0.0 0.0 20540 616 ? Ss 08:52 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 24340 0.0 0.0 23068 1392 ? S 08:52 0:00 nginx: worker process
root 24344 0.0 0.0 112724 988 pts/2 S+ 08:52 0:00 grep --color=auto nginx
[root@kaka ~]# 主进程由root创建,子进程由nginx创建
三、配置网页缓存时间
当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求
时直接返回,避免重复请求,加快了访问速度,一般针对静态网页设置,对动态网页不设置缓存时
间;因为动态页面是一直交互的状态,若是设置动态页面缓存时间会一直占用网页的缓存空间。
配置如下:
###修改配置文件
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
……
http {
……
server {
……
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
#加入新的location,以图片>作为缓存对象
root html; expires 1d; #指定缓存时间为1天
}
}
}
#新的 location 段加入 expires 参数,指定缓存的时间,1d表示一天(若设置1.5天可指定为1d12h)
###上传图片到 html 目录中、修改站点文件
[root@kaka conf]# cd /usr/local/nginx/html/ #将图片托至xshell此目录下
[root@kaka html]# ls
50x.html index.html
[root@kaka html]# rz -E
rz waiting to receive.
[root@kaka html]# ls
50x.html dog.jpg index.html wan.jpg 卓.jpg
[root@kaka html]# vim index.html
……
<body>
<h1>Welcome to nginx!</h1>
<img src="卓.jpg"/> #添加此行,识别图片名
……
:wq
结果验证如下:
四、日志切割
随着 Nginx 服务运行时间的增加,它的日志也会增加,为了能够方便知道 Nginx 的运行状
态,需要时刻关注 Nginx 日志文件。过大的日志文件不利于日常监控和分析排查,因此需要定期的
对日志文件进行切割。Nginx 没有类似 Apache 的 cronlog 日志分割处理功能,但可以通过 Nginx
的信号控制功能脚本来实现日志的自动切割,并将脚本加入到 Linux 的计划任务中,通过Linux的
计划任务周期性地进行日志切割。
#!/bin/bash
#日志分割脚本
#设置时间变量,-d表示设置,-1 day表示前一天
d=$(date -d "-1 day" "+%Y%m%d")
#定义日志保存路径变量
logs_path="/var/log/nginx"
#定义nginx服务pid号
pid_path="/usr/local/nginx/logs/nginx.pid"
#判断是否有日志文件的目录,没有就创建
[ -d $logs_path ] || mkdir -p $logs_path
#移动访问日志到log_path,并重命名test.com;脚本执行后创建日志进行命令,用时间戳的方式来>标记唯一性
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d
#重载然后生成新的access日志
kill -HUP $(cat $pid_path)
#查找并删除30天前的日志
find $logs_path -mtime +30 | xargs rm -rf
:wq
结果验证如下:
[root@kaka home]# chmod +x /home/fengge1.sh
[root@kaka home]# bash fengge1.sh
[root@kaka home]# ls /var/log/nginx/
test.com-access.log-20211012 #成功按日期进行了日志分割
[root@kaka home]# date -s 20211201 # 修改系统时间进行测试
2021年 12月 01日 星期三 00:00:00 CST
[root@kaka home]# bash fengge1.sh
[root@kaka home]# ls /var/log/nginx/
test.com-access.log-20210930
[root@kaka home]# ntpdate ntp1.aliyun.com #测试完记得同步系统时间
设置周期性任务,设置 crontab 任务,定期执行脚本自动进行日志分割
[root@kaka ~]# crontab -e
0 1 * * * /home/fengge1.sh #添加运行脚本任务,每天凌晨1点,执行脚本分割
[root@kaka ~]# crontab -l #查看计划任务
五、设置连接超时
为避免同一客户端长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连
接访问时间。
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
……
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #设置连接保持超时时间
client_header_timeout 80; #等待客户端发送请求头的超时时间,超时会发送408错误
client_body_timeout 80; #等待客户端发送请求体的超时时间
……
#添加配置即可
[root@kaka ~]# nginx -t #记得进行语言检测
keepalive_timeout
指定KeepAlive的超时时间(timeout),指定每个TCP连接最多可以保持多长时间,服务器将
会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定
为 60 秒。若将它设置为0,就禁止了keepalive 连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一
些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-
Alive 响应头。
client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有
发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。
client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没
有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)
六、更改进程数
在高并发环境中,需要启动更多的 Nginx 进程以保证快速响应,用以处理用户的请求,避免
造成阻塞。
[root@kaka ~]# ps -aux | grep nginx #查看 Nginx 运行的进程
[root@kaka ~]# cat /proc/cpuinfo |grep -c "physical" #查看 CPU 的核数来确定参数
8
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx;
worker_processes 3; #这里参数设置为3。
worker_cpu_affinity 001 010 100
#001表示启用第一个CPU内核,010表示启用第二个CPU内核,以此类推
:wq
[root@kaka ~]# systemctl restart nginx.service
[root@kaka ~]# ps aux |grep nginx
root 26211 0.0 0.0 20544 616 ? Ss 11:26 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 26212 0.0 0.0 23072 1392 ? S 11:26 0:00 nginx: worker process
nginx 26213 0.0 0.0 23072 1392 ? S 11:26 0:00 nginx: worker process
nginx 26214 0.0 0.0 23072 1392 ? S 11:26 0:00 nginx: worker process
root 26217 0.0 0.0 112724 984 pts/2 S+ 11:26 0:00 grep --color=auto nginx
[root@kaka ~]# # master process表示主进程,这里开启了1个主进程和4个子进程,可以看到配置成功的。
master process表示主进程,它的运行进程数设置多一些,响应客户端访问请求时,Nginx 就
不会临时启动新的进程提供服务,减少了系统的开销,提升了服务的速度。worker_processer 参
数,一般设为 CPU的个数或核数,在高并发的情况下可以设置为 CPU的个数或者核数的 2 倍,可
以先查看 CPU 的核数以确定参数。
默认情况下,Ngix的多个进程可能更多地跑在一颗CPU上,可以分配不同的进程给不同的
CPU处理,以充分利用硬件多核多CPU。在一台4核CPU服务器上,设置每个进程分别由不同的
CPU核心处理,以达到CPU的性能最大化。
注意进程与cpu的配置:
1)、worker_ processes 2; #修改与CPU核数相同或2倍(cgroup)
worker_ cpu_ affinity 01 10;
#设置每个进程由不同的cpu处理、进程数配为2时,为0001 0010 0100 1000
01表示启用第- -个CPU内核,10表示启用第二个CPU内核
worker cpu affinity. 0110;表示开启两个进程,第- -个进程对应着第- -个CP u内核,第二个进程对应着第二个CPU内核。
2)、###2核cpu,开启4个进程
worker processes 4;
worker cpu affinity 01 10 01 10;
ps:开启了四个进程,它们分别对应着开启2个CPU内核
3)、###4个cpu,开启4个进程
worker processes 4;
worker cpu affinity 0001 0010 0100 1000;
Ps:0001表示启用第---个CPU内核,0010表示启用第二个CPU内核,依此类推。
七、网页压缩
Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,允许 Nginx 服务器
将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验。默认 Nginx 已
安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
####压缩功能配置及介绍
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......
gzip on; #取消注释,开启gzip压缩功能
gzip_min_length 1k; #用于设置最小压缩文件大小
gzip_buffers 4 16k;
#表示申请4个单位为16KB的内存作为压缩缓冲区,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1;
#用于识别http协议版本,默认是1.1,目前大部分浏览器已支持gzip压缩,但处理很慢,也比较消耗CPU资源
gzip_comp_level 6;
#压缩比率,用来指定gzip压缩比,压缩比1最小,处理速度最快;压缩比为9最大,传输速度快,但处理速度最慢,使用默认即可
gzip_vary on;
#该选项可以让前端的缓存服务器缓存经过gzip压缩的页面
gzip_types text/plain application/x-javascript text/css image/jpg image/jpeg image/png image/gif application/xml text/javascript application/x-httpd-php application/javascript application/json;
#压缩类型,表示哪些网页文档启用压缩功能
......
}
[root@kaka html]# systemctl restart nginx.service
验证结果如下:
八、盗链与防盗链
原服务端:192.168.100.130 域名:www.abc.com
盗链服务器:192.168.100.128 域名:www.dao.com
1、盗链配置
#################服务端配置
[root@kaka ~]# vim /etc/hosts
192.168.100.130 www.abc.com
[root@kaka ~]# vim /usr/local/nginx/html/index.html
……
<img src="dog.jpg"/>
……
:wq
#################盗链端配置
[root@kl ~]# vim /etc/hosts
192.168.100.130 www.abc.com
192.168.100.128 www.dao.com
[root@kl ~]# vim /usr/local/nginx/html/index.html
……
<img src="http://www.test1.com/dog.jpg">
……
:wq
测试结果如下:
2、防盗链配置
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损
失,也避免不必要的贷款浪费。
#################服务端配置
[root@server html]# ls
50x.html dog.jpg error.png index.html wan.jpg
[root@kaka ~]# vim /usr/local/nginx/html/index.html
[root@kaka ~]# vim /etc/hosts
192.168.100.130 www.abc.com
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
……
location ~*\.(gif|jpg|swf)$ {
valid_referers *.test1.com test1.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.test1.com/error.png;
}
}
……
:wq
#################盗链端配置,这里盗链配置跟上面一样
[root@kl ~]# vim /usr/local/nginx/html/index.html
[root@kl ~]# vim /etc/hosts
193.168.100.128 www.test1.com
[root@kl ~]# vim /usr/local/nginx/html/index.html
……
<img src="http://www.test1.com/wan.jpg">
:wq
测试结果如下:
九、FPM 参数优化
Nginx 的 PHP 解析功能实现如果是交由 FPM 处理的,为了提供 PHP 的处理速度,可对 FPM 模块进行参数的调整。
①、首先安装带 FPM 模块的 PHP 环境,保证 PHP 可以正常运行。
②、FPM 进程有两种启动方式,由 pm 参数指定,分别是 static 和 dynamic,前者将产生固定数
据的 fpm 进程,后者将以动态的方式产生 fpm 进程。
static 方式可以使用 pm.max_children 指定启动的进程数量。dynamic 方式的参数则要根据服
务器的内存与服务负载进行调整,参数下所示
dynamic参数 | |
选项 | 说明 |
pm.max_children | 指定启动的进程的最大的数量 |
pm.start_servers | 动态方式下初始的 ftpm 进程数量 |
pm.min_spare_servers | 动态方式下最小的 fpm 空闲进程数 |
pm.max_spare_servers | 动态方式下最大的 fpm 空闲进程数 |
cd /usr/ local/php/etc/
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
pid = run/php-fpm.pid
vim /usr/local/php/etc/php-fpm.d/ www .conf
#96行
pm = dynamic #fpm进程启动方式,动态的
#107行
pm.max_children=20 #fpm进程启动的最大进程数
#112行
pm.start_servers = 5 #动态方式下启动时默认开启的进程数,在最小和最大之间
#117行
pm.min_spare_servers = 2 #动态方式下最小空闲进程数
#122行
pm. max_spare_servers = 8 #动态方式下最大空闲进程数
#启动php-fpm,不可用于重启
/usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini
#执行第一个命令后,就可以使用下面这条命令查看pid号重启php-fpm
kill -USR2 `cat /usr/ local/php/var/run/php-fpm.pid`
netstat -anpt l grep 9000
总结
Nginx 服务优化包括隐藏版本号、更改用户与组、配置网页缓存时间、日志切割、设置连接超时。
深入优化包括更改进程数、配置网页压缩、配置防盗链和FPM参数优化。
Nginx 配置文件组成:global 全局模块配置;http { } 模块配置;server 模块;location 匹配 URL
和路径。