Nginx优化与防盗链

Nginx优化与防盗链

资源列表

操作系统配置主机名IP
CentOS 73G2核nginx192.168.93.101
CentOS 7 图形化1G1核client192.168.93.11

基础环境

  • 关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
  • 关闭内核安全机制
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config 
  • 修改主机名
[root@localhost ~]# hostnamectl set-hostname nginx

一、Nginx服务优化

1.1、隐藏版本号

#使用命令查看Nginx版本号
[root@client ~]# curl -I http://192.168.93.101
HTTP/1.1 200 OK
Server: nginx/1.12.0	#版本号

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

1.1.1、修改配置文件方式
#将Nginx主配置文件中的server_tokens选项值设置为off,如果没有该配置项,加上即可
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;		#关闭版本号
[root@nginx ~]# nginx -t
[root@nginx ~]# systemctl restart nginx


#客户端再次访问,将看不到Nginx的版本号了
[root@client ~]# curl -I http://192.168.93.101
HTTP/1.1 200 OK
Server: nginx	#版本号隐藏 

若使用了PHP处理动态网页,且PHP配置文件中配置了fastcgi_param SERVER_SOFTWARE选项,则编辑php-fpm配置文件,将fastcgi_param SERVER_SOFTWARE对应的值修改为fastcgi_param SERVER_SOFTWARE nginx

