Nginx优化与防盗链

目录

 

一、 Nginx的优化

1.1 配置Nginx隐藏版本号

1.2 Nginx隐藏版本号的方法

1.2.1 修改配置文件法

1.2.2  修改配置文件方式,重新编译安装

1.3  修改用户与组

1.3.1 编译安装时更改

1.3.2  修改配置文件

1.4 配置Nginx网页缓存时间

1.5  实现Nginx的日志切割

1.6  配置Nginx实现连接超时

 1.7 更改Nginx运行进程数

1.8  配置Nginx实现网页压缩功能 

二、配置防盗链

三、fpm参数优化

四、总结


一、 Nginx的优化

1.1 配置Nginx隐藏版本号

隐藏Nginx版本号,避免安全漏洞泄漏

查看Nginx的版本号

可以使用 Fiddler 工具抓取数据包。

查看 Nginx版本,也可以在 CentOS 中使用

命令 curl -I http://192.168.91.140 查看

 

1.2 Nginx隐藏版本号的方法

隐藏Nginx 版本号有两种方式,第一种是修改Nginx 源码文件,指定不显示版本号,第二种是修改Nginx 的主配置文件。

1.2.1 修改配置文件法

vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    #20行左右;添加;关闭版本号
    server_tokens off;
    ......
}
 
systemctl restart nginx
curl -I http://192.168.111.30  
重启服务,访问网站使用curl -I命令检测

 

1.2.2  修改配置文件方式,重新编译安装

vim /opt/nginx-1.20.02/src/core/nginx.h
#define NGINX_VERSION "1.1.1" 					#修改版本号
#define NGINX_VER "IIS" NGINX_VERSION 			#修改服务器类型
cd /opt/nginx-1.20.02/   进入到nginx-1.20.02目录下
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
 
make  进行编译  

 

##把/usr/local/nginx/sbin目录下的ngonx移到/usr/local/nginx目录下
做个备份,以防新的文件不能使用,可以回滚
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/
##查看
ls /usr/local/nginx
##把objs目录下的nginx 移到 /usr/local/nginx/sbin目录下
cp objs/nginx /usr/local/nginx/sbin/ 
##查看
ls /usr/local/nginx/sbin/
 

vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens on;   ###开启版本信息后重启fuwu
	......
}
 
 

systemctl restart nginx.service
curl -I http://192.168.111.30
##重启服务,进行测试

 

1.3  修改用户与组

Nginx 运行是进程需要有用户和组的支持,用以实现对网站文件读取是进行访问控制。

修改Nginx 用户和组有梁种方法,一种就是在编译安装时指定用户和组,另一种时修改配置文件指定的用户和组。

1.3.1 编译安装时更改

请看之前博客中的编译安装Nginx

cd /opt/nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \   ##指定用户名
--group=nginx \   ##指定组名
--with-http_stub_status_module
 
make && make install

1.3.2  修改配置文件

vim /usr/local/nginx/conf/nginx.conf
#取消注释,修改用户为nginx,组为 nginx
user nginx nginx;
 
systemctl restart nginx
 
#主进程由root创建,子进程由nginx创建
ps aux | grep nginx

1.4 配置Nginx网页缓存时间

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

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天
		}
......
	}
}
 
systemctl restart nginx

在Linux系统中,打开火狐浏览器,右击点查看元素
选择 网络 ---> 选择 HTML、WS、其他 
访问 http://192.168.111.40 ,双击200响应消息查看响应头中包含 Cahce-Control:max-age=86400 表示缓存时间是 86400 秒。也就是缓存一天的时间,一天之内浏览器访问这个页面,都是用缓存中的数据,而不需要向 Nginx 服务器重新发出请求,减少了服务器的使用带宽。
 
 

cd /usr/local/nginx/html
先将game.jpg文件传到/usr/local/nginx/html目录下
vim index.html
...... 
<img src="huoche.jpg"/>				#网页中插入图片
</body>
</html>


 

