CentOS 7.6 Nginx优化配置(压缩、缓存、防盗链、隐藏版本号、日志分割、超时时间等)

一、实验环境

  • 主服务器:192.168.245.120(CentOS 7.6)
  • 验证客户机:192.168.245.10(win10)
  • 盗链服务器:192.168.245.139(win 7)
  • nginx版本:nginx-1.12.2.tar.gz

二、实验准备

1、linux安装并开启DNS服务

[root@server ~]# yum -y install bind
[root@server ~]# vim /etc/named.conf 
 12 options {
 13         listen-on port 53 { any; };  <---修改为any
 21         allow-query     { any; };  <---修改为any
 
[root@server ~]# vim /etc/named.rfc1912.zones 
zone "yjs.com" IN {
        type master;
        file "yjs.com.zone";
        allow-update { none; };
};

[root@server ~]# cd /var/named/
[root@server named]# cp -p named.localhost yjs.com.zone
[root@server named]# vim yjs.com.zone 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
www IN  A       192.168.245.120

[root@server named]# systemctl start named

2、win10安装HTTP调试抓包工具(fiddler)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、win7安装IIS服务(web服务)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置DNS服务器指向nginx服务器地址
在这里插入图片描述

一、隐藏版本号

1、源码编译前配置

第一步:解压nginx源码包,自定义配置

[root@server opt]# tar xzfv nginx-1.12.2.tar.gz

[root@server opt]# cd nginx-1.12.2/
[root@server nginx-1.12.2]#./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

第二步:修改nginx.h文件,把原来真实的版本号随便改一个,注意:不要去掉前面的#号
再次编译安装

[root@server nginx-1.12.2]# vim src/core/nginx.h
#define NGINX_VERSION      "1.1.1"

[root@server nginx-1.12.2]#make && make install

第三步:添加管理用户nginx,编写启动脚本,使它可以用systemctl启动

[root@server nginx-1.12.2]# useradd -M -s /sbin/nologin nginx

[root@server nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/


[root@server nginx-1.12.2]# vim /lib/systemd/system/nginx.service

[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile =/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -S HUP $MAINPID
ExecStop=/usr/bin/kill -S QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target


[root@server conf]# 
[root@server conf]# 
[root@server conf]# chmod 754 /lib/systemd/system/nginx.service

第四步:启动nginx,curl -I抓取网页头部信息

[root@server nginx-1.12.2]# systemctl start nginx

[root@server nginx-1.12.2]# curl -I http://192.168.245.120
HTTP/1.1 200 OK
Server: nginx/1.1.1    <---显示为我自己设置的版本号
Date: Mon, 10 Aug 2020 07:08:29 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 10 Aug 2020 07:06:56 GMT
Connection: keep-alive
ETag: "5f30f210-264"
Accept-Ranges: bytes

2、修改配置文件

修改nginx配置文件,在http配置块里面加上server_tokens off;这一行,然后重启服务

[root@server nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;    <----不显示版本号
    
[root@server nginx-1.12.2]# systemctl restart nginx

[root@server nginx-1.12.2]# curl -I http://192.168.245.120
HTTP/1.1 200 OK
Server: nginx    <----直接隐藏了版本号
Date: Mon, 10 Aug 2020 07:14:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 10 Aug 2020 07:06:56 GMT
Connection: keep-alive
ETag: "5f30f210-264"
Accept-Ranges: bytes

二、开启缓存访问

第一步:修改主页内容,加上一张png图片

[root@server html]# ls
50x.html index.html  panda.png   <---把需要缓存的图片放进/usr/local/nginx/html目录下

[root@server html]# vim index.html
<h1>Welcome to nginx!</h1>
<img src="panda.png"/>

第二步:客户机访问服务器地址,如图所示
在这里插入图片描述

第三步:修改nginx配置文件,设置缓存时间为1天,指定遇到gif、jpg、ico、bmp、png结尾的文件就缓存,然后重启服务

[root@server html]# vim /usr/local/nginx/conf/nginx.conf
location ~ \.(gif|jpg|ico|bmp|png)$ {
         root html;
         expires 1d;
        }
        
[root@server html]# systemctl restart nginx

第四步:客户机打开抓包软件,访问网页查看头部信息,可以看到缓存信息,客户机测试抓包之前必须要清缓存!!!!
在这里插入图片描述

三、日志分割

日志储存为一个文件会越来越大不方便查看,下面我们设置成按天分割日志,即第二天会产生新的日志文件,记录的是今天的日志

第一步:编写日志分割的功能脚本

[root@server html]# vim /opt/fenge.sh
#!/bin/bash
# Filename:fenge.sh
d=$(date -d "-1 day" "+%Y%m%d")  <---日期格式为20200809且是昨天的日期
logs_path="/var/log/nginx"    <---日志文件的存放路径
pid_path="/usr/local/nginx/logs/nginx.pid"   <---pid路径
[ -d $logs_path ] || mkdir -p $logs_path   <---检测日志存放路径不存在时创建
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d   <---移动访问日志到/var/log/nginx/test.com-access.log-日期
kill -USR1 $(cat $pid_path)  <---重载进程以便重新产生日志文件
find $logs_path -mtime +30 | xargs rm -rf  <---30天后删除日志

第二步:为分割日志制作一个任务计划,要求每天的1点生成日志

[root@server html]# chmod +x /opt/fenge.sh
[root@server html]# crontab -e
no crontab for root - using an empty one

0 1 * * * /opt/fenge.sh

第三步:测试日志生成成功

[root@server html]# cd /opt
[root@server opt]# ./fenge.sh 
[root@server opt]# cd /var/log/nginx/
[root@server nginx]# ls
test.com-access.log-20200809

第四步:将系统时间调整为明天,将会产生一个新的日志,今天的日志

[root@server nginx]# date -s 08/11/20
2020 08 11 星期二 00:00:00 CST
[root@server nginx]# cd -
/opt
[root@server opt]# 
[root@server opt]# ./fenge.sh 
[root@server opt]# 
[root@server opt]# 
[root@server opt]# cd -
/var/log/nginx
[root@server nginx]# ls
test.com-access.log-20200809  test.com-access.log-20200810

四、压缩

第一步:修改配置文件,搜索gzip on;,开启gzip功能

[root@server nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
    gzip  on;    <---去掉行头的#
    gzip_min_length 1k;   <----超过1k就进行压缩
    gzip_buffers 4 16k;   <----压缩之前先放进缓存空间,缓存空间大小为4*16k
    gzip_http_version 1.1;   <----支持1.1以上版本的压缩
    gzip_comp_level 6;    <----压缩比为6
    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;   <----指定对哪些文件进行压缩
    gzip_disable "MSIE [1-6]\.";    <----微软的ie浏览器1-6的版本不启用压缩
    gzip_vary on;    <----可以让前端的服务器缓存经过压缩的页面	

第二步:重启服务

[root@server nginx-1.12.2]# systemctl restart nginx

第三步:客户机访问服务器
在这里插入图片描述

五、防盗链

第一步:在win10客户机上正常用域名访问nginx服务器,如下图所示
在这里插入图片描述
第二步,在win7盗链服务器上编写一个访问主页
在这里插入图片描述

<html>
<head></head>
<body>
     <h1>this is the test web</h1>
     <img src="http://www.yjs.com/panda.png"/>
</body>
</html>

第三步:把主页文件放进主页站点目录下
在这里插入图片描述
第四步:在win10客户机上访问win7的地址
在这里插入图片描述
在这里插入图片描述
第五步:回到nginx服务器上,修改配置文件,加入location这一段内容,把error.jpg放进主页目录里
注意:不要少写大括号,一个server{}里面只能存在一个 location ~*.(jpg|gif|png)$,有多个会不生效!

[root@server nginx-1.12.2]# cd /usr/local/nginx/html/
[root@server html]# ls
50x.html  error.jpg  index.html  panda.png
[root@server html]# vim /usr/local/nginx/conf/nginx.conf
 error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~*\.(jpg|gif|png)$ {
             valid_referers none blocked *.yjs.com yjs.com;
             if ( $invalid_referer ) {
                rewrite ^/ http://www.yjs.com/error.jpg;
                }
                }
  • 第一行:定义了当访问资源为gif/jpg/png文件

  • 第二行:valid_referers这个关键字定义了白名单

    none代表请求头中没有referer信息,这一般是直接在浏览器输入图片网址

    blocked代表被防火墙过滤标记过的请求

  • 第三行:invalid_referer是内置变量,通过判断上一行中的valid_referers值会返回0或者1,

  • 第四行:如果访问来源不在白名单内,则显示被盗链替换的图片error.jpg

第六步:重启nginx服务

[root@server html]# systemctl restart nginx

第七步:win10客户机上访问win7地址,这会图片就会显示被盗链替换过的图片了
访问之前记得清除浏览器缓存!
在这里插入图片描述

六、超时时间

修改配置文件,找到keepalive这一行,在下面插入以下三行

[root@server html]# vim /usr/local/nginx/conf/nginx.conf
 #keepalive_timeout  0;
    keepalive_timeout  65 180;  <----指定每个TCP连接最多可以保持多长时间,默认值是75
    client_header_timout 80;   <----客户端向服务端发送一个完整的 request header 的超时时间,默认60s
    client_body_timout 80;   <----指定客户端与服务端建立连接后发送 request body 的超时时间,默认60s

重启服务

[root@server html]# systemctl restart nginx

七、worker进程管理

当启动nginx以后,有两个nginx进程,一个master进程,一个worker进程,这两个nginx进程都有各自的作用
"worker"进程天生就是来"干活"的,真正负责处理请求的进程是"worker"进程,那么"master"进程有什么用呢?
“master"进程其实是负责管理"worker"进程的,除了管理” worker"进程,master"进程还负责读取配置文件、判断配置文件语法的工作,“master进程"也叫"主进程”,在nginx中,"master"进程只能有一个,而"worker"进程可以有多个,worker"进程的数量可以由管理员自己进行定义

在这里插入图片描述
在这里插入图片描述
默认的nginx.conf配置文件中有这样一条配置
worker_ processes 1;
上述配置的意思就是启动nginx后只有1个worker进程,你想要多少个worker进程,将worker_ processe指令的值设置成多少就好了, worker_ processes指令只能在main区域中使用
通常情况下,worker_ processes的值通常不会大于服务器中cpu的核心数量
换句话说就是,worker进程的数通常与服务器有多少cpu核心有关

比如,nginx所在主机拥有4核cpu,那么worker_ processes的值通常不会大于4,这样做的原因是为了尽力让每个worker进程都有一个cpu可以使用,尽量避免了多个worker进程抢占同一个cpu的情况,我们也可以将worker_ processes的值设置为"auto"
当worker_ processes的值为auto时,nginx会自动检测当前主机的cpu核心数,并启动对应数量的worker进程,比如,nginx检测到当前主机一共有4个cpu核心,那么nginx就会启动4个worker进程

[root@server html]# vim /usr/local/nginx/conf/nginx.conf
#user  nobody;
worker_processes  2;   <----设置为2个进程,因为本机是2个cpu
worker_cpu_affinity 01 10;   <-----设置负载均衡,2个进程都要处理用户请求

同时,为了避免cpu在切换进程时产生性能损耗,我们也可以将worker进程与cpu核心进行"绑定",当worker进程与cpu核心绑定以后,worker进程可以更好的专注的使用某个cpu核心上的缓存,从而减少因为cpu切换不同worker进程而带来的缓存失效,如果想要让worker进程与某个cpu核心绑定,则需要借助另外一个配置指令,它就是"worker_ cpu_ affinity"指令

如果当前机器上一共有4个cpu核心,那么我们就用4个0表示这4个核,也就是说,我们可以使用如下字符表示这4个核: 0000
那么第一个核就用如下字符表示
0001
第二个核就用如下字符表示
0010
第三个核就用如下字符表示
0100

规律就是,有几个核,就用几个0表示,如果想要使用某个核,就将对应位的0改成1,位从右边开始
比如,如果有8个核,我就可以使用如下字符表示这8个核中的第二个核:
00000010

修改重启以后worker进程变成了2个
在这里插入图片描述
查看内核总数(本机为2个cpu,每个cpu2个内核)

[root@server html]# cat /proc/cpuinfo | grep -c "physical id"
4

猜你喜欢

转载自blog.csdn.net/shengjie87/article/details/107919446
今日推荐