[root@nginx ~]# vim /usr/local/nginx/conf/fastcgi.conf
fastcgi_param  SERVER_SOFTWARE    nginx;	#17行修改
[root@nginx ~]# nginx -t
[root@nginx ~]# systemctl restart nginx
1.1.2、设置版本信息
#Nginx源码文件nginx-1.12.0/src/core/nginx.h包含了版本信息,可以随意设置,然后重新编译安装,隐藏版本信息
[root@nginx ~]# vim /usr/src/nginx-1.12.0/src/core/nginx.h 	#编辑源码文件,这个是nginx的解压的目录路径
#define NGINX_VERSION      "1.1.1"	#修改版本号,随便改
#define NGINX_VER          "Web" NGINX_VERSION	#修改服务器类型,随便改
[root@nginx ~]# cd /usr/src/nginx-1.12.0/
[root@nginx nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install	#重新编译+安装
[root@nginx nginx-1.12.0]# cd /usr/local/nginx/conf/
[root@nginx conf]# vim nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens on;	#打开版本号
[root@nginx conf]# systemctl restart nginx

#再次访问即可看到之前设置的服务器类型和随意修改的版本号
[root@client ~]# curl -I http://192.168.93.101
HTTP/1.1 200 OK
Server: Web1.1.1		#显示设置的信息

2.1、修改用户与组

Nginx运行时进程需要有用户与组的支持,主进程由root创建,子进程由指定的用户与组创建,Nginx默认使用nobody用户账号与组账号。修改Nginx用户与组有两种方法,一种是在编译安装时指定用户与组,另一种是修改配置文件指定用户与组

2.1.1、指定用户与组参数
#编译Nginx时指定用户与组,也就是配置Nginx时,./configure后面的参数
[root@nginx nginx-1.12.0]# ./configure 
--prefix=/usr/local/nginx 
--user=nginx 	#指定用户名是nginx
--group=nginx 	#指定组名是nginx
--with-http_stub_status_module 
&& make && make install
2.1.2、配置用户与组
#修改Nginx配置文件nginx.conf指定用户与组
[root@nginx ~]# cd /usr/local/nginx/conf/
[root@nginx conf]# vim nginx.conf
user  nginx nginx;		#去掉注释,修改用户为nginx,组为nginx

#重启Nginx服务并查看进程运行情况
[root@nginx conf]# systemctl restart nginx
[root@nginx conf]# ps aux | grep nginx
root       5342  0.0  0.0  20548   604 ?        Ss   20:18   0:00 nginx: master process 	/usr/local/nginx/sbin/nginx
nginx      5344  0.0  0.0  20992  1048 ?        S    20:18   0:00 nginx: worker process
#可以看出Nginx的主进程由root创建,子进程由nginx

3.1、配置网页缓存时间

缓存可以避免客户端重复的请求,加快访问速度。缓存时间一般针对静态资源进行设置,对动态网页不用设置缓存时间

3.1.1、查看是否有缓存

以图片作为缓存对象,复制logo.jpg图片到Nginx的工作目录,访问http://192.168.93.101/logo.jpj,使用火狐浏览器右击“查看属性”->“网络”->“消息头”可以看到响应报文中没有图片的缓存信息

[root@nginx ~]# cd /usr/local/nginx/html/
[root@nginx html]# pwd	#我的是在图片是在这个图片下
/usr/local/nginx/html
[root@nginx html]# ls		
50x.html  index.html  logo.jpg

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.1.2、配置Nginx缓存
#修改Nginx的配置文件,在新的location段加入expires参数,指定缓存的时间,1d表示一天
[root@nginx ~]# cd /usr/local/nginx/conf/
[root@nginx conf]# vim nginx.conf
       location / {
            root   html;
            index  index.html index.htm;
        }
        location ~\.(gif|jpg|png|bmp|ico)$ { #缓存的图片格式
                root html;		#这个网站的根目录
                expires 1d;		#指定缓存时间
}
[root@nginx conf]# systemctl restart nginx
3.1.3、查看是否缓存图片

重启之后,查看响应报文中是否含有Expires参数。其中的Cahce-Control:max-age=86400表示缓存一天以秒为单位,一天以内访问这个页面,都是缓存中的数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.1、日志分割

Nginx没有类似于Apache的cronlog日志分割处理功能,但是可以通过Nginx的信号控制功能脚本来实现日志的自动分割

4.1.1、配置日志分割脚本
#编写脚本,把Nginx的日志文件/usr/local/nginx/logs/access.log移动到目录/var/log/nginx下面,以当前时间作为日志文件的名称,然后使用kill -USR1 创建新的日志文件/usr/local/nginx/logs/access.log,最后删除30天之前的日志文件
[root@nginx logs]# vim /opt/fenge.sh
#!/bin/bash
#FLIENAME: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 -USR1在重新创建个日志文件,这就是日志分割


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

4.1.2、执行分割,查看是否分割
[root@nginx logs]# chmod +x /opt/fenge.sh 	#添加权限
[root@nginx logs]# /opt/fenge.sh 		#执行分割脚本
[root@nginx logs]# ls -lh /var/log/nginx/	
总用量 296M
-rw-r--r-- 1 nginx root 296M 42 20:58 test.com-access.log-20240401	#按日志分割了日志文件
#从上面的分割日志文件可以看出的确被分割了,因为这个日志文件的占用空间是296M
[root@nginx logs]# ls -lh /usr/local/nginx/logs/access.log 
-rw-r--r-- 1 nginx root 0 42 20:59 /usr/local/nginx/logs/access.log
#原来的日志文件重新创建,可以看出重建的日志文件,里面没有任何日志信息,因此占用空间也是几乎没有
4.1.3、设置crontab计划任务
#每天的凌晨1:30分执行脚本,进行日志分割
[root@nginx ~]# crontab -e
30 1 * * * /opt/fenge.sh

5.1、设置连接超时

#为了避免一个客户端长时间占用连接,造成资源浪费,可以设置相应的连接超时参数
#修改配置文件nginx.conf,设置keepalive_timeout超时时间
[root@nginx ~]# cd /usr/local/nginx/conf/
[root@nginx conf]# vim nginx.conf
http {
    #keepalive_timeout  0;
    keepalive_timeout  65 180;	#默认存在,默认65秒,设置超时时间是180秒

#keepalive_timeout第一参数指定了与客户端的keep-alive连接超时时间,服务器将在这个时间后关闭连接。可选的第二个参数制定了在响应头keep-Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接
[root@nginx conf]# systemctl restart nginx

使用火狐浏览器访问地址,可以看到响应头中显示了180秒

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#除了keepalive_timeout参数之外,还可以增加其他超时参数,比如Client_header_timeout参数可用于指定等待客户端发送请求头的超时时间、Client_body_timeout参数可用于指定请求体超时[root@nginx conf]# vim nginx.conf
 http {
    keepalive_timeout  65 180;
    client_header_timeout 80;
    client_body_timeout 80;

#请求头和请求体只能在特殊情况下才能显示效果

二、Nginx深入优化

2.1、更改进程数

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

作用:可以提高服务效应速度、减少了系统的开销

[root@nginx conf]# ps aux | grep nginx		#查看Nginx运行的个数
root       1598  0.0  0.0  20548   616 ?        Ss   07:54   0:00 nginx: master process /usr/local/nginx/sbin/nginx		#master process进程
nginx      1599  0.0  0.0  20992  1568 ?        S    07:54   0:00 nginx: worker process		#worker process子进程


#修改Nginx配置文件的worker_processes参数
[root@nginx conf]# cat /proc/cpuinfo | grep -c "physical"	#查看CPU核数
4	
[root@nginx conf]# vim nginx.conf
worker_processes  4;	#一般设置为CPU的个数或核数,高并发情况下设置CPU个数或核数的2倍

[root@nginx conf]# systemctl restart nginx

[root@nginx conf]# ps aux | grep nginx		#查看变换开启了4个子进程一个主进程
root       1798  0.0  0.0  20548   612 ?        Ss   08:08   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      1800  0.0  0.0  20992  1320 ?        S    08:08   0:00 nginx: worker process
nginx      1801  0.0  0.0  20992  1320 ?        S    08:08   0:00 nginx: worker process
nginx      1802  0.0  0.0  20992  1320 ?        S    08:08   0:00 nginx: worker process
nginx      1803  0.0  0.0  20992  1056 ?        S    08:08   0:00 nginx: worker process

#为了充分利用硬件的多核多CPU,可以分配不同的进程给不同的CPU处理。在一台4核CPU服务器上,可以设置每个进程分别由不同的CPU核心处理,达到CPU的性能最大化
[root@nginx conf]# vim nginx.conf

worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

2.2、配置网页压缩

Nginx的ngx_http_gizp_module压缩模块提供了对文件内容的压缩功能,默认已经安装

网页压缩的作用:节约网站的宽带,提升用户的访问体验

#修改Nginx的配置文件,加入压缩功能参数
[root@nginx conf]# vim nginx.conf
gzip  on;	#取消注释
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_min_length 1k;
gzip_vary on;
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss;

#gzip on:开启gzip压缩输出;
#gzip_buffers 4 16k:表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
#gzip_http_version 1.1:用于设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,但处理较慢,也比较消耗CPU资源
#gzip_comp_level 2:用来指定gizp压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,使用默认即可
#gzip_min_length 1k:用于设置允许压缩的页面最小字节数
#gzip_vary on:选项可以让前端的缓存服务器经过gizp压缩的页面
#gzip_types text/plain:压缩类型,是让对哪些网站文档启用压缩功能
[root@nginx conf]# systemctl restart nginx

在Nginx工作目录建立一个超过1k大小的html文件,然后进行范文验证

[root@nginx conf]# cd /usr/local/nginx/html/	#这是我的网站根目录
[root@nginx html]# ll -lh
-rw-r--r-- 1 root root 1.9K 43 08:28 index.html

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三、配置防盗链

资源列表

IP地址域名用途
192.168.93.101www.bt.com源主机
192.168.93.102www.test.com盗链主机
192.168.93.11-CentOS图形化client访问

基础环境

  • 关闭防火墙
#三台主机都要做
[root@localhost ~]# systemctl stop firewalld 
[root@localhost ~]# systemctl disable firewalld 
  • 关闭内核安全机制
#三台主机都要做
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config 
  • 修改主机名
[root@localhost ~]# hostnamectl set-hostname bt.com
[root@localhost ~]# hostnamectl set-hostname test.com
[root@localhost ~]# hostnamectl set-hostname client

3.1、配置hosts解析

#配置client客户端的域名设置
[root@client ~]# vim /etc/hosts
192.168.93.101 www.bt.com
192.168.93.102 www.test.com

#配置源主机和盗链主机的hosts文件
[root@bt ~]# vim /etc/hosts
192.168.93.101 www.bt.com
192.168.93.102 www.test.com
[root@test ~]# vim /etc/hosts
192.168.93.101 www.bt.com
192.168.93.102 www.test.com

3.2、配置源主机

#把图片logo.jpg放到源主机(bt.com)的工作目录下。
[root@bt ~]# cd /usr/local/nginx/html/
[root@bt html]# ls
50x.html  index.html  logo.jpg

3.3、配置盗链主机

#在盗链主机(test.com)的工作目录编写盗链页面index.html,盗取源主机(bt.com)的图片
[root@test ~]# cd /usr/local/nginx/html/
[root@test html]# vim index.html 
<!DOCTYPE html>
<html>
<head>

<p><em>Thank you for using nginx.</em></p>
<img src="http://www.bt.com/logo.jpg"/>		#盗取源主机的网站路径
</body>
</html>

3.4、访问盗链页面

#访问盗链的页面http://www.test.com/index.html查看是否盗链成功
#然后再图片上右击“查看图像信息”点击“复制图像连接”随便找个地方粘贴,可以看到图片的网址是http://www.bt.com/logo.jpg,也就是www.test.com成功盗取了www.bt.com的图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.5、配置Nginx防盗链

#Nginx的防盗链原理是加入了location项,用正则表达式过滤图片类型文件,对于信任的网址可以正常使用,不信任的网址返回响应的错误图片。在源主机(bt.com)的配置文件中加入如下代码
[root@bt ~]# cd /usr/local/nginx/conf/
[root@bt conf]# vim nginx.conf
location ~* \.(gif|jpg|jpeg)$ {		#不能包含png
         valid_referers *.bt.com bt.com;

        if ($invalid_referer) {
        rewrite ^/ http://www.bt.com/error.png;
}
}

#分析上述代码
#~* \.(gif|jpg|jpeg)$:这段正则表达式表示匹配不区分大小写,以.jpg或.gif或.swf结尾的文件;
#Valid_regerers:设置信任的网站,可以正常使用图片;
#后面的网址或者域名:referer中包含相关字符产的网址
#if语句:如果链接的来源域名不在valid_regerers所列出的列表中,$invalid_regerer为1,则执行后面的操作,即进行重写或返货403页面



#把图片error.png放到源主机(bt.com)的工作目录下。
[root@bt ~]# cd /usr/local/nginx/html/
[root@bt html]# ls
50x.html  error.png  index.html  logo.jpg


#重启服务器,重新访问http://www.test.com/index.html,如果现实的是被重写的图片,说明防盗链配置成功
[root@bt html]# systemctl restart nginx

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四、FPM参数优化

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

下面是执行步骤

4.1、配置FPM优化
4.1.1、安装FPM模块

安装LNMP的时候已经,或者重新安装,这里省略

4.1.2、调整FPM参数

FPM进程有两种启动方式,由pm参数指定,分别是static和dynamic,前者将产生固定数量的fpm进程,后者将以动态的方产生fpm进程

Static的方式可以使用pm.max——children指定启动的进程数量。Dynamic方式的参数要根据服务器的内存与服务负载进行调整

表-Dynamic方式的参数

选项描述
Pm.max_children指定启动最大的进程数量
Pm.start_servers动态方式下初始的fpm进程数量
Pm.min_spare_servers动态方式下最小的fpm空闲进程数
Pm.max_spare_servers动态方式下最大的空闲进程数
#假设:现有云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近1G,处理比较慢,对参数进行优化处理
[root@bt ~]# cd /usr/local/php5/etc/
[root@bt etc]# vim php-fpm.conf
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8

#FPM启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多可以有20个进程存在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值