Nginx优化(网页缓存、防盗链、压缩、隐匿版本、优化进程、动态优化fpm)

(一)隐匿版本号(两种方法)

为什么要隐匿版本号

隐藏Nginx版本号,避免安全漏洞泄漏

Nginx隐藏版本号的方法

第一种是修改 Nginx的主配置文件
第二种是修改Nginx源码文件,指定不显示版本号

[root@localhost ~]# curl -I localhost  ##可以查看版本号等详细信息
HTTP/1.1 200 OK
Server: nginx/1.15.9
……省略部分

第一种:修改配置,隐匿版本

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf     
http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
     server_tokens off;   ###插入这段字,隐匿服务器版本(on为开启,off为关闭)
……省略部分
[root@localhost~]# systemctl restart nginx    ###重启Nginx服务
[root@localhost ~]# curl -I 127.0.0.1  ##再次查看,版本已经被隐匿
HTTP/1.1 200 OK
Server: nginx
……省略部分

第二种:修改Nginx源码文件

Nginx源码文件nginx-1.15.9/src/core/nginx.h中包含了版本信息,可以随意设置,
然后重新编译安装,隐藏版本信息。
[root@localhost core]# vi /opt/nginx-1.15.9/src/core/nginx.h
……省略部分
#define NGINX_VERSION      "1.1"               ##直接修改版本号
#define NGINX_VER          "IIS" NGINX_VERSION   ##直接修改服务器信息
……省略部分
[root@localhost nginx-1.15.9]#
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
[root@localhost nginx-1.15.9]# make && make install
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf  
                      ##我们需要展示修改过的服务器版本信息,因此需要开启展示功能  
http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
        server_tokens on;
……省略部分
[root@localhost nginx-1.15.9]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: IIS1.1
……省略部分

(二)修改用户与组

为什么需要修改用户与组

Nginx运行时进程需要有用户与组的支持,用以实现对网站文件读取时进行访问控制。
主进程由root创建,子进程由指定的用户与组创建。Nginx默认使用nobody 用户帐号与组帐号,一般也要进行修改。

修改Nginx用户与组有两种方法,

一种是在编译安装时指定用户与组
另一种是修改配置文件指定用户与组。

1、编译安装指定用户与组参数

[root@localhost opt]# cd nginx-1.15.9/
[root@localhost nginx-1.15.9]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \   ##指定用户
--group=nginx \    ##指定组账号
--with-http_stub_status_module

2、修改Nginx配置文件的Nginx指定用户与组

[root@localhost conf]# cd /usr/local/nginx/conf/
[root@localhost conf]# vi nginx.conf
……省略部分
user nginx nginx;    ###修改用户为nginx,组为nginx (#user nobody;原本是指定nobody)
……省略部分
[root@localhost conf]# ps aux |grep nginx
root      14477  0.0  0.0  20568    640 ?         Ss   23:25   0:00  nginx: master process /usr/local/nginx/sbin/nginx
nginx     14478  0.0  0.0  23108    1656 ?        S    23:25   0:00  nginx: worker process
root      14789  0.0  0.0  112708   976 pts/1      S+   23:53   0:00  grep --color=auto nginx

###Nginx查看进程运行情况,主进程由root帐户创建,子进程则由Nginx创建。

(三)配置网页缓存时间

在主配置文件/nginx.conf中http{}区域内新建一个location区域,配置图片缓存时间

  [root@localhost conf]# vi /usr/local/nginx/conf/nginx.conf

      location ~\.(gif|jpg|jepg|png|bmp|ico)$ {
    
    
        root html;
        expires 1d;  缓存1}

(四)设置连接超时

为什么需要设置缓存超时

  • 在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。可以修改配置文件nginx.conf,设置keepalive_timeout超时时间。
  • keepalive_timeout第一个参数指定了与client的keep-alive连接超时时间,服务器将会在这个时间后关闭连接。可选的第二个参数指定了在响应头KeepAlive_timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。没有这个参数,nginx不会发送 Keep-Alive响应头。
  • 访问网址抓取数据报文,响应头中显示了超时时间是180秒。一般只设置Keepalive_timeout参数即可。
  • 同时在优化后可能还会增加其它超时参数,比如Client_header_timeout参数,指定等待客户端发送请求头的超时时间,Client_body_timeout指定请求体读超时时间

实操

