Nginx的优化和防盗链

优化:

1.隐藏版本号

方法一:修改nginx的配置文件

在http模块下添加一个命令:server_tokens off

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

方法二:修改源码包

源码包路径:/opt/nginx-1.22.0/src/core/nginx.h

#define NGINX_VERSION "1.22.0" #修改版本号

#define NGINX_VER "nginx/" NGINX_VERSION

修改完源码包后再编译安装nginx

接着如果配置文件中配置了:server_tokens off,修改为server_tokens on

2.日志分割

nginx不自带日志分割工具,需要手动以脚本的形式来进行分割

脚本内容:

#!/bin/bash
d=$(date +%Y-%m-%d) #获取日期
dir="/usr/local/nginx/logs" #定义存储目录

#分割日志
logs_file='/usr/local/nginx/logs/accsee.log'
logs_error='/usr/local/nginx/logs/error.log'

#定义nginx的pid文件
pid_file='/usr/local/nginx/run/nginx.pid'

if [ ! -d "$dir" ]
then
     mkdir -p $dir
fi
mv $logs_file ${dir}/access_${d}.log #移动日志并且重命名
mv $logs_error ${dir}/error_${d}.log
kill -USR1 $(cat ${pid_file}) #发送信号给nginx主程序,让他生成一个新日志文件
find ${dir} -mtime +30 -exec rm -rf {} \; #日志文件清理的命令

3.页面压缩

修改配置文件:http模块中的 #gzip on;

gzip on;     #取消注释,开启gzip的压缩功能
        gzip_min_length 1k;       #最小压缩文件的大小
        gzip_buffers 4 64k;        #压缩缓冲区,大小为4个64K缓冲区,Nginx 会使用 4 个 64KB 大小的缓冲区来存储压缩后的数据。
        gzip_http_version 1.1;    #压缩版本,默认为1.1
        gzip_comp_level 6;        #压缩比率(压缩等级为1-9,6是中等等级,也是常用等级)Gzip 压缩级别的范围是1到9,其中1表示压缩速度最快,但压缩比最低,9表示压缩速度最慢,但压缩比最高。默认值为1。
       gzip_vary on;                   #支持前端缓存服务器支持压缩页面

在最后一行添加:

gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;   #压缩的类型,哪些文档启用压缩功能

4.图片缓存

修改配置文件:location模块中

location ~* \.(jpg|gif|swf|ico)$ {
      root html;
      expires 1d;  #设置图片的缓存时间为1天
}

5.连接超时

HTTP会有一个keepalive模式,告诉web服务器在处理完一个请求之后保持当前连接的tcp状态为打开状态,如果当前连接有新的请求,服务端就会利用这个没有关闭的连接,继续给客户端响应,不需要再建立一个新的连接。
缺点:keepalive在一段时间之内保持打开状态,在这段时间之内还是会占用资源,占用过多会影响性能

配置文件nginx.conf中:
keepalive_timeout 65;

tcp连接最多可以保持65秒,Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒,设置为0时就是禁用了keepalive功能,只要请求完成立刻关闭tcp连接

长连接:
client_header_timeout 60;

客户端向服务端发送请求,会有一个request_header的超时时间。如果客户端没有在60秒内发送一个完整的请求头,nginx会返回 408 request time out

client_body_timeout 60;

客户端没有向服务器在60秒发送一个完整请求体,nginx会返回 408 request time out

6.nginx的并发设置

在高并发的场景中,需要启动更多的nginx进程以保证响应速度。可以更快的处理用户的请求,避免阻塞

查看cpu的核心数,根据核心数来设置工作进程数

查看cpu核数:
cat /proc/cpuinfo |grep processor|wc -l

cat /proc/cpuinfo |grep -c processor

cat /proc/cpuinfo | grep -c "physical id"

设置并发:

方法一:cpu的核心数来进行设置

修改:worker_processes 1;
worker_processes最多开启8个,8个以上性能就不会再提升了,而且稳定性会变的更低,因此8个进程够用了

方法二:worker_cpu_affinity 设置work进程绑定到指定的cpu命令。可以减少cpu切换带来的开销,确保worker进程在一个独立的cpu核心上运行

生产中worker一般设置为4,访问量不大,1个也足够了

需要扩展最多8-16个

8个以上的worker进程就不会提高性能了,反而会降低性能

7.TIME_WAIT:

