Nginx优化配置
- 一、实验环境
- 二、实验准备
- 1、linux安装并开启DNS服务
- 2、win10安装HTTP调试抓包工具(fiddler)
- 3、win7安装IIS服务(web服务)
- 一、隐藏版本号
- 1、源码编译前配置
- 2、修改配置文件
- 二、开启缓存访问
- 三、日志分割
- 四、压缩
- 五、防盗链
- 六、超时时间
- 七、worker进程管理
一、实验环境
- 主服务器: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
四、压缩
我们希望做到 Nginx 服务端往客户端发送的数据越小,占用的延迟越低用户体验便会越好。所以往往在代理或 Nginx 中会设置文件压缩,我们主要通过gzip方式进行设置,步骤如下:
第一步:修改配置文件,搜索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; <----表示 Nginx 在处理压缩时的压缩等级为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会通过查看referer字段和valid_referers后面的referer列表进行匹配,如果匹配到了就invalid_referer字段值为0 否则设置该值为1
第六步:重启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