nginx的优化和防盗链 重要!!!

实验一、隐藏版本号

nginx的优化和防盗链 重要!!!_第1张图片

 要把nginx的版本号隐藏起来,防止恶意攻击

方法一:修改配置文件

在http模块中加入一个命令

server_token off;

过程:

 备份,改配置文件一定要备份

 修改配置文件

nginx的优化和防盗链 重要!!!_第2张图片

 在http模块中添加   server_tokens off;

重启一下服务 ,再回到网页查看版本号是否被隐藏

nginx的优化和防盗链 重要!!!_第3张图片

 这时发现已经被隐藏了

方法二:在源码包里修改

在nginx源码包里src/core/ 中nginx.h的文件中

修改源码包

 

nginx的优化和防盗链 重要!!!_第4张图片

 

在源码包里进行修改要想生效,需要在源码包的主目录重新编译一下

 

 nginx的优化和防盗链 重要!!!_第5张图片

 在配置文件中把server_tokens打开

重启服务 

nginx的优化和防盗链 重要!!!_第6张图片

 回到浏览器刷新一下,修改成功

总结:两个方法会一个即可,

实验二:nginx日志分割

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

 访问成功记载access.log

访问失败记录在error.log

先看一下日志的时间格式怎么写 

 写一个脚本

nginx的优化和防盗链 重要!!!_第7张图片

 

#!/bin/bash

# 获取日期
d=$(date +%Y-%m-%d)

# 定义存储目录
dir="/usr/local/nginx/logs"

# 定义需要分割的源日志
logs_file='/usr/local/nginx/logs/access.log'
logs_error='/usr/local/nginx/logs/error.log'

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

if [ ! -d "$dir" ]
then
    mkdir $dir
fi

# 移动日志并重命名文件
mv ${logs_file} ${dir}/access_${d}.log
mv ${logs_error} ${dir}/error_${d}.log

# 发送kill -USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件
kill -USR1 $(cat ${pid_file})

#日志文件清理,将30天前的日志进行清除
find $logs_path -mtime +30 -exec rm -rf {} \;

 

赋权执行

查看一下log里面有两个新的日志文件 

nginx的优化和防盗链 重要!!!_第8张图片

 里面记录了8月5日的日志

实验三:nginx的页面压缩

页面压缩可以节约带宽,提高用户的访问速度

压缩的功能是默认自带的,可以不取消注释

但是需要添加压缩细节,需要把gzip打开后进行配置

修改配置文件

 

nginx的优化和防盗链 重要!!!_第9张图片

 取消注释,开启gzip的压缩功能

nginx的优化和防盗链 重要!!!_第10张图片

 接着添加代码

   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;
#压缩的类型,哪些文档启用压缩功能
                            

重启服务使配置生效 

nginx的优化和防盗链 重要!!!_第11张图片

 刷新一下浏览器,看gzip压缩功能是否打开

实验四:图片缓存

nginx的优化和防盗链 重要!!!_第12张图片

 拖一个图片到html中

nginx的优化和防盗链 重要!!!_第13张图片

可以在网页看到拖入的图片,f12查看一下,Cache-Control:max-age=0 表示图片没有缓存,下次查看图片还需要把图片再下载一次,下面设一个缓存

nginx的优化和防盗链 重要!!!_第14张图片

在location块下面直接添加 

~*:正则匹配

\.:就是点

(gif|jpg|jepg|bmp|ico):里面不能用png格式的,会陷入死循环

获取图片的根目录为  root  html

expires 1d;    #设置缓存时间为一天;         

重启一下让配置生效 

nginx的优化和防盗链 重要!!!_第15张图片

 在浏览器里刷新一下并查看,缓存时间已经改为1天

连接超时:

连接超时在配置文件中的位置

nginx的优化和防盗链 重要!!!_第16张图片

 

http1.1会有一个keepalive模式,主要作用是告诉web服务器,他在处理完一个请求之后保持当前连接的tcp状态为打开状态,也就是在请求完之后不会立刻关闭,而是保持一个打开的状态。

如果当前连接有新的请求,服务端就会利用这个没有关闭的连接,继续给客户端响应,不需要再建立一个新的连接。大大节约了资源。

keepalive在一段时间之内保持打开状态,在这段时间内还是会占用资源,占用过多会影响性能

