Nginx优化与防盗链

1:nginx服务优化

1.1:隐藏版本号

在生产环境中, 需要隐藏Nginx 的版本号, 以避免泄漏Ngi nx 的版本, 使攻击者不能针对特定版本进行攻击。在隐藏版本号之前, 可以使用Fiddler 工具抓取数据包, 查看Nginx版本, 也可以在CentOS 中使用命令curl -I http :/1192 . 168.0 . 102/查看。

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

( 1 ) 修改配置文件方式
将Nginx 主配置文件中的server_tokens 选项值设置为off,如没有该配置项, 加上即可

(root@www ~]# cd /usr/local/nginx/conf/
(root@www ~]# vim nginx.conf

.......//省略内容
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;           //关闭版本号
..........//省略内容

 若使用了PHP 处理动态网页, 且PHP 配置文件中配置了fastcg i_param SERVER_SOFTWARE 选项, 则编辑ph p-fpm 配置文件, 将fastcgi_param SERVER_SOFTWARE 对应的值修改为fastcgi_param SERVER_ SOFTWARE nginx 。
再次访问网址, 只显示N ginx, 版本号已经隐藏。

( 2 ) 设置版本信息
Nginx 源码文件ng inx-1.1 2 .0/src/core/nginx . h 包含了版本信息, 可以随意设置, 然后重新编译安装, 隐藏版本信息。

[root@localhost nginx-1.12.0]# cat src/core/nginx.h
#define nginx_version      1012000
#define NGINX_VERSION      "1.12.0"     //修改版本号
#define NGINX_VER          "IIS/" NGINX_VERSION     //修改服务器类型

