文章目录
引言
默认Nginx只提供最基础的服务,在工作中我们还要去不断地优化才能发挥它的最大作用,下面这篇文章会写出一些Nginx的优化参数。
一、Nginx优化
1.隐藏版本号
- 在生产环境中,需要隐藏 Nginx 的版本号,以避免泄露 Nginx 的版本,使攻击者不能针对特定版本进行攻击。
(1).查看版本号方式
① nginx -v
[root@localhost ~]# nginx -v
nginx version: nginx/1.12.2
② curl -I
[root@localhost ~]# curl -I 192.168.74.131
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Tue, 12 Oct 2021 06:22:24 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 11 Oct 2021 15:46:58 GMT
Connection: keep-alive
ETag: "61645c72-264"
Accept-Ranges: bytes
(2)隐藏方法
- 隐藏Nginx版本号的方法有2种,第一种是修改Nginx源码文件,指定不显示版本号,第二种是修改Nginx的主配置文件。
方法一:修改配置文件方式
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #添加此行内容,关闭版本号的显示
......
}
systemctl restart nginx #重启服务
curl -I 192.168.74.131 #再次查看
方法二:修改源码文件,重新编译安装
vim /opt/nginx-1.12.2/src/core/nginx.h
##修改版本号和名称,可伪装成其他服务
#define NGINX_VERSION "1.1.1" #修改版本号
#define NGINX_VER "IIS" NGINX_VERSION #修改服务器类型
#重新编译
cd /opt/nginx-1.12.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
make && make install
vim /usr/local/nginx/conf/nginx.conf #这时把上一个做的配置改回来
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; #off改为on
......
}
systemctl restart nginx #重启服务
curl -I 192.168.74.131 #再次查看
2.修改用户与组
Nginx运行时需要有用户和组的支持,以实现对网站文件读取时进行访问控制。
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; #修改用户为 nginx ,组为 nginx
systemctl restart nginx
ps aux | grep nginx #主进程由root创建,子进程由nginx创建
3.缓存时间
当Nginx将网页数据返回给客户端后,可以设置缓存时间,以方便日后进行相同请求时可以直接返回,避免重复请求,以此加快访问的速度。这一般只针对静态资源进行设置,对动态网页不用设置缓存时间。
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
......
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的 location,以图片作为缓存对象
root html;
expires 1d; #指定缓存时间,1天
}
......
}
}
systemctl restart nginx
4.日志切割
- 随着Nginx 服务运行时间的增加,它的日志也会增加,而运维人员为了能够方便知道 Nginx 的运行状态,需要时刻关注 Nginx 日志文件。累计过多的日志文件会使日常监控和分析排查变得更加困难,因此需要定期的对日志文件进行切割。
- Nginx 没有类似 Apache 的 cronlog 日志分割处理功能,但可以通过 Nginx 的信号控制功能脚本来实现日志的自动切割,并将脚本加入到 Linux 的计划任务中,让脚本在每天固定时间点执行,即可执行日志切割功能。
vim /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}/kgc.com-access.log-$d
#移动至/var/log/nginx 并重命名日志文件
kill -USR1 $(cat $pid_path) #重建新日志文件
find $logs_path -mtime +30 |xargs rm -rf #删除30天之前的日志文件
- 执行脚本,测试日志文件是否被切割
[root@localhost /opt]#chmod +x fenge.sh #给权限
[root@localhost /opt]#sh rzfg.sh #执行脚本
[root@localhost /opt]#cd /var/log/nginx/
[root@localhost /var/log/nginx]#ls
test.com-access.log-20211006 #按日期分割了日志文件
-设置 crontab 周期性任务,定期执行脚本自动进行日志分割
crontab -e
0 1 * * * /opt/fenge.sh #每天凌晨1点执行脚本,进行日志分割
在linux操作系统中,每个文件都有很多的时间参数,其中有三个比较主要,分别是ctime,atime,mtime
ctime(status time):
只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间
atime(accesstime):
当使用这个文件的时候就会更新这个时间
mtime(modification time):
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别
5.设置连接超时
- 在企业中,为了避免同一个客户长时间占用连接,造成资源的浪费,可以设置相应的连接超时参数,用来实现对连接访问时间的控制。
- 可以修改配置文件nginx.conf,设置keepalive_timeout超时时间
vim /usr/local/nginx/conf/nginx.conf
http {
......
#keepalive_timeout 0;
keepalive_timeout 65 180; #设置超时时间为65秒
client_header_timeout 80; #指定等待客户端发送请求头的超时时间为80秒
client_body_timeout 80; #设置请求体读超时时间为80秒
......
}
systemctl restart nginx
-
keepalive_timeout
指定KeepAlive的超时时间(timeout)。指定每个客户端连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。若将它设置为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 优化深入
1.更改进程数
- 在高并发环境中,需要启动更多的 Nginx 进程以保证快速响应,用以处理用户的请求,避免造成阻塞。
- 修改 Nginx 配置文件中的 work_processes 参数,一般设为 CPU 的个数或核数,在高并发的情况下可以设置为 CPU 个数或核数的2倍。
[root@localhost ~]# cat /proc/cpuinfo | grep -c "physical" #查看cpu核数
8
[root@localhost ~]# ps aux | grep nginx #查看nginx主进程中包含几个子进程
root 8116 0.0 0.0 20496 600 ? Ss 09:15 0:00 nginx: master process nginx
nginx 8117 0.0 0.0 23024 1636 ? S 09:15 0:00 nginx: worker process
root 20688 0.0 0.0 112676 980 pts/3 S+ 19:25 0:00 grep --color=auto nginx
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 8; #修改为核数相同或者2倍
worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001;
#10000000表示启用第一个CPU内核,01000000表示启用第二个CPU内核,以此类推...
....................
systemctl restart nginx
- 默认情况下,Nginx 的多个进程可能更多地跑在一个 CPU 上,可以分配不同的进程给不同的 CPU 处理,以充分利用硬件多核多 CPU 。
- 在一台 8 核的 CPU 服务器上,设置每个进程分别由不同的 CPU 核心处理,来达到 CPU 的性能最大化。
2.配置网页压缩
- Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能, 允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
- 可在配置文件中加入相应的压缩功能参数对压缩性能进行优化
vim /usr/local/nginx/conf/nginx.conf
http {
......
gzip on; #开启gzip压缩功能
gzip_min_length 1k; #用于设置允许压缩的页面最小字数
gzip_buffers 4 16k; #压缩缓冲区,大小为4个16k缓冲区
gzip_http_version 1.1; #压缩版本(默认1.1)
gzip_comp_level 6; #指定gzip压缩比,1最小,处理速度最快;9最大,传输速度快,但处理速度最慢,使用默认即可
gzip_vary on; #该选项可以让前端的缓存服务器缓存经过gzip压缩的页面
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json; #压缩类型,表示哪些网页文档启用压缩功能
......
}
上传图片
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html index.html
[root@localhost html]# rz -E
rz waiting to receive.
[root@localhost html]# ls
50x.html gy.jpg index.html
#先将gy.jpg文件传到/usr/local/nginx/html目录下
[root@localhost html]# vim index.html
......
<img src="gy.jpg"/> #网页中插入图片
systemctl restart nginx
浏览器中访问网址
3.配置防盗链
- 一般的网站都要配置防盗链,以免网站内容被非法盗用,从而造成损失。
(1)盗链
- 盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
实验环境
IP地址 | 域名 | 用途 |
---|---|---|
192.168.74.131 | www.gy1.com | 源主机 |
192.168.74.128 | www.gy2.com | 盗链主机 |
源主机配置
# 上一步已经配置过图片了
#设置域名和IP映射关系
[root@localhost ~]# vim /etc/hosts
192.168.74.131 www.gy1.com
192.168.74.128 www.gy2.com
盗链主机配置
#设置域名和IP映射关系
[root@localhost ~]# vim /etc/hosts
192.168.74.131 www.gy1.com
192.168.74.128 www.gy2.com
[root@localhost ~]# vim /usr/local/nginx/html/index.html
......
<img src="http://www.gy1.com/gy.jpg"/>
#在盗链端编写盗链页面index.html,盗取源主机的图片
......
在盗链端进行访问,右击查看可以看到成功盗取。
(2)配置防盗链
Nginx的防盗链原理就是加入location项,用一个正则表达式过滤图片类型文件,对于可以信任的网站允许其正常使用对于不信任的网址则返回错误的图片。
[root@localhost html]# rz -E
rz waiting to receive.
[root@localhost html]# ls
50x.html gy.jpg index.html pa.jpeg #传输一个错误图片
[root@localhost html]# vim /usr/local/nginx/html/index.html
location ~* \.(gif|jpg|jepg)$ {
#这段正则表达式表示匹配不区分大小写,以.jpg或.gif或.jepg结尾的文件
valid_referers *.gy.com gy.com;
#设置信任的网站,可以正常使用图片
#后面的网址或域名:referer中包含相关字符串的网页
if ( $invalid_referer ) {
rewrite ^/ http://www.gy1.com/pa.png;
#return 403;
#if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面
}
}
4.fpm参数优化
- Nginx 的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 | 动态方式下最大的 fpm 空闲进程数 |
- 假设有云服务器上,运行了个人论坛,内存为 1.5GB,fpm 进程数为 20,内存消耗近 1GB,处理比较慢,需要对参数进行优化处理:
vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
vim /usr/local/php/etc/php-fpm.d/www.conf
pm = dynamic #将以动态的方式产生fpm进程
pm.max_children=20 #static模式下空闲进程数上限,大于下面的值
pm.start_servers = 5 #动态方式下默认开启的进程数,在最小和最大之间
pm.min_spare_servers = 2 #动态方式下最少空闲进程数
pm.max_spare_servers = 8 #动态方式下最大空闲进程数
#FPM 启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多可以有20个进程存在
#重启 php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
netstat -anpt | grep 9000
总结
- 配置文件组成:global 全局模块配置、http { } 模块配置、server 模块、location 匹配URL 和 路径
- Nginx优点: 轻量级,比apache占用更少的内存及资源 ,支持更多的并发连接,体现更高的效率。nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx擅长处理静态和反向。
- Nginx 服务优化包括:隐藏版本号、更改用户与组、配置网页缓存时间、日志切割、设置连接超时、更改进程数、配置网页压缩、配置防盗链和FPM参数优化。