Nginx 优化与防盗链

文章目录

  • 一、Nginx 优化
    • 1. 隐藏版本号
      • (1) 隐藏版本号的原因
      • (2) 版本号查看
        • ① nginx -v (仅限 web 浏览器)
        • ② curl -I
        • ③ 浏览器查看
      • (3) 隐藏方法
        • ① 修改配置文件
        • ② 修改源码文件,重新编译
    • 2. 修改用户与组
    • 3. 缓存时间
    • 4. 日志分割
    • 5. 连接超时
    • 6. 更改进程数
    • 7. 配置网页压缩
  • 二、盗链与防盗链
    • 1. 盗链
      • 1.1 nginx 服务端配置
      • 1.2 盗链主机配置
      • 1.3 windows 测试机配置
      • 1.4 windows 访问测试
    • 2. 防盗链
      • 2.1 nginx 服务端配置
      • 2.2 windows 访问测试
  • 三、FPM 参数优化

一、Nginx 优化

1. 隐藏版本号

(1) 隐藏版本号的原因

  为了安全,如果暴露版本信息,黑客可以通过版本信息得知该版本存在的漏洞,进而对服务器进行攻击。隐藏版本信息可以避免黑客有的放矢的进行破坏。

(2) 版本号查看

① nginx -v (仅限 web 浏览器)

[root@c7-1 ~]#nginx -v
nginx version: nginx/1.12.2

② curl -I

[root@c7-1 ~]#curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Fri, 08 Oct 2021 12:29:08 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 04 Oct 2021 12:54:14 GMT
Connection: keep-alive
ETag: "615af976-264"
Accept-Ranges: bytes

③ 浏览器查看

Nginx 优化与防盗链_第1张图片

(3) 隐藏方法

① 修改配置文件

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

