nginx优化与防盗链

一:Nginx 服务优化

1.1:隐藏版本号

(1)访问网页同时查看版本

[root@localhost ~]# curl -i http://192.168.10.101

HTTP/1.1 200 OK

Server: nginx/1.12.0

Date: Thu, 09 Jun 2022 07:47:17 GMT

Content-Type: text/html; charset=utf-8

Content-Length: 12

Last-Modified: Thu, 09 Jun 2022 07:46:09 GMT

Connection: keep-alive

ETag: "62a1a541-c"

Accept-Ranges: bytes

(2)修改配置文件方式

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

http {

    include       mime.types;

    default_type  application/octet-stream;

    server_tokens off;

(3)再次访问网址,只显示 Nginx,版本号已经隐藏

[root@localhost ~]# curl -i http://192.168.10.101

HTTP/1.1 200 OK

Server: nginx

Date: Thu, 09 Jun 2022 07:50:10 GMT

Content-Type: text/html; charset=utf-8

Content-Length: 12

Last-Modified: Thu, 09 Jun 2022 07:46:09 GMT

Connection: keep-alive

ETag: "62a1a541-c"

Accept-Ranges: bytes

(4)设置版本信息

[root@localhost ~]# vim nginx-1.12.0/src/core/nginx.h

#define nginx_version      1012000

#define NGINX_VERSION      "10.12.0"

#define NGINX_VER          "iis/" NGINX_VERSION

[root@localhost ~]# cd nginx-1.12.0

[root@www 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]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

http {

    include       mime.types;

    default_type  application/octet-stream;

    server_tokens on;

(4)访问网址,查看版本信息

[root@localhost ~]# nginx -s stop && nginx

[root@localhost ~]# curl -i 127.0.0.1

HTTP/1.1 200 OK

Server: iis/10.12.0

Date: Thu, 09 Jun 2022 07:57:08 GMT

Content-Type: text/html; charset=utf-8

Content-Length: 12

Last-Modified: Thu, 09 Jun 2022 07:46:09 GMT

Connection: keep-alive

ETag: "62a1a541-c"

Accept-Ranges: bytes

1.2:修改用户与组

1)指定用户与组的参数

编译 Nginx 时指定用户与组,就是配置 Nginx 时,在./configure 后面指定用户与组的参数

[root@www nginx-1.12.0]# ./configure \

--prefix=/usr/local/nginx \

--user=nginx \

--group=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;

[root@www conf]# ps aux |grep nginx

查看worker process的用户

注意:

master process的用户是主进程用户

1.3:配置网页缓存时间

(1)访问网页http://192.168.10.101/logo.jpg

单击查看元素”->“网络”->“消息头可以看到响应报文中没有图片的缓存信息

(2)修改 Nginx 的配置文件,在新 location 段加入 expires 参数,指定缓存的时间

        location / {

            root   html;

            index  index.html index.htm index.php;

        }

        location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {

            root html;

            expires 1d;

        }

~:表示执行一个正则匹配,区分大小写

d:天

M:月

m:分钟

s:秒

h:小时

3)重启 Nginx 服务后,利用火狐浏览器可以看到响应报文中图片文件含有 Expires 参数

1.4日志切割

1)编写脚本/opt/fenge.sh,Nginx 的日志文件/usr/local/nginx/logs/access.log 移动到目录/var/log/nginx 下面

[root@www ~]# vim /opt/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 -USR1 $(cat $pid_path)

find $logs_path -mtime +30 |xargs rm -rf

备注:

  • kill -USR1 $(cat $pid_path) ##重建新日志文件
  • find $logs_path -mtime +30 |xargs rm -rf ##删除 30 天之前的日志文件
  • xargs:可以读取标准输入和管道中的数据,用于弥补有些命令(如echo、kill、rm)不能从管道中读取数据的不足。
  • kill -USR1 :停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

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

[root@www ~]# chmod +x /opt/fenge.sh

[root@www ~]# /opt/fenge.sh

[root@www ~]# ls /var/log/nginx

[root@www ~]# ls /usr/local/nginx/logs/access.log

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

[root@www ~]# crontab -e

30 1 * * *   /opt/fenge.sh

1.5:设置连接超时

(1)keepalive_timeou设置连接超时

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