1.5  实现Nginx的日志切割

 1、随着Nginx运行时间增加,日志也会增加。太大的日志文件对监控是一个大灾难。所以需要定期进行日志文件的切割
2、Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割(Kill -HUP cat /xxx/log/nginx.pid #平滑重启nginx,类似reload)
-QUIT :结束进程;-USR1:日志分割;-USR2:平滑升级
3、通过Linux的计划任务周期性地进行日志切割
4、编写脚本进行日志切割示例
 

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
error_log  logs/error.log  info;
 
 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; ###去除前面#号
 
[root@localhost ~]# 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
 
[root@localhost ~]# vim 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 -HUP $(cat $pid_path) ###生成新的日志
find $logs_path -mtime +30 | xargs rm -rf ###删除30天前的日志(xargs用来传递参数)
 
[root@localhost ~]# chmod +x fenge.sh
[root@localhost ~]# ./fenge.sh
[root@localhost ~]# cd /var/log/nginx/
[root@localhost nginx]# ll
总用量 44
-rw-r--r--. 1 root root 44866 10月 16 15:11 test.com-access.log-20201015 ###运行之后生成昨天的日志
crontab -e
0 1 * * * /opt/logfenge.sh##设置周期性计划任务

 扩展:

在linux操作系统中,每个文件都有很多的时间参数,其中有三个比较主要,分别是ctime,atime,mtime

ctime(status time):
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,
只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。
atime(accesstime):
当使用这个文件的时候就会更新这个时间

mtime(modification time):
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别

1.6  配置Nginx实现连接超时

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

vi /usr/local/nginx/conf/nginx.conf
   #keepalive_timeout  0;
    keepalive_timeout 65 180;
    client_header_timeout 80;    ##等待客户端发送请求头的超时时间 超时会发送408错误
    client_body_timeout 80;    ##设置请求体的读超时时间
 
systemctl restart nginx.service
 
 
keepalive_timeout
指定KeepAlive的超时时间(timeout)。
指定每个TCP连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。
Nginx的默认值是65秒,有些浏览器最多只保持60秒,所以可以设定为60秒。
若将它设置为0,就禁止了keepalive连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。
这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。
没有这个参数,Nginx不会发送Keep-Alive响应头。
 
client_header_timeout
客户端向服务端发送一个完整的request header的超时时间。
如果客户端在指定时间内没有发送一个完整的reguest header,Nginx返回HTTP 408(Request Timed out)。
 
client_body_timeout
指定客户端与服务端建立连接后发送request body的超时时间。
如果客户端在指定时间内没有发送任何内容,Nginx返回HTTP 408(Request Timed Out)。


 在浏览器上查看:

 1.7 更改Nginx运行进程数

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

更改进程数的配置方法:

修改配置文件,修改进程配置参数
修改配置文件的worker_processes参数
               —般设为CPU的个数或者核数

                在高并发情况下可设置为CPU个数或者核数的2倍

增加进程数,可减少了系统的开销,提升了服务速度
使用ps aux查看运行进程数的变化情况

cat /proc/cpuinfo | grep -c "physical id" #统计CPU核数
ps aux | grep nginx

默认情况,Nginx的多个进程可能跑在一个CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU

在一台4核物理服务器,进行配置,将进程进行分配

#修改配置文件,这里了解一下即可
vim /usr/local/nginx/conf/nginx.conf
#第3行;修改为核数相同或者2倍
worker_processes  4;
#添加;设置每个进程由不同cpu处理,进程数配2 4 6 8分别为0001 0010 0100 1000
worker_cpu_affinity 0001 0010 0100 1000;
 
systemctl restart nginx

1.8  配置Nginx实现网页压缩功能 

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

压缩功能参数:

gzip on:开启gzip压缩输出

gzip_min_length 1k:设置允许压缩的页面最小字节数

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压缩的页面

vim /usr/local/nginx/conf/nginx.conf
gzip on;							#取消注释,开启gzip压缩功能
   gzip_min_length 1k;      		#最小压缩文件大小
   gzip_buffers 4 64k;      		#压缩缓冲区,大小为4个64k缓冲区
   gzip_http_version 1.1;   		#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
   gzip_comp_level 6;       		#压缩比率
   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;		
#压缩类型,表示哪些网页文档启用压缩功能
 
cd /usr/local/nginx/html
先将图片文件传到/usr/local/nginx/html目录下
vim index.html
......
#网页中插入图片
<img src="huoche.jpg"/>
 
systemctl restart nginx.service
 
在Linux系统中,打开火狐浏览器,右击点查看元素选择网络--->选择HTML、ws、其他
访问http://192.168.111.40,双击200响应消息查看响应头中包含Content-Encoding: gzip


 

二、配置防盗链

在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失

Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	......
        location ~*\.(jpg|gif|swf)$ {
          valid_referers *.jzm.com jzm.com;
          if ( $invalid_referer ) {
          rewrite ^/ http://www.jzm.com/error.png;
          #return 403;
          }
        }
	......
	}
}
 