不是一个报错信息,是tcp连接状态中的一种状态。它出现在一个 TCP 连接被主动关闭后。在 TCP 的四次挥手过程中,当连接的一方发送了 FIN 报文(用于关闭连接)并接收到对方的 ACK 报文(确认收到 FIN 报文),就会进入 TIME_WAIT 状态。在 TIME_WAIT 状态下,TCP处理等待的状态,是有一个持续时间,65秒,确保网络中的所有数据包被完全处理完毕

作用:
1.确保可靠的关闭连接,如果立刻关闭连接,旧的数据包也会被处理,从而干扰新的连接

2.避免连接复用,time_wait的时间太短,可能会导致旧的连接仍然在网络中,误认为是新连接,导致连接复用

然而,当服务器上同时有大量的短连接频繁创建和销毁,或者处理大量并发连接时,TIME_WAIT 连接可能会积累,导致服务器上出现大量 TIME_WAIT 状态的连接。在这种情况下,可能需要优化服务器的连接管理方式或调整 TCP 参数来处理 TIME_WAIT 连接

查看系统的所有tcp连接的状态

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

查询结果:

closed 表示连接未活动或者关闭

listen 监听,等待连接

syn_recv :syn接受,服务端收到了来自客户端的syn(连接请求),正在等待确认

syn_sent :syn发送,客户端已经向服务器发送了syn请求,等待服务器确认

ESTABLELISHED:已经建立了tcp连接,正在传送数据

fin_wait1 :表示一端已经发送了连接关闭的请求,等待另一端确认

fin_wait2:表示一段已经关闭连接,但是应用程序还未关闭连接

close_wait:表示一段已经关闭连接,但是应用程序还欸关闭连接

closing:正在关闭

time_wait:连接等待

last_ack:表示应用程序已经发送了最后确认,等待另一端进入closed状态

修改time_wait:

vim /etc/sysctl.conf


net.ipv4.tcp_syncookies = 1       #表示开启syncookies,当出现SYN队列溢出,启用cookie处理请求。
net.ipv4.tcp_tw_reuse = 1          #让TIME_WAIT状态的连接可以复用,即使time_wait把本地端口全部占满,也不会拒绝新的请求。
net.ipv4.tcp_tw_recycle = 1       #让TIME_WAIT尽快回收
net.ipv4.tcp_fin_timeout = 60    #表示如果端口由本端要求关闭,fin_wait_2状态的保持时间

8.修改限制文件打开数

soft nproc 65535: 最大进程数软限制为 65535,即可以使用 ulimit -u 命令查看和修改的值。

hard nproc 65535: 最大进程数硬限制为 65535,即最大可分配的进程数。

soft nofile 65535:最大打开文件数软限制为 65535,即可以使用 ulimit -n 命令查看和修改的值。

hard nofile 65535:最大打开文件数硬限制为 65535,即最大可分配的文件数。

防盗链:

配置防盗链:

vim /usr/local/nginx/conf/nginx.conf
http {
......
    server {
    ......
        location ~* \.(jpg|gif|swf)$ {
            valid_referers none blocked *.kgc.com kgc.com;
            if ( $invalid_referer ) {
                rewrite ^/ http://www.kgc.com/error.png;
                #return 403;
            }
        }
    ......
    }
}
----------------------------------------------------------------------------------------------------------
~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的),如 http://www.kgc.com/game.jpg
我们使用 http://www.kgc.com 访问显示的图片,可以理解成 http://www.kgc.com/game.jpg 这个请求是从 http://www.kgc.com 这个链接过来的。
blocked:允许不是http://开头的,不带协议的请求访问资源; 
*.kgc.com:只允许来自指定域名的请求访问资源,如 http://www.kgc.com
 
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回 403 页面。

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


网页准备:
Web源主机(192.168.146.20)配置:
cd /usr/local/nginx/html
将game.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
...... 


echo "192.168.146.20 www.kgc.com" >> /etc/hosts 
echo "192.168.146.30 www.benet.com" >> /etc/hosts 


盗链网站主机(192.168.146.30):
cd /usr/local/nginx/html
vim index.html
...... 


echo "192.168.146.20 www.kgc.com" >> /etc/hosts

echo "192.168.146.30 www.benet.com" >> /etc/hosts

在盗图网站主机上进行浏览器验证

http://www.benet.com

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

你可能感兴趣的:(nginx,运维)