图中的keepalive_timeout  65;  意思是tcp连接最多可以保持65秒

设置为0,就是禁用了keepalive功能。只要请求完成立刻关闭tcp连接

实验五:nginx的并发设置

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

1、cpu的核心数来进行设置

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

2、设置worker进程绑定到指定的cpu的命令,减少cpu切换带来的开销。

确保worker进程在一个独立的cpu核心上运行(在工作中也用得到)

 修改配置文件

nginx的优化和防盗链 重要!!!_第17张图片

 把1改成4

重启服务 

nginx的优化和防盗链 重要!!!_第18张图片

 查看一下进程,worker进程变为4个

nginx的优化和防盗链 重要!!!_第19张图片

 每个work进程可以处理1024个文件数,总共可以处理的文件数为4*1024=4096个

但是还需要使用ulimit  -n解除限制

nginx的优化和防盗链 重要!!!_第20张图片

面试会问

设置worker进程绑定到指定的cpu的命令,减少cpu切换带来的开销。

确保worker进程在一个独立的cpu核心上运行(在工作中也用得到)

01表示cpu1  10表示cpu2  100表示cpu3  这个是按二进制转10进制算的

在生产中worker一般设置为4,访问量不大时1也足够了,如果要扩展,最多8或16个

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

worker_cpu_affinity  单个worker进程可以不绑定cpu

TIME_WAIT:不是一个报错信息,是tcp连接状态中的一种状态,出现在tcp连接的四次挥手中

处于FIN=1和ack=1之间

当连接的乙方发送FIN报文,而且收到了对方的ack报文之后,就会进入TIME_WAIT  tcp处理等待的状态,是有一个持续时间,65秒,确保网络中的所有数据包都被完全处理完毕。

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

2、避免连接复用,TIME_WAIT的时间太短,可能会导致旧的连接仍然在网络中,误认为是新的连接,导致连接复用,数据传输紊乱。

而且在连接的生命周期中,TIME_WAIT占有的资源是非常小的,而且对服务器整体性能的影响也很有限。大量的短链接频繁的创建的销毁,或者大并发连接时(负载均衡),TIME_WAIT连接会积累,服务器会出现大量的TIME_WAIT状态的连接,在这种情况下需要优化处理。

内核设置,进行优化

查看系统的所有tcp连接的状态:(必背,面试题)

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

tcp的连接状态:

CLOSED(关闭):表示该连接处于未活动状态,或者连接已经关闭。

LISTEN(监听):表示服务器正在等待来自客户端的连接请求,处于监听状态。

SYN_RECV(SYN 接收):表示服务器已经接收到来自客户端的 SYN 请求(连接请求),正在等待确认。

SYN_SENT(SYN 发送):表示应用程序已经向服务器发送了 SYN 请求,正在等待服务器确认。

ESTABLISHED(已建立):表示连接已经建立,正常的数据传输阶段。

FIN_WAIT1(终止等待1):表示应用程序已经发送了连接关闭请求(FIN),正在等待另一端的确认。

FIN_WAIT2(终止等待2):表示另一端已经确认连接关闭请求,正在等待另一端发送连接关闭请求。

CLOSE_WAIT(关闭等待):表示另一端已经关闭连接,但本地应用程序还未关闭连接。

CLOSING(正在关闭):表示双方同时尝试关闭连接。

TIME_WAIT(时间等待):表示连接已经关闭,但仍在等待一段时间,以确保网络中所有的数据包都已经被正确处理。

LAST_ACK(最后确认):表示应用程序已经发送了最后的确认,等待另一端的确认后进入 CLOSED 状态。

如何清理time_wait?   修改内核文件

内核文件位置

 

nginx的优化和防盗链 重要!!!_第21张图片

net.ipv4.tcp_syncookies = 1       
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理请求。

net.ipv4.tcp_tw_reuse=1
#让TIME_WAIT状态可以重用,这样即使TIME_WAIT占满了所有端口,也不会拒绝新的请求造成障碍 默认是0。

net.ipv4.tcp_tw_recycle=1         
#让TIME_WAIT尽快回收 默认0。

net.ipv4.tcp_fin_timeout=65        
#表示如果端口由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

实验六:配置防盗链

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

$invalid_referer:只要不是valid_referers设置现任的网站,都为true

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;
            }
        }
    ......
    }
}

 

网页准备:
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,运维)