NGINX 优化与防盗链

NGINX 优化与防盗链

1版本信息

如何查看版本信息

[root@localhost ~]#curl 192.168.91.103
[root@localhost ~]#curl -I 192.168.91.103

隐藏版本号

1.1修改配置文件

[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
#加入 server_tokens off; 
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;
........
}
[root@localhost ~]#curl -I 192.168.91.103

1.2重新编译安装

[root@localhost nginx-1.12.0]#vim /opt/nginx-1.12.0/src/core/nginx.h
#define nginx_version      1012000
#define NGINX_VERSION      "666"
#define NGINX_VER          "IIS/" NGINX_VERSION
[root@localhost nginx-1.12.0]#cd /opt/nginx-1.12.0/
[root@localhost nginx-1.12.0]#
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
[root@localhost nginx-1.12.0]#make && make install
[root@localhost conf]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf

####省略####
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens on;                                 ####打开版本号
    
[root@localhost conf]# systemctl restart nginx

[root@localhost conf]# curl -I http://192.168.91.100
HTTP/1.1 200 OK                   
Server: IIS1.1.1                                         ###显示信息设置
Date: Mon, 04 Mar 2019 17:38:18 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 244
Last-Modified: Mon, 04 Mar 2019 11:02:43 GMT
Connection: keep-alive
ETag: "5c7d05d3-f4"
Accept-Ranges: bytes

2修改用户与组

2.1在编译安装时设置

[root@localhost opt]# cd nginx-1.15.9/
[root@localhost nginx-1.15.9]# 
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

2.2修改配置文件

2、配置用户与组
修改Nginx配置文件的Nginx指定用户与组
[root@localhost conf]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
#第一行
user lisi lisi;                     ###修改用户为 lisi ,组为 lisi

[root@localhost conf]# systemctl restart nginx            ###重启Nginx进程
[root@localhost conf]# ps aux |grep nginx
root      15154  0.0  0.0  20560   636 ?        Ss   01:47   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     15155  0.0  0.0  23096  1404 ?        S    01:47   0:00 nginx: worker process
root      15160  0.0  0.0 112724   988 pts/0    S+   01:47   0:00 grep --color=auto nginx

重启 Nginx 查看进程运行情况,主进程由 root 帐户创建,子进程则由 Nginx 创建。
[root@localhost nginx-1.12.0]#useradd -s /sbin/nologin lisi
[root@localhost nginx-1.12.0]#
[root@localhost nginx-1.12.0]#id lisi
uid=1003(lisi) gid=1003(lisi)=1003(lisi)
[root@localhost nginx-1.12.0]#systemctl restart nginx.service 
[root@localhost nginx-1.12.0]#ps aux |grep lisi
lisi      52819  0.0  0.0  22996  1400 ?        S    12:09   0:00 nginx: worker process
root      52823  0.0  0.0 112824   976 pts/3    S+   12:09   0:00 grep --color=auto lisi

3缓存时间

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

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

其中的 Cahce-Control:max-age=86400 表示缓存时间是 86400 秒,也就是缓存一天的
时间,一天之内浏览器访问这个页面,都是用缓存中的数据,而不需要向 Nginx 服务器重
新发出请求,减少了服务器的使用带宽。

4.日志切割

随着 Nginx 运行时间的增加,产生的日志也会逐渐增加,为了方便掌握 Nginx 的运行
状态,需要时刻关注 Nginx 日志文件。太大的日志文件对监控是一个大灾难,不便于分析
排查,需要定期的进行日志文件的切割。

编写脚本

#!/bin/bash
d=$(date +%F -d -1day)
logpath="/var/log/nginx"
pid="/usr/local/nginx/logs/nginx.pid"

[ -d $logpath ] || mkdir -p $logpath
mv /usr/local/nginx/logs/access.log ${logpath}/www.kgc.com.log-$d
kill -USR1 $(cat $pid)
find $logpath -mtime +30 -exec rm -rf {} \;
find $logpath -mtime +30 |xargs rm -rf
find $logpath -mtime +30 -delete 
rm -rf $(find $logpath -mtime +30) 

