Nginx优化和Nginx防盗链

文章目录

    • Nginx优化和Nginx防盗链
      • 一、Nginx优化
        • 1.1 隐藏版本号
          • 方式一:修改配置文件方式
          • 方式二:修改源码文件,重新编译安装
        • 1.2 修改用户与组
        • 1.3 设置合理缓存时间
        • 1.4 日志分割
          • 拓展time:
        • 1.5 连接超时
        • 1.6 Nginx affinity配置
        • 1.7 配置网页压缩
        • 1.8 time_wait端口重利用
        • 1.9 静态资源不缓存
        • 1.10 提高静态文件资源读取(sendfile)
        • 1.11 文件的高效读取 ——tcp_nopush和文件的传输实时性——tcp_nodelay
        • 1.12 nginx 加密传输https优化
      • 二、 Nginx入门——防盗链
        • 2.1 什么是资源盗链?
        • 2.2 配置防盗链
        • 2.3 验证测试

Nginx优化和Nginx防盗链

一、Nginx优化

1.1 隐藏版本号

可以使用Fiddle工具抓取数据包,查看Nginx版本,也可以在Centos中使用命令 curl -I http://192.168.10.10 显示响应报文首部信息。

curl -I http://192.168.10.10

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

方式一:修改配置文件方式
vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;
    sendfile        on;
    keepalive_timeout  65;

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

验证测试:

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

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

方式二:修改源码文件,重新编译安装
vim /opt/nginx-1.12.0/src/core/nginx.h
#define NGINX_VERSION "1.1.1" 					//修改版本号
#define NGINX_VER "IIS" NGINX_VERSION 			//修改服务器类型

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

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

image-20220721162730791

nginx -V //查看安装选项信息
cd /opt/nginx-1.12.2/
    ./configure --....
    make //如果已经修改了配置文件,不想被覆盖,就不执行make install
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak //备份原文件
cp /opt/nginx-1.12.2/objs/nginx /usr/local/nginx/sbin/    //复制编译后的可执行文件至指定目录
    systemctl restart nginx

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

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

1.2 修改用户与组

vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; 		//取消注释,修改用户为 nginx ,组为 nginx

systemctl restart nginx

ps aux | grep nginx | grep -v grep
主进程由root创建,子进程由nginx创建

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

image-20220721170919831

1.3 设置合理缓存时间

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

一般针对静态页面设置,对动态网页不设置缓存时间。

vim /usr/local/nginx/conf/nginx.conf
http {
	server { 
		location / {
			root html;
			index index.html index.htm;
		}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { //加入新的 location,以图片作为缓存对象
			root html;
			expires 1d;						//指定缓存时间,1天   //30s-30秒  30m-30分钟 30h-30小时
		}
	}
}

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

复制一张图片到/usr/local/nginx/html/目录下

image-20220721172445464

通过http://192.168.10.10/现实.png来访问存放在目录下的图片。

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

1.4 日志分割

#!/bin/bash
#显示前一天的时间
d=$(date -d "-1 day" "+%Y%m%d")
#设置路径变量和pid变量
logs_path="/var/log/nginx"
pid=`cat /usr/local/nginx/logs/nginx.pid`
#生成日志路径
[ -d $logs_path ] || mkdir -p $logs_path
#移动日志文件
mv /usr/local/nginx/logs/access.log ${logs_path}/setting.com-access.log-${d}
#移动建立日志文件
kill -USR1 ${pid}
#删除30天之前的日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;

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

source /root/log-segmentation.sh
ls /var/log/nginx
ls /usr/local/nginx/logs/access.log 

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

crontab -e
0 1 * * * /root/log-segmentation.sh

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

拓展time:

ctime

  • change time(也有人说是 status time),改变时间,变更时间,最后一次改变文件的时间。指的是文件的元数据,状态最后被变更的时间。改变文件的元数据,即:属性。例如,更改文件的 inode、权限、所属组等。
  • ctime 文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变(即inode内容发生改变和Block内容发生改变时)

mtime

  • modify time,modified time,modification time,修改时间,最后一次修改文件的时间,指的是文件内容最后被修改的时间。
  • mtime 是在写入文件时随文件内容的更改而更改。
  • 与ctime的区别就是,ctime是修改文件权限时变化,mtime是修改文件内容发送变化。

