Web服务器群集——Nginx企业级优化

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 命令检测

通过浏览器查看发现版本号已经隐藏
Web服务器群集——Nginx企业级优化

修改nginx用户及组

  • Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制
  • Nginx默认使用nobody用户账号与组账号,一般也要进行修改
  • 修改的方法
    • 编译安装时指定用户与组
      修改配置文件指定用户与组
# 编译时设置
--user=nginx
--group=nginx

# 修改配置文件
# 原本是 #user  nobody; 改成
user nginx nginx;

Web服务器群集——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"/>

打开浏览器查看
Web服务器群集——Nginx企业级优化

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下有了新分割的日志
Web服务器群集——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页面

浏览器清除缓存 然后再次访问
Web服务器群集——Nginx企业级优化图片已经不能显示了

防盗链成功

对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空闭进程数
  • 动态方式因为会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或者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个进程
上一篇:压缩和解压缩命令


下一篇:nginx优化:配置gzip压缩页面提高访问速度(nginx1.18.0)