crontab -e
30 1 * * * /usr/local/nginx/log.sh

每个文件有三个时间戳:

  • access time 访问时间,atime,读取文件内容
  • modify time 修改时间,mtime,改变文件内容(数据)
  • change time 改变时间,ctime,元数据发生改变
[root@localhost mnt]#stat 1.txt
  文件:"1.txt"
  大小:0         	块:0          IO 块:4096   普通空文件
设备:fd00h/64768d	Inode:9264317     硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:mnt_t:s0
最近访问:2021-11-09 14:50:39.562733041 +0800
最近更改:2021-11-09 14:50:39.562733041 +0800
最近改动:2021-11-09 14:50:39.562733041 +0800
创建时间:-
[root@centos7 ~]#stat /etc/passwd
 File: /etc/passwd
 Size: 1306     Blocks: 8         IO Block: 4096   regular file
Device: 802h/2050d Inode: 134792556   Links: 1
Access: (0644/-rw-r--r--) Uid: (    0/   root)   Gid: (    0/   root)
Access: 2019-12-09 20:37:12.830991350 +0800
Modify: 2019-12-09 20:37:12.826991351 +0800
Change: 2019-12-09 20:37:12.826991351 +0800
 Birth: -

5.连接超时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2eWiuuyH-1640169552433)(06NGINX 优化与防盗链.assets/image-20211109153445925.png)]

  • HTTP服务有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其他请求,服务端会利用这个未被关闭的连接,而不需要再次建立一个连接
  • KeepAlive在一段时间内保持打开状态,它们会在这段时间内占用资源,占用过多就会影响服务器的性能
  • 在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连
    接超时参数,实现控制连接访问时间。可以修改配置文件 nginx.conf,设置 keepalive_timeout
    超时时间。