systemctl restart nginx

--------------解释--------------
~* \.(jpg|gif|jepg|bmp|ico)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif或.swf结尾的文件;

valid_referers:设置信任的网站,可以正常使用图片;

none:允许没有http_refer的请求访问资源(根拼Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer字段的),如http://www.jzm.com/caocao.jpg
我们使用 http://www.jzm.com访问显示的图片,可以理解成http://www.jzm.com/caocao.jpg 这个请求是从http://www.jzm.com这个链接过来的。

blocked:允许不是http://开头的,不带协议的请求访问资源;
if语句:链接来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回403页面。

cd /usr/local/nginx/html
将caocao.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
...... 
<img src="huoche.jpg"/>
</body>
</html>
 
echo "192.168.111.40 www.jzm.com" >> /etc/hosts
echo "192.168.111.30  www.daotu.com" >> /etc/hosts

 

2. 盗链网站主机(192.168.111.30)

#先安装nginx服务
cd /usr/local/nginx/html
vim index.html
...... 
<img src="http://www.jzm.com/huoche.jpg"/>
</body>
</html>
 
echo "192.168.111.40 www.jzm.com" >> /etc/hosts
echo "192.168.111.30  www.daotu.com" >> /etc/hosts

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

http://www.daotu.com

 

三、fpm参数优化

1、Nginx 的 PHP 解析功能实现如果是交由 FPM 处理的,为了提高 PHP 的处理速度,可对
FPM 模块进行参数跳转。
2、FPM 优化参数:
pm 使用哪种方式启动 fpm 进程,可以说 static 和 dynamic,前者将产生固定数量的 fpm 进程,后者将以动态的方式产生 fpm 进程
pm.max_children :static 方式下开启的 fpm 进程数
pm.start_servers :动态方式下初始的 fpm 进程数量
pm.min_spare_servers :动态方式下最大的 fpm 空闲进程数
pm.max_spare_servers :动态方式下最大的 fpm 空闲进程数
3、优化原因:服务器为云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近1G,处理比较慢
4、优化参数调整
FPM启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多
可以有20个进程存在

vim /usr/local/php/etc/php-fpm.conf 
pid = run/php-fpm.pid
 
vim /usr/local/php/etc/php-fpm.d/www.conf
--96行--
pm = dynamic				#fpm进程启动方式,动态的
--107行--
pm.max_children=20			#fpm进程启动的最大进程数
--112行--
pm.start_servers = 5		#动态方式下启动时默认开启的进程数,在最小和最大之间
--117行--
pm.min_spare_servers = 2	#动态方式下最小空闲进程数
--122行--
pm.max_spare_servers = 8	#动态方式下最大空闲进程数
 
 
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`			#重启php-fpm
netstat -anpt | grep 9000
 

四、总结

1. Nginx  优化:

      配置nginx影藏版本号;
     修改nginx用户和组;
     配置nginx网页缓存时间
     配置nginx实现连接超时
     更改nginx工作进程数
     配置nginx实现网页压缩功能
     实现nginx的日志切割
2. Nginx  防盗链
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值