http {

    #keepalive_timeout  0;

    keepalive_timeout  65 180;

备注:

keepalive_timeout

第一个参数指定了与客户端的 keep-alive 连接超时时间,服务器将会在这个时间后关闭连接。

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

使用火狐浏览器访问网址,可以看到响应头中显示了超时时间是 180

(2)Client_header_timeout参数可用于指定等待客户端发送请求头的超时时间,Client_body_timeout 参数可用于指定请求体读超时时间

keepalive_timeout 65 180;

client_header_timeout 80;

client_body_timeout 80;

二:Nginx 深入优化

2.1:更改进程数

1:ps aux 命令

[root@www ~]# ps aux | grep nginx

root      17328  0.0  0.0  20548   636 ?        Ss   20:32   0:00 nginx: master process /usr/local/nginx/sbin/nginx

nginx     17330  0.0  0.0  20912  1584 ?        S    20:32   0:00 nginx: worker process

root      17355  0.0  0.0 112824   976 pts/3    R+   20:39   0:00 grep --color=auto nginx

备注:

  • master process 是 Nginx 的主进程,开启了 1 个;worker process 是子进程,子进程也是开启了 1 个。
  • master进程负责管理worker进程,并负责读取配置文件和判断文件语法的工作;是主进程,有且只有一个。
  • worker进程有多个,它负责处理请求。
  • worker进程的数通常与服务器有多少cpu核心有关,比如,nginx所在主机拥有4核cpu,那么worker_ processes的值通常不会大于4,这样做的原因是为了尽力让每个worker进程都有一个cpu可以使用,尽量避免了多个worker进程抢占同一个cpu的情况,我们也可以将worker_ processes的值设置为"auto"

2:修改 Nginx 的配置文件的 worker_processes 参数

(1)查看主机cpu数量

[root@www ~]# cat /proc/cpuinfo | grep -c "physical"

(2)修改 Nginx 的配置文件的 worker_processes 参数

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

user  nginx;

worker_processes  4;

[root@www ~]# systemctl restart nginx

[root@www ~]# ps aux | grep nginx

root      17374  0.0  0.0  20548   644 ?        Ss   20:47   0:00 nginx: master process /usr/local/nginx/sbin/nginx

nginx     17376  0.0  0.0  20912  1344 ?        S    20:47   0:00 nginx: worker process

nginx     17377  0.0  0.0  20912  1344 ?        S    20:47   0:00 nginx: worker process

nginx     17376  0.0  0.0  20912  1344 ?        S    20:47   0:00 nginx: worker process

nginx     17377  0.0  0.0  20912  1344 ?        S    20:47   0:00 nginx: worker process

root      17400  0.0  0.0 112824   980 pts/3    S+   20:47   0:00 grep --color=auto nginx

(2)以设置每个进程分别由不同的 CPU 核心处理,达到 CPU 的性能最大化

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

user  nginx;

worker_processes  4;

worker_cpu_affinity 0001 0010 0100 1000;

2.2:配置网页压缩

1:修改 Nginx 的配置文件,加入压缩功能参数

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

http {

#去掉gzip  on;前面的注释,增加其他的参数

    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 image/jpeg image/gif image/png;

[root@www ~]# systemctl restart nginx

  • gzip on:开启 gzip 压缩输出;
  • 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_min_length1k:用于设置允许压缩的页面最小字节数;
  • gzip_vary on:选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面。
  • gzip_types text/plain:压缩类型,是对哪些网页文档启用压缩功能;

2:使用浏览器访问网址验证,http://192.168.10.101/

备注:

如果看不到压缩,将nginx配置文件中页面缓存的参数去掉,清空一下浏览器,再测试

2.3:配置防盗链

服务器恢复到前面的快照

1)防盗链实验环境

IP地址

域名

用途

192.168.10.101

www.benet.com

源主机

192.168.10.102

www.accp.com

盗链主机

2)修改客户端hosts文件

192.168.10.101 www.benet.com

192.168.10.102 www.accp.com

3)修改两台 CentOS hosts 文件

192.168.10.101 www.benet.com

192.168.10.102 www.accp.com

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

[root@www ~]#  vim /usr/local/nginx/html/index.html

<html>

<body>

<p>原图网站</p>

<img src="http://www.benet.com/logo.jpg"/>

</body>

</html>

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

[root@accp~]# yum -y install httpd

[root@accp~]# systemctl stop firewalld

[root@accp~]# systemctl start httpd

[root@accp~]#  vim /var/www/html/index.html

<html>

<body>

<p>盗图网站</p>

<img src="http://www.benet.com/logo.jpg"/>

</body>

</html>

[root@accp~]# vim /etc/hosts

192.168.10.101 www.benet.com

192.168.10.102 www.accp.com

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

7)配置 Nginx 防盗链

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

        location / {

            root   html;

            index  index.html index.htm;

        }

        location ~* \.(gif|jpg|jpeg)$ {

            valid_referers *.benet.com benet.com;

            if ($invalid_referer) {

                rewrite ^/ http://www.benet.com/error.png;

            }

        }

注意:

去掉页面缓存相关配置

注意:

location ~* \.(gif|jpg|jpeg)$中不要加入png格式,rewrite语句中地址重写到了一个png报错图片。如果location ~* \.(gif|jpg|jpeg)$中写了png格式,就会被循环重定向,无法看到报错图片。

备注:

valid_referers:nginx会通就过查看referer自动和valid_referers后面的内容进行匹配,如果匹配到了就将$invalid_referer变量置0,如果没有匹配到,则将$invalid_referer变量置为1,匹配的过程中不区分大小写。

  • None      浏览器中referer(Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面连接过来的,服务器基此可以获得一些信息用于处理)为空的情况,就直接在浏览器访问图片
  • Blocked  referrer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或者https:// 开头。
  • ~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg .gif .swf 结尾的文件;
  • Valid_referers:设置信任的网站,可以正常使用图片;
  • 后面的网址或者域名:referer 中包含相关字符串的网址;
  • If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 1,则执行后面的操作,即进行重写或返回 403 页面。

(7)测试

重新访问 http://www.accp.com/,无法看到盗图

2.4:FPM 参数优化

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

2FPM 进程的两种启动方式

Static 的方式可以使用 pm.max_children 指定启动的进程数量

Dynamic 方式的参数要根据服务器的内存与服务负载进行调整

(3)优化

现有云服务器,运行了个人论坛,内存为 1.5Gfpm 进程数为 20,内存消耗近1G,处理比较慢,对参数进行优化处理。

root@www etc]# cd /usr/local/php5/etc/

[root@www etc]# vi 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 个进程存在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值