[root@www conf]# vi nginx.conf
http {
............. //省略内容
#keepalive_timeout 0;
keepalive_timeout 65 180; //默认是 65 秒,设置超时是 180 秒


指定KeepAlive的超时时间(timeout)〉。指定每个tcP连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。
Nginx的默认值是65秒,有些浏览器最多只保持60秒,所以可以设定为60秒。若将它设置为0,就禁止了keepalive连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值3这个头能够让一些浏览器主动关闭连接,这样服务签就不必去关闭连接了。没有这个参数,Nginx不会发送 Keep-Alive响应头。
client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx返回HTTP 408 (Request Timed out) 。

client_body timeout
指定客户端与服务端建立连接后发送request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTT408 ( Request Timed out )[root@www conf]# vi nginx.conf
http {
............. //省略内容
keepalive_timeout 65 180;
client_header_timeout 80;
client_body_timeout 80;
............. //省略内容


###client_header_timeout###

语法 client_header_timeout time
默认值 60s
上下文 http server(指可以放在http块和server块)
说明 指定等待client发送一个请求头的超时时间(例如:GET / HTTP/1.1).仅当在一次read中,没有收到请求头,
才会算成超时。如果在超时时间内,client没发送任何东西,nginx返回HTTP状态码408(“Request timed out”)

###client_body_timeout ###
语法 client_body_timeout time
默认值 60s
上下文 http server location
说明 该指令设置请求体(request body)的读超时时间。仅当在一次readstep中,没有得到请求体,
就会设为超时。超时后,nginx返回HTTP状态码408(“Request timed out”)


因为请求头和请求体只有在特殊情况下才能显示效果,这里不再演示。
本节将依次介绍 Nginx 更改进程数、配置网页压缩、配置防盗链、fpm 参数优化。


6更改请求进程数

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

[root@localhost conf]#lscpu |grep -i "cpu(s)"
[root@localhost conf]#lscpu |grep -i "cpu(s)"|head -1
[root@localhost conf]#cat /proc/cpuinfo |grep -c "physical id"
[root@localhost conf]#cat /proc/cpuinfo|grep "processor"|wc -l
#查看cpu核数

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

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

root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf
worker_processes 4;
worker_cpu_affinity 01 10 0100 1000;
#设置每个进程由不同cpu处理,进程数配为4时,0001 0010 0100 1000

7.网页压缩

Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能

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

[root@localhost opt]# vi /usr/local/nginx/conf/nginx.conf
   gzip  on;
    gzip_buffers 4 64k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    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/jpg image/png;


在 Nginx 工作目录建立一个超过 1K 大小的 html 文件,然后访问网址抓取数据报文,


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


8防盗链

在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济
损失,也避免了不必要的带宽浪费。Nginx 的防盗链功能也非常强大,在默认情况下,只需
要进行很简单的配置,即可实现防盗链处理。

[root@www html]# cd /usr/local/nginx/conf
[root@www conf]# vi nginx.conf
location ~* \.(jpg|gif|swf)$ {
       valid_referers none blocked *.kgc.com kgc.com;
            if ( $invalid_referer ) {
                           rewrite ^/ http://www.kgc.com/error.png;
                           }

~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的
文件
Valid_referers:设置信任的网站,可以正常使用图片。
None :浏览器中 referer 为空的情况,就是直接在浏览器访问图片。
Blocked :referer 不为空的情况 ,但是值被代理或防火墙删除了,这些值不以 http://或
https://开头。
后面的网址或者域名:referer 中包含相关字符串的网址。
If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer1,则执行后面的操作,即进行重写或返回 403 页面。



网页准备

<html>
<body>
<h1>this is kgc
<img src="http://192.168.91.100/game.png"/>
</body>
</html>

http://www.kgc.com/game.png

fpm

FPM 参数优化
nginx 的 PHP 解析功能实现如果是交由 FPM 处理的,为了提高 PHP 的处理速度,可
对 FPM 模块进行参数的调整。
下面是执行步骤:
1)安装带 FPM 模块的 PHP 环境,保证 PHP 可以正常运行。
2)FPM 进程有两种启动方式,由 pm 参数指定,分别是 static 和 dynamic,前者将产
生固定数据的 fpm 进程,后者将以动态的方式产生 fpm 进程。
Static 的方式可以使用 pm.max_children 指定启动的进程数量。Dynamic 方式的参数要
根据服务器的内存与服务负载进行调整,
            选项                                               描述
Pm.max_children                     指定启动的进程数量最大的数量
Pm.start.servers                      	动态方式下初始的 ftpm 进程数量
Pm.min_spare_servers 	动态方式下最小的 fpm 空闲进程数
Pm_max_spare_servers 	动态方式下最大的空闲进程数



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

root@www etc]# cd /usr/local/php/etc/php-fpm.d
[root@www etc]# vi www.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 个
进程存在



pm.max_children 表示 php-fpm 能启动的子进程的最大数量。

request_terminate_timeout 表示将执行时间太长的进程直接终止。

我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。

 

一、pm.max_children 多大合适?
这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。

设置”max_children” 也需要根据服务器的性能进行设定。

 

计算方式如下:

一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M~30M左右,因此我的”max_children”我设置成40个,
20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存2Gb。

而如果我 的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累“,处理速度也很慢,等待的时间也较长,占用的CPU也很高。

如果长时间没有得到处理的请求就会出现 504 Gateway Time-out 这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现 502 Bad gateway 这个错误。

max_children较好的设置方式根据req/s(吞吐率,单位时间里服务器处理的最大请求数,单位req/s)来设置,若程序是 100 req/s 的处理能力,那么就设置 100比较好,这是动态来调整的。

gi所耗费的内存在20M~30M左右,因此我的”max_children”我设置成40个,
20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存2Gb。

而如果我 的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累“,处理速度也很慢,等待的时间也较长,占用的CPU也很高。

如果长时间没有得到处理的请求就会出现 504 Gateway Time-out 这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现 502 Bad gateway 这个错误。

max_children较好的设置方式根据req/s(吞吐率,单位时间里服务器处理的最大请求数,单位req/s)来设置,若程序是 100 req/s 的处理能力,那么就设置 100比较好,这是动态来调整的。


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