[root@localhost conf]# vi /usr/local/nginx/conf/nginx.conf
http {
    
    
……省略部分    
    #keepalive_timeout  0;
    keepalive_timeout  65 180;  ##默认65秒,设置超时时间180s
    client_header_timeout 80;
    client_body_timeout 80;
……省略部分  

抓包测试

访问http://20.0.0.12,抓包看报文,分析keepalivetimeout超时时间
在这里插入图片描述

(五)配置网页压缩

网页压缩概述

  • Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许Nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验,
  • 默认Nginx已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
[root@localhost conf]# vi /usr/local/nginx/conf/nginx.conf
gzip  on;   ##找到gzip on,去掉前面的注释开启压缩功能
gzip_buffers 4 64k;  //表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果;
gzip_http_version 1.1;
gzip_comp_level 6;  //用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,使用默认即可;
gzip_min_length 1k; //用于设置允许压缩的页面最小字节数;
gzip_vary on;
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss;  //压缩类型,是对哪些网页文档启用压缩功能;

抓包测试

在这里插入图片描述

(六)配置防盗链

正版原网站(20.0.0.12)

[root@localhost html]# vi /usr/local/nginx/html/index.html    ##制作一个正版网页
<html><body><h1>The original image</h1>
<img src="zb.jpg"/>
</body></html>

登入20.0.0.12测试
在这里插入图片描述
盗版网站(20.0.0.18)

[root@localhost html]# vi /var/www/html/index.html
<html><body><h1>I'm NiuBi</h1>
<img src="http://20.0.0.12/zb.jpg"/>
</body></html>

登入20.0.0.18测试

在这里插入图片描述
再配置一台服务器Apache网站(20.0.0.11),作为防盗链重定向网站

[root@localhost html]# yum -y install httpd
[root@localhost html]# vi /var/www/html/index.html
<html><body><h1>ni fan shi le</h1>
<img src="jg.jpg"/>
</body></html>

到nginx服务器配置防盗链
[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
location ~*.(jpg|gif|swf)$ { 匹配以.(jpg|gif|swf)格式结尾的请求
valid_referers none blocked *.test.com test.com; 合法访问是以.test.com形式的请求
if ($invalid_referer) { 如果是非法访问
rewrite ^/ http://20.0.0.12/jg.jpg; 则重定向到 http://20.0.0.12/jg.jpg
}
}

再次访问http://20.0.0.18,图片发生改变,防盗链有效

在这里插入图片描述

(七)日志切割脚本

随着Nginx运行时间的增加,产生的日志也会逐渐增加,为了方便掌握Nginx的运行状态,需要时刻关注Nginx日志文件。太大的日志文件对监控是一个大灾难,不便于分析排查,需要定期的进行日志文件的切割。

编写脚本/opt/rizhifenge.sh

把Nginx的日志文件/usr/local/nginx/logs/access.log 移动到,目录/var/log/nginx下面,以当前时间做为日志文件的名称,然后用kill-USR1创建新的日志文件/usr/local/nginx/logs/access.log,最后删除30天之前的日志文件。

[root@www logs]# vi/opt/rizhifenge.sh
#!/bin/bash
#Filename: rizhifenge.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 ]ll mkdir -p $logs_path     ####创建日志文件目录
mv /usr/local/nginx/logs/access.log ${
    
    logs_path}/51xit.top-access.log-$d 
                                          ###移动并重命名日志文件
kill-USR1 $(cat $pid path)     ####重建新日志文件
find $logs_path -mtime +30 |xargs rm -rf      ####删除30天之前的日志文件

执行/opt/rizhifenge.sh,测试日志文件是否被切割

[root@www logs]# chmod +x/opt/rizhifenge.sh ####添加权限
[root@www logs]# /opt/rizhifenge.sh ###执行分割脚本
[root@www ~]#ls /var/log/nginx
51xit.top-access.log-20180523 ###按日期分割了日志文件

(八)进程优化

[root@localhost proc]# cd /proc/
[root@localhost proc]# ls   ##/proc/目录下cpuinfo和meminfo可以查看CPU和缓存信息
cpuinfo   meminfo  ……省略部分
processor	: 0   ##从0开始数,有一个CPU核心就有一个processor
……省略部分
power management:

processor	: 1
……省略部分
power management:

processor	: 2
……省略部分
power management:

[root@localhost proc]# cat /proc/cpuinfo |grep -c "processor"  ##可以查看CPU核心数
3
[root@localhost proc]# ps aux |grep nginx   ##查看进程开启情况,一个root主进程,一个子进程
root      12872  0.0  0.0  20556   668 ?        Ss   05:52   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     12873  0.0  0.0  23040  1684 ?        S    05:52   0:00 nginx: worker process
[root@localhost proc]# vi /usr/local/nginx/conf/nginx.conf
……省略部分
worker_processes  3;   ##进程数改为3,工作进程数默认为1,
worker_cpu_affinity 001 010 100;  ##插入这行字段,配置负载均衡,没有闲置的cpu核心
……省略部分
events {
    
    
    worker_connections  1024;   ##每个工作进程可以建立的连接数
}
[root@localhost proc]# systemctl restart nginx  ##重启生效
[root@localhost proc]# ps aux |grep nginx   ##查看到一个root主进程,三个子进程
root      14059  0.0  0.0  20556   660 ?        Ss   07:20   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     14060  0.0  0.0  23040  1432 ?        S    07:20   0:00 nginx: worker process
nginx     14061  0.0  0.0  23040  1432 ?        S    07:20   0:00 nginx: worker process
nginx     14062  0.0  0.0  23040  1432 ?        S    07:20   0:00 nginx: worker process

(九)FPM动态进程配置方法

Pm.max_children 指定启动的进程数量最大的数量,同时也是活着的(注意:“活着"不等于"工作中”,“杀死"不等于"空闲”)
Pm.start.servers 动态方式下初始的ftpm 进程数量,启动时创建的子进程数量
Pm.min_spare_servers 动态方式下最小的fpm“空闲”子进程的最小数量;状态(等待处理),如果“空闲”进程的数量的值小于这个值,那么将创建一些子节点。
Pm.max_spare_servers 动态方式下最大的空闲进程数;状态(等待处理)。如果“空闲”进程的数量大于这个数字,那么多出的一些子进程会被杀死。

假设场景:现有云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近1G,处理比较慢,对参数进行优化处理。

示例

root@www etc]# cd /usr/local/php/etc/php-fpm.d
[root@www etc]# vi www.conf
pm=dynamic     ##动态方式
pm.max_children=20
pm.start_servers=5
pm.min_spare_servers=2
pm.max_spare_servers=8    
pm.process_idle_timeout=500    

猜你喜欢

转载自blog.csdn.net/CN_LiTianpeng/article/details/108549412
今日推荐