atime

  • access time,访问时间,文件最后一次被访问的时间,或者叫文件最后被读取的时间,因此阅读一个文件会更新它的访问时间。

1.5 连接超时

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

vim /usr/local/nginx/conf/nginx.conf
http {
...... 
    keepalive_timeout 65 180; //tcp连接的超时时间
    client_header_timeout 80; //等待客户端发出请求头的超时时间,超时后会发送408错误
    client_body_timeout 80; //设置客户端发送请求体的超时时间
...... 
}
systemctl restart nginx

keepalive_timeout
指定KeepAlive的超时时间(timeout)。指定每个TCP连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。

第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送Keep-Alive 响应头。

client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)请求超时。

client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)请求超时。

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

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

1.6 Nginx affinity配置

Nginx采用多进程Master/Worker结构,Worker进程数为CPU个数时工作效率最高,Nginx通过affinity为每个Worker进程绑定一个CPU,避免进程切换带来的消耗,同时能够保证缓存命中率。

cat /proc/cpuinfo | grep -c "core id"	//查看cpu核数
ps aux | grep nginx	| grep -v grep	//查看nginx主进程中包含几个子进程
vim /usr/local/nginx/conf/nginx.conf
worker_processes  2;				#修改为核数相同或者2倍
worker_cpu_affinity 01 10;			#设置每个进程由不同cpu处理,进程数配2 4 6 8分别为0001 0010 0100 1000 

2核CPU,开启2个进程
worker_processes 2;
worker_cpu_affinity 01 10;
01表示启用第一个CPU内核,10表示启用第二个CPU内核
worker_cpu_affinity 01 10;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。

2核CPU,开启4个进程
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
开启了四个进程,它们分别对应着开启2个CPU内核

4核CPU,开4个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推

4核CPU,开启2个进程
worker_processes 2;
worker_cpu_affinity 0101 1010;
0101表示开启第一个和第三个内核,1010表示开启第二个和第四个内核
2个进程对应着四个内核

8核CPU,开8个进程
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
2核是 01,四核是00018核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。

image-20220721194449895

image-20220722134640010

image-20220722135714536

1.7 配置网页压缩

vim /usr/local/nginx/conf/nginx.conf
http {
...... 
   gzip on;							#取消注释,开启gzip压缩功能
   gzip_min_length 1k;      		#最小压缩文件大小
   gzip_buffers 4 64k;      		#压缩缓冲区,大小为464k缓冲区,作用是压缩时所用的缓存大小
   gzip_http_version 1.1;   		#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
   gzip_comp_level 6;       		#压缩比率,1-9个等级,等级越高,压缩性能越好,占用cpu资源越高
   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优化和Nginx防盗链_第17张图片

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

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

1.8 time_wait端口重利用

time_wait就是tcp四次断开时,第二次fin报文等到完全断开的等待时间。

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

地址再分配(端口重用):

Time_wait状态下的套接字端口号可以重新分配给新的套接字.在使用前修改SOL_SOCKET中的SO_REUSEADDR状态(=1可重用)。

调整内核参数: 让time_wait状态重用(让占用的端口复用)
vim /etc/sysctl.conf			
net.ipv4.tcp_tw_reuse = 1		# 让占用的端口复用
net.ipv4.tcp_timestamps = 1		# 时间戳

查看自定义设置的内核参数
sysctl -p
查看系统所有的内核参数
sysctl -a

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

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

1.9 静态资源不缓存

location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
                add_header Cache_Control no-store; //cache_control作用于http2.0
                add_header Pragma no-cache;//pragma兼容http1.0
     }
//no-cache:客户端可以缓存,但是每次使用缓存资源都必须发请求验证其有效性。如果没有变化返回304,如果发生变化,那理论上就是200。

//no-store:禁止缓存,不使用任何缓存

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

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

1.10 提高静态文件资源读取(sendfile)

传统文件读取方式:硬件--->内核--->用户空间--->程序空间--->程序内核空间--->套接字服务
开启sendfile服务后:硬件--->内核--->程序内核空间--->套接字服务