http {
......
    server_tokens off;    #添加此行内容,关闭版本号的显示
......

[root@localhost ~]# systemctl restart nginx

Nginx 优化与防盗链_第2张图片

② 修改源码文件,重新编译

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

http {
......
    #server_tokens off;    #注释此行内容,开启版本号的显示
......

[root@localhost ~]# vim /opt/nginx-1.12.2/src/core/nginx.h

##修改版本号和名称,可伪装成其他服务(例如 apache、mysql 等)
#define NGINX_VERSION      "5.7.20"
#define NGINX_VER          "mysql/" NGINX_VERSION

#重新编译
cd /opt/nginx-1.12.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

make -j 4 && make install
systemctl restart nginx

Nginx 优化与防盗链_第3张图片

#隐藏成功
[root@c7-1 ~]#nginx -v
nginx version: mysql/5.7.20

2. 修改用户与组

[root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf

user  nginx nginx;         #第二行,取消注释,修改用户为nginx,组为nginx

[root@localhost nginx-1.12.0]# systemctl restart nginx
[root@localhost nginx-1.12.0]# ps aux | grep nginx
#主进程由root创建,子进程由nginx创建
root      42095  0.0  0.0  20500   628 ?        Ss   23:29   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     42096  0.0  0.0  22948  1404 ?        S    23:29   0:00 nginx: worker process
root      42103  0.0  0.0 112676   976 pts/0    R+   23:29   0:00 grep --color=auto nginx

3. 缓存时间

  当 nginx 将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度。一般针对静态网页进行设置,对动态网页不设置缓存时间。

[root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf

......
    server {
    ......
        location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {   #新建location,以图片作为缓存对象
            root   html;
            expires 1d;                              #指定缓存时间为1天,一天半为1d12h
        }
    ......
    }
......

[root@localhost nginx-1.12.0]# systemctl restart nginx

在网页中加入图片后测试

[root@c7-1 /usr/local/nginx/html]#ls
50x.html  index.html  index.html.bak  test.jpg

[root@c7-1 /usr/local/nginx/html]#vim index.html 

#加入图片
</h1>
<img src="test.jpg"/>
</body></html>

Nginx 优化与防盗链_第4张图片

4. 日志分割

编写脚本

[root@c7-1 /opt]# vim log_cut.sh 

#!/bin/bash
#Filename:log_cut.sh

lastday=$(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-$lastday
mv /usr/local/nginx/logs/error.log $logs_path/test.com_error.log-$lastday
#移动并重命名日志文件

kill -USR1 $(cat $pid_path)
#重建新日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;
#删除30天之前的日志文件

脚本测试

[root@c7-1 /opt]#chmod +x log_cut.sh 
[root@c7-1 /opt]#./log_cut.sh  
[root@c7-1 /opt]#cd /var/log/nginx/
[root@c7-1 /var/log/nginx]#ls
test.com_access.log-20211007  test.com_error.log-20211007

添加计划任务

[root@c7-1 ~]#crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@c7-1 ~]#crontab -l
0 1 * * * /opt/log_cut.sh

5. 连接超时

  HTTP 有一个 KeepAlive 模式,它告诉 web 服务器在处理完一个请求后保持这个 TCP 链接的打开状态。若接收到来自同一客户端的其他请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
  KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源,占用过多就会影响性能。

[root@c7-1 ~]#vim /usr/local/nginx/conf/nginx.conf

http {
......
    keepalive_timeout  65 180;
    client_header_timeout 80;
    client_body_timeout 80;
......
}

[root@localhost nginx]# systemctl restart nginx

Nginx 优化与防盗链_第5张图片

6. 更改进程数

  • 在高并发环境中,需要启动更多的 nginx 进程以保证快速响应,用以处理用户的请求,避免造成阻塞
  • 默认情况下,nginx 的多个进程可能更多的跑在一颗 CPU 上,可以分配不同的进程给不同的 CPU 处理,以充分利用 cpu 性能
  • worker_processes 最多开启 8 个,8 个以上性能就不会再提升了,而且稳定性会变低
[root@c7-1 ~]#nproc --all	#显示所有 CPU 数目
4
[root@c7-1 ~]#nproc			#显示当前进程可用的 CPU 数目
4
[root@c7-1 ~]#ps aux | grep nginx	#查看 nginx 主进程中包含几个子进程
root       6069  0.0  0.0  20544   608 ?        Ss   10:47   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      6070  0.0  0.0  23072  1632 ?        S    10:47   0:00 nginx: worker process
root       6693  0.0  0.0 112728   972 pts/3    S+   10:56   0:00 grep --color=auto nginx

[root@c7-1 ~]#vim /usr/local/nginx/conf/nginx.conf
#user  nobody;
worker_processes  4;		#修改为核数相同或者 2 倍
worker_cpu_affinity 0001 0010 0100 1000#两个核就是 01 10 ;
# 8 个核就是 00000001 00000010 00000100 ...... 01000000 10000000

events {
    worker_connections  4096;	#单个工作进程可以允许同时建立外部连接的数量
}

[root@c7-1 ~]#systemctl restart nginx

7. 配置网页压缩

  nginx 的 ngx_http_gzip_module 压缩模块提供对文件内容压缩的功能。允许 nginx 服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装,可在配置文件中加入相应的压缩功能参数对压缩性能进行优化。

vim /usr/local/nginx/conf/nginx.conf
......
http {
    ......
    gzip on;                  #开启 gzip 压缩功能
    gzip_min_length 1k;       #压缩阈值,最小压缩为 1k
    gzip_buffers 4 16k;       # buffer 大小为 4 个 16k 缓冲区大小
    gzip_http_version 1.1;    #压缩版本(默认不设置)
    gzip_comp_level 6;        #压缩比率,最小为 1,处理速度快,传输速度慢,9 最大压缩比,处理速度慢,传输速度快(建议5-6)
    gzip_disable "MSIE [1-6]\.";  #配置禁用 gzip 条件,支持正则,表示 ie6 以下不启用 gzip
    gzip_vary on;  				  #支持前端缓存服务器存储压缩页面
    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;
    #支持的压缩类型
    ......
}

nginx -t
cd /usr/local/nginx/html/   	 #首页中插入 cat.jpg 图片进行测试

vim index.html
	<h1>Welcome to nginx!</h1>
	<img src="test.jpg"/>		 #插入一行
	
systemctl restart nginx

浏览器查看(注意清除浏览器缓存)
Nginx 优化与防盗链_第6张图片

二、盗链与防盗链

在企业网站中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免不必要的带宽浪费。

主机 IP
nginx 服务端 192.168.10.12
盗链端 192.168.10.20
Windows10 192.168.10.10

1. 盗链

1.1 nginx 服务端配置

预安装 nginx 服务
echo "192.168.10.12 www.nginx-server.com" >>/etc/hosts
上传 test.jpg 到 /usr/local/nginx/html 目录

1.2 盗链主机配置

systemctl stop firewalld && systemctl disable firewalld
setenforce 0
ntpdate ntp1.aliyun.com

#安装 httpd 服务
yum -y install httpd
systemctl start httpd && systemctl enable httpd

#配置临时 DNS 映射
echo "192.168.10.12 www.nginx-server.com" >>/etc/hosts
echo "192.168.10.20 www.daolian.com" >>/etc/hosts

cat > /var/www/html/index.html <<EOF

this is a "盗链" test

EOF
systemctl restart httpd

1.3 windows 测试机配置

#在 hosts 文件添加映射,需要管理员权限
C:\Windows\System32\drivers\etc\hosts

Nginx 优化与防盗链_第7张图片
Nginx 优化与防盗链_第8张图片

1.4 windows 访问测试

访问 nginx-server 查看图片
Nginx 优化与防盗链_第9张图片
访问盗链端
Nginx 优化与防盗链_第10张图片

2. 防盗链

2.1 nginx 服务端配置

修改配置文件,添加如下内容

[root@nginx ~]#vim /usr/local/nginx/conf/nginx.conf

http {
......
    server {
    ......
        location ~* \.(jpeg|gif|jpg|swf)$ {
#匹配不区分大小写,以 .jpeg/.gif/.jpg/.swf 结尾的文件
            valid_referers none blocked *.nginx-server.com nginx-server.com;
#设置信任来源可以正常访问资源
            if ( $invalid_referer ) {
                rewrite ^/ http://www.nginx-server.com/daolian.png;
                #return 403;
#如果链接的来源域名不在 valid_referers 列表中,则 rewrite 跳转页面或者返回 403 页面
            }
        }
    ......
    }
......
}

[root@nginx ~]#nginx -t
[root@nginx ~]#systemctl restart nginx

上传 daolian.jpg 图片到 /usr/local/nginx/html 目录下

2.2 windows 访问测试

Nginx 优化与防盗链_第11张图片

三、FPM 参数优化

nginx 的 PHP 解析功能实现如果是交由 FPM 处理的,为了提高 PHP 的处理速度,可对 FPM 模块进行参数的调整。

  • 首先安装带 FPM 模块的 PHP 环境,保证 PHP 可以正常运行
  • FPM 进程有两种启动方式,由 pm 参数指定,分别是 static 和 dynamic,前者将产生固定数据的 fpm 进程,后者将以动态的方式产生 fpm 进程
  • static 方式可以使用 pm.max_children 指定启动的进程数量。dynamic 方式的参数则要根据服务器的内存与服务负载进行调整,参数下所示
选项 说明
pm.max_children 指定启动的进程的最大的数量
pm.start_servers 动态方式下初始的 ftpm 进程数量
pm.min_spare_servers 动态方式下最小的 fpm 空闲进程数
pm.max_spare_servers 动态方式下最大的 fpm 空闲进程数

假设云服务器上运行了个人论坛,内存为 1.5 GB ,fpm 进程数为20,内存消耗将近 1GB ,处理速度较慢,需对参数进行优化处理

[root@server ~]# vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid

[root@server ~]# vim /usr/local/php/etc/php-fpm.d/www.conf
pm = dynamic										#将以动态的方式产生fpm进程
pm.max_children=20     								#static模式下空闲进程数上限,大于下面的值
pm.start_servers = 5   								#动态方式下默认开启的进程数,在最小和最大之间
pm.min_spare_servers = 2  							#动态方式下最少空闲进程数
pm.max_spare_servers = 8  							#动态方式下最大空闲进程数

#FPM 启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多可以有20个进程存在
#重启 php-fpm
[root@server ~]# kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
[root@server ~]# netstat -anpt | grep 9000

你可能感兴趣的:(云计算,linux运维,网络,nginx,运维)