小阿轩yx-Nginx 优化与防盗链
Nginx 服务优化
在企业应用环境中,服务器的安全性和响应速度需要根据实际情况进行相应参数配置,以达到最优的用户体验。
Nginx默认的安装参数
- 只能提供最基本的服务
需要调整
- 网页缓存时间
- 连接超时
- 网页压缩等相应参数,才能发挥出服务器的最大作用
隐藏版本号之前查看的方式
- 可使用 Fiddler 工具抓取数据包查看 Nginx 版本
- 也可使用命令查看
[root@localhost ~]# curl -i http://192.168.10.101
HTTP/1.1 200 OK
# 版本号
Server:nginx/1.12.0
Date: Thu, 09 Jun 2022 07:47:17 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 12
Last-Modified: Thu, 09 Jun 2022 07:46:09 GMT
Connection: keep-alive
ETag: "62a1a541-c"
Accept-Ranges: bytes
www.kgc.com
访问网址,查看版本信息
[root@localhost ~]# nginx -s stop && nginx
[root@localhost ~]# curl -i 127.0.0.1
HTTP/1.1 200 OK
Server: iis/10.12.0
Date: Thu, 09 Jun 2022 07:57:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 12
Last-Modified: Thu, 09 Jun 2022 07:46:09 GMT
Connection: keep-alive
ETag: "62a1a541-c"
Accept-Ranges: bytes
www.kgc.com
隐藏版本号
[root@www ~]# cd /usr/local/nginx/conf/
[root@www ~l# vim nginx.conf
# 省略内容
http {
include mime.types;
default type application/octet-stream;
server tokens off.
# 关闭版本号
# 省略内容
# 测试配置文件语法
[root@www conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
好处
- 避免泄漏 Nginx 版本
- 不让攻击者针对特定版本进行攻击
隐藏 Nginx 版本号两种方式
- 修改 Nginx 主配置文件
- 修改 Nginx 源码文件,指定不显示版本号
修改配置文件方式
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
设置版本信息
[root@localhost ~]# vim nginx-1.12.0/src/core/nginx.h
#define nginx_version 1012000
#define NGINX_VERSION "10.12.0"
#define NGINX_VER "iis/" NGINX_VERSION
[root@localhost ~]# cd nginx-1.12.0
[root@www nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens on;
修改用户与组
- 用于支持 Nginx 的运行
- 实现对网站文件读取时进行访问控制
- Nginx默认使用 nobody 用户账号与组账号,一般也进行修改
修改 Nginx用户与组有两种方法
- 在编译安装时指定用户与组
- 修改配置文件指定用户与组
指定用户与组的参数
[root@ww nginx-1.12.0]# ./configure
--prefix=/usr/local/nginx
# 指定用户名是 nginx
--user=nginx
# 指定组名是 nginx
--group=nginx
.-with-http stub status module && make && make install
配置用户与组
[root@www nginx-1.12.0]# cd /usr/localnginx/conf
[root@www conf]# vim nginx.conf
# 修改用户为 nginx ,组为 nginx
user nginx nginx;
# 查看worker process的用户
[root@www conf]# ps aux |grep nginx
(注:master process的用户是主进程用户)
配置网页缓存时间
- 当 Nginx 将网页数据返回给客户端后,可设置缓存时间
好处
- 以便在日后进行相同内容的请求时直接返回
- 以避免重复请求,加快访问速度
- 缓存时间一般针对静态资源进行设置对动态网页不用设置缓存时间
访问网页http://192.168.10.101/logo.jpg
修改 Nginx 的配置文件,在新 location 段加入 expires 参数,指定缓存的时间
location / {
root html;
index index.html index.htm index.php;
}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
root html;
expires 1d;
}
(注:~:表示执行一个正则匹配,区分大小写
d:天
M:月
m:分钟
s:秒
h:小时)
重启服务
[root@localhost ~]# systemctl restart nginx
日志切割
Nginx 运行时间增加,产生的日志也会增加
日志增加弊端
- 不便于分析和排查
(注:需要定期进行日志文件的切割)
Nginx
缺点
- 没有类似 Apache 的 cronlog 日志分割处理功能
特点
- 可以通过 Nginx 的信号控制功能脚本来实现日志的自动切割
- 并将脚本加入到 Linux的计划任务中,让脚本在每天的固定时间执行,便可实现日志切割功能
编写脚本/opt/fenge.sh,把 Nginx 的日志文件/usr/local/nginx/logs/access.log 移动到目录/var/log/nginx 下面
[root@www ~]# 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}/test.com-access.log-$d
kill -USR1 $(cat $pid_path)
find $logs_path -mtime +30 |xargs rm -rf
(注:
- kill -USR1 $(cat $pid_path) ##重建新日志文件
- find $logs_path -mtime +30 |xargs rm -rf ##删除 30 天之前的日志文件
- xargs:可以读取标准输入和管道中的数据,用于弥补有些命令(如echo、kill、rm)不能从管道中读取数据的不足。
- kill -USR1 :停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。)
执行/opt/fenge.sh,测试日志文件是否被切割
[root@www ~]# chmod +x /opt/fenge.sh
[root@www ~]# /opt/fenge.sh
[root@www ~]# ls /var/log/nginx
[root@www ~]# ls /usr/local/nginx/logs/access.log
设置 crontab 任务,定期执行脚本自动进行日志分割
[root@www ~]# crontab -e
30 1 * * * /opt/fenge.sh
设置连接超时
避免用一个用户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
keepalive_timeou设置连接超时
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
http {
#keepalive_timeout 0;
keepalive_timeout 65 180;
(注:keepalive_timeout
第一个参数指定了与客户端的 keep-alive 连接超时时间,服务器将会在这个时间后关闭连接。
第二个参数(可选)指定了在响应头 Keep-Alive: timeout=time 中的 time 值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头)
用浏览器访问
Client_header_timeout参数可用于指定等待客户端发送请求头的超时时间,Client_body_timeout 参数可用于指定请求体读超时时间
keepalive_timeout 65 180;
client_header_timeout 80;
client_body_timeout 80;
Nginx 深入优化
更改进程数
高并发环境中,要启动更多的Nginx进程以保证快速响应,用以处理用户的请求
好处
- 避免造成阻塞
用 ps aux 命令査看 Nginx 运行进程的个数
[root@www ~]# ps aux | grep nginx
root 17328 0.0 0.0 20548 636 ? Ss 20:32 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 17330 0.0 0.0 20912 1584 ? S 20:32 0:00 nginx: worker process
root 17355 0.0 0.0 112824 976 pts/3 R+ 20:39 0:00 grep --color=auto nginx
(注:
- master process 是 Nginx 的主进程,开启了 1 个;worker process 是子进程,子进程也是开启了 1 个。
- master进程负责管理worker进程,并负责读取配置文件和判断文件语法的工作;是主进程,有且只有一个。
- worker进程有多个,它负责处理请求。
- worker进程的数通常与服务器有多少cpu核心有关,比如,nginx所在主机拥有4核cpu,那么worker_ processes的值通常不会大于4,这样做的原因是为了尽力让每个worker进程都有一个cpu可以使用,尽量避免了多个worker进程抢占同一个cpu的情况,我们也可以将worker_ processes的值设置为"auto")
修改 Nginx 的配置文件的 worker_processes 参数
查看主机cpu数量
[root@www ~]# cat /proc/cpuinfo | grep -c "physical"
修改 Nginx 的配置文件的 worker_processes 参数
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx;
worker_processes 4;
[root@www ~]# systemctl restart nginx
[root@www ~]# ps aux | grep nginx
root 17374 0.0 0.0 20548 644 ? Ss 20:47 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 17376 0.0 0.0 20912 1344 ? S 20:47 0:00 nginx: worker process
nginx 17377 0.0 0.0 20912 1344 ? S 20:47 0:00 nginx: worker process
nginx 17376 0.0 0.0 20912 1344 ? S 20:47 0:00 nginx: worker process
nginx 17377 0.0 0.0 20912 1344 ? S 20:47 0:00 nginx: worker process
root 17400 0.0 0.0 112824 980 pts/3 S+ 20:47 0:00 grep --color=auto nginx
以设置每个进程分别由不同的 CPU 核心处理,达到 CPU 的性能最大化
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
配置网页压缩
Nginx 的 ngx_http_gzip_module 压缩模块提供
- 对文件内容压缩功能
- 允许 Nginx服务器将输出内容发送到客户端之前进行压缩
好处
- 节约网站的带宽
- 提升用户的访问体验
默认 Nginx 已经安装该模块
修改 Nginx 的配置文件,加入压缩功能参数进行优化
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
http {
#去掉gzip on;前面的注释,增加其他的参数
gzip on;
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 2;
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 image/jpeg image/gif image/png;
[root@www ~]# systemctl restart nginx
- gzipon:开启 gzip 压缩输出
- gzip_min_length1k:用于设置允许压缩的页面最小字节数
- gzip_buffers 4 16k:表示申请4个单位为 16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果
- gzip_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://192.168.10.101/
(注:如果看不到压缩,将nginx配置文件中页面缓存的参数去掉,清空一下浏览器,再测试)
配置防盗链
- 避免网站内容被盗造成损失
- 也避免不必要的带宽浪费
Nginx
- 防盗功能也非常强大
- 默认情况下,只需进行很简单的配置即可实现防盗链处理
服务器恢复到前面的快照
防盗链实验环境
IP地址 | 域名 | 用途 |
192.168.10.101 | www.benet.com | 源主机 |
192.168.10.102 | www.accp.com | 盗链主机 |
修改客户端hosts文件
-
192.168.10.101 www.benet.com
-
192.168.10.102 www.accp.com
修改两台 CentOS 的 hosts 文件
-
192.168.10.101 www.benet.com
-
192.168.10.102 www.accp.com
把图片 logo.jpg 放到源主机(benet.com)的工作目录下
[root@www ~]# vim /usr/local/nginx/html/index.html
<html>
<body>
<p>原图网站</p>
<img src="http://www.benet.com/logo.jpg"/>
</body>
</html>
在盗链主机(accp.com)的工作目录编写盗链页面index.html,盗取源主机(benet.com)的图片
[root@accp~]# yum -y install httpd
[root@accp~]# systemctl stop firewalld
[root@accp~]# systemctl start httpd
[root@accp~]# vim /var/www/html/index.html
<html>
<body>
<p>盗图网站</p>
<img src="http://www.benet.com/logo.jpg"/>
</body>
</html>
[root@accp~]# vim /etc/hosts
192.168.10.101 www.benet.com
192.168.10.102 www.accp.com
访问盗链的网页 http://www.accp.com/index.html 查看是否盗链成功
配置 Nginx 防盗链
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
}
location ~* \.(gif|jpg|jpeg)$ {
valid_referers *.benet.com benet.com;
if ($invalid_referer) {
rewrite ^/ http://www.benet.com/error.png;
}
}
(注:去掉页面缓存相关配置)
(注:location ~* \.(gif|jpg|jpeg)$中不要加入png格式,rewrite语句中地址重写到了一个png报错图片。
如果location ~* \.(gif|jpg|jpeg)$中写了png格式,就会被循环重定向,无法看到报错图片。)
(注:valid_referers:nginx会通就过查看referer自动和valid_referers后面的内容进行匹配,如果匹配到了就将$invalid_referer变量置0,如果没有匹配到,则将$invalid_referer变量置为1,匹配的过程中不区分大小写)
- None 浏览器中referer(Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面连接过来的,服务器基此可以获得一些信息用于处理)为空的情况,就直接在浏览器访问图片
- Blocked referrer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或者https:// 开头。
- ~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
- Valid_referers:设置信任的网站,可以正常使用图片;
- 后面的网址或者域名:referer 中包含相关字符串的网址;
- If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 为1,则执行后面的操作,即进行重写或返回 403 页面
测试
重新访问 http://www.accp.com/,无法看到盗图
FPM 参数优化安装带 FPM 模块的 PHP 环境,保证 PHP 可以正常运行
FPM 进程的两种启动方式
-
Static 的方式可以使用 pm.max_children 指定启动的进程数量
-
Dynamic 方式的参数要根据服务器的内存与服务负载进行调整
优化
root@www etc]# cd /usr/local/php5/etc/
[root@www etc]# vi php-fpm.conf
pm=dynamic
pm.max_children=20
pm.start_servers=5
pm.min_spare_servers=2
pm.max_spare_servers=8
小阿轩yx-Nginx 优化与防盗链