[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx/ --user=nginx --group=nginx --with-http_stub_status_module && make && make install
[root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf

server_tokens on;   //打开版本号

[root@localhost nginx-1.12.0]# systemctl restart nginx

 1.2:修改用户和组

Nginx 运行时进程需要有用户与组的支持, 用以实现对网站文件读取时进行访问控制。主进程由root 创建, 子进程由指定的用户与组创建。Nginx 默认使用nobody 用户帐号与组帐号, 一般也要进行修改。修改Nginx 用户与组有两种方法, 一种是在编译安装时指定用户与组, 另一种是修改配置文件指定用户与组。

( 1 ) 指定用户与组的参数
编译Nginx 时指定用户与组, 就是配置Ngi nx 时, 在/configure 后面指定用户与组的参数

[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx/

--user=nginx  //指定用户名是nginx

--group=nginx   //指定用户组是nginx

--with-http_stub_status_module && make && make install

( 2 ) 配置用户与组
修改Nginx 配置文件nginx .conf 指定用户与组。

[root@www nginx-1 .12.0]#cd /usr/local/nginx/conf/
[root@www conf]# vim nginx.conf
user nginx nginx;    //修改用户为nginx ,组为nginx

 重启Nginx 服务并查看进程运行情况, 从执行结果中可以得出Nginx 服务的主进程由root 帐户创建, 子进程则由nginx 创建

1.3:配置网页缓存时间

当Nginx 将网页数据返回给客户端后, 可设置缓存时间, 以便在日后进行相同内容的请求时直接返回, 以避免重复请求, 加快访问速度。缓存时间一般针对静态资源进行设置,对动态网页不用设置缓存时间。

( 1 ) 以图片作为缓存对象, 复制logo.jpg 图片到Nginx 的工作目录, 访问http ://192.168. 0.102/logo.jpg , 使用浏览器右键点击“查看元素”->“ 网络'-> “消息头'可以看到响应报文中没有图片的缓存信息

( 2 ) 修改Nginx 的配置文件, 在新locati on 段加入expires 参数, 指定缓存的时间,1d表示一天

[root@www conf]# vi nginx.conf

 location ~ \.(gif|jpg|png)$ {
            root html;
            expires 1d;
        }

( 3 ) 重启Nginx 服务后, 利用浏览器可以看到响应报文中含有Expires 参数, 如下图所示。其中的Cah ee-Control :max-age=86400 表示缓存时间是86400 秒, 也就是缓存一天的时间, 一天之内浏览器访问这个页面, 都是用缓存中的数据, 而不需要向Nginx 服务器重新发出请求, 减少了服务器的使用带宽。

1.4:日志切割 

Nginx 没有类似Apache 的cronlog 日志分割处理功能, 但是可以通过Nginx 的信号控制功能脚本来实现日志的自动切割, 并将脚本加入到Linux 的计划任务中, 让脚本在每天的固定时间执行, 便可实现日志切割功能。下面是具体操作步骤。

( 1) 编写脚本/opt/fenge .sh , 把Nginx 的日志文件/usr/local/nginx/logs/access. log 移动到目录/var/log/nginx 下面, 以当前时间做为日志文件的名称, 然后用ki ll-USR1 创建新的日志文件/us r/local/nginx/logs/access. log , 最后删除30 天之前的日志文件。

#!/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 -USR1 $(cat $pid_path)                                //重建新日志文件
find $logs_path -mtime +30 |xargs rm -rf                 //删除30 天之前的日志文件

( 2 ) 执行/opt/fenge.sh ,测试日志文件是否被切割。

[root@localhost opt]# chmod +x /opt/fenge.sh 
[root@localhost opt]# ./fenge.sh 
[root@localhost opt]# ls /var/log/nginx/
test.com-access.log-20240617

( 3 ) 设置crontab 任务,定期执行脚本自动进行日志分割。 

[root@localhost opt]# crontab -e
30  1 *  *  *  /opt/fenge.sh

即每天的凌晨1 : 30 分执行/opt/fenge.sh 脚本, 进行日志分割。 

1.5:设置连接超时

在企业网站中, 为了避免同一个客户长时间占用连接, 造成资源浪费, 可设置相应的连接超时参数, 实现控制连接访问时间。可以修改配置文件nginx .conf,设置keepalive_timeout超时时间。

#keepalive_timeout  0;

keepalive_timeout  65 180;   //默认是65 秒,设置超时是1 80 秒

 keepalive_timeout 第一个参数指定了与客户端的keep-alive 连接超时时间,服务器将会在这个时间后关闭连接。可选的第二个参数指定了在响应头Keep-Alive: timeout=time 中的time 值。这个头能够让一些浏览器主动关闭连接, 这样服务器就不必去关闭连接了。没有这个参数, Ngi nx 不会发送Keep-Alive 响应头。

Client_ header_ timeout 参数可用于指定等待客户端发送请求头的超时时间

Client_ body_ timeout 参数可用于指定请求体读超时时间

2:Nginx深入优化

2.1:更改进程数

在高并发环境中, 需要启动更多的N ginx 进程以保证快速响应, 用以处理用户的请求,避免造成阻塞。使用ps aux 命令查看Ngi nx 运行进程的个数。从命令执行结果可以看出master process 是Nginx 的主进程, 开启了1 个; worker process 是子进程, 子进程也是开启了1 个

修改Nginx 的配置文件的worker_processes 参数, 一般设为CPU 的个数或者核数,在高并发的情况下可设置为CPU 个数或者核数的2 倍, 可以查看CPU 的核数以确定参数。

参数设置为4 , 和CPU 的核数相同。运行进程数多一些, 响应客户端访问请求时, Nginx就不会临时启动新的进程提供服务, 减少了系统的开销, 提升了服务速度。

修改完后, 重启服务, 使用ps aux 查看运行进程数的变化情况。从下面执行结果中可以看出开启了1 个主进程和4 个子进程, 参数设置起到了作用。

默认情况下, Ngi nx 的多个进程可能更多的跑在一颗CPU 上。为了充分利用硬件多核多CPU , 可以分配不同的进程给不同的CPU 处理。在一台4 核CPU 服务器上, 可以设置每个进程分别由不同的C PU 核心处理, 达到CPU 的性能最大化。

2.2:配置网页压缩

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

gzipon 开启gzip 压缩输出;
gz ip_min_length1 k :用千设置允许压缩的页面最小字节数;
gzip_buffers 4 1 6k:表示申请4 个单位为1 6k 的内存作为压缩结果流缓存, 默认值是申请与原始数据大小相同的内存空间来存储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 压缩的页面。
修改Nginx 的配置文件, 加入压缩功能参数。

[root@www cont]# vi nginx.conf

http {
.......//省略部分内容

gzip on;     //取消注释
gzip_buffe「s 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;

在Nginx 工作目录建立一个超过1K 大小的html 文件, 然后使用浏览器访问网址验证,显示使用gzip 进行了压缩

2.3:配置防盗链

( 1 ) 防盗链需要准备两台主机模拟盗链。修改Windows 的

C :\Windows\System32\drivers\etc\hosts 文件, 设置域名和IP映射关系。

( 2 ) 修改两台CentOS 的hosts 文件, 设置域名和IP 映射关系。

( 3 ) 把图片logo.jpg 放到源主机的工作目录下

( 4 ) 在盗链主机的工作目录编写盗链页面index .html , 盗取源主机的图片

( 5 ) 访问盗链的网页http ://www.test .com/index .html 查看是否盗链成功

( 6 ) 配置Nginx 防盗链

Nginx 的防盗链原理是加入location 项, 用正则表达式过滤图片类型文件, 对于信任的网址可以正常使用, 不信任的网址返回相应的错误图片。在源主机的配置文件中加入以下代码:

location ~* \.(jpeg|jpg)$ {
             valid_referers *.benet.com benet.com;
             if ($invalid_referer){
               rewrite ^/ http://www.benet.com/error.png;
             }
         }

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

重启服务器, 重新访问http://www.test.com/index. html , 显示的是被重写的图片, 如图所示, 说明防盗链配置成功。

2.4:FPM参数优化

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

( 1 ) 安装带FPM 模块的PHP 环境, 保证PHP 可以正常运行

( 2 ) 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    动态方式下最大的空闲进程数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值