sendfile = off 时,应用程序读取磁盘中的文件以字节流的形式从磁盘中加载文件,然后再将文件以字节流的形式复制到内核中。内核在把文件推送到客户端。
sendfile = on 时,应用程序直接向内核发送指令,让内核去读文件。读完文件内核直接推送给NC。只有一次复制操作,实现异步网络IO形式。因此,性能会有很大的提升。
具体还要根据实际使用情况来配置sendfile。当读取服务不能解析大量的文件时。还是建议将sendfile配置为off

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;  //开启sendfile功能,默认开启
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    
systemctl restart nginx.service

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

1.11 文件的高效读取 ——tcp_nopush和文件的传输实时性——tcp_nodelay

tcp_nodelay:

Nginx的 tcp_nodelay 选项使得在打开一个新的 socket 时增加了tcp_nodelay选项。
但这时会造成一种情况:
终端应用程序每产生一次操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据以及40个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞。
为了避免这种情况,TCP堆栈实现了等待数据 0.2秒钟,因此操作后它不会发送一个数据包,而是将这段时间内的数据打成一个大的包。这一机制是由Nagle算法保证。

Nagle化后来成了一种标准并且立即在因特网上得以实现。现在已经成为默认配置。

但有些场合下把这一选项关掉也是合乎需要的。比如发送小块数据的应用场景中,可以选择立即发送数据或者等待产生更多的数据然后再一次发送两种策略。对应马上发送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。如果请求立即发出那么响应时间也会快一些。以上操作可以通过设置套接字的 tcp_nodelay = on 选项来完成,这样就禁用了Nagle 算法。(不需要等待0.2s)

tcp_nopush:

在 nginx 中,tcp_nopush 配置和 tcp_nodelay “互斥”。它可以配置一次发送数据的包大小。也就是说,它不是按时间累计 0.2 秒后发送包,而是当包累计到一定大小后就发送。
在 nginx 中,tcp_nopush 必须和 sendfile 搭配使用。

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on; // tcp_nodelay on;
    
    systemctl restart nginx.service

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

1.12 nginx 加密传输https优化

nginx -V //查看是否配置ssl模块
[root@www nginx-1.12.2]# nginx -V
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
//没有着重新添加ssl
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
    
make
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp -f ./objs/nginx /usr/local/nginx/sbin/
systemctl restart nginx.service

image-20220724181936915

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

image-20220724182138387

image-20220724182113984

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

以上就是ssl模块后添加过程。

添加ssl证书,这里通过openssl自建证书签发使用的。

首先 安装 openssl :
yum install openssl
创建保存证书的目录:
mkdir -p /usr/local/ssl

生成证书: 
首先,进入你想创建证书和私钥的目录,例如:
cd /usr/local/ssl

创建服务器私钥,命令会让你输入一个口令:
openssl genrsa -des3 -out server.key 1024

创建签名请求的证书(CSR):
openssl req -new -key server.key -out server.csr

在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:
cp server.key server.key.org

最后标记证书使用上述私钥和CSR:
openssl rsa -in server.key.org -out server.key
openssl rsa -in server.key -out server.pem
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
    
    sytemctl restart nginx

image-20220724192051963

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

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

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

验证测试:

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

二、 Nginx入门——防盗链

2.1 什么是资源盗链?

资源盗链是指内容不在自己服务器上,而通过技术手段,绕过别人的内容,比如热门的图片放到自己页面上,展示给访客,以此来盗取别人网站的流量,即蹭流量。

所以Nginx对这个进行了防护,并提供了防盗链的功能。基本原理就是判断访问本站资源是否通过本站域名来访问的。不是则通过重定向指定到提示错误页面,也可以通过return 403表示拒绝访问。

2.2 配置防盗链

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	......
	location ~* \.(gif|jpg|jepg|bmp|png|ico)$ {
                valid_referers *.setting.com setting.com;
                if ( $invalid_referer) {
                        return 403;
                }
	......
	}
}

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

~* .(jpg|gif|jepg|bmp|ico|bng)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
后面的网址或者域名 :referer 中包含相关字符串的网址;
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回 403 页面。

2.3 验证测试

cd /usr/local/nginx/html
vim index.html
...... 
<img src="http://www.setting.com/xianshi.png"/>
</body>
</html>

echo "192.168.10.10 www.setting.com" >> /etc/hosts 
echo "192.168.10.11 www.test.com" >> /etc/hosts 

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

image-20220722161226454

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

你可能感兴趣的:(nginx,运维,linux,服务器)