目录
对于nginx性能优化的几个侧重点
一.性能优化考虑点
1、当前系统结构瓶颈
2、了解业务模式
3、性能与安全
二.系统与Nginx性能优化
1.设置缓存时间(图片)
2.日志分割
3.连接超时(偏于客户端)
4.更改进程数(场景)
5.网页压缩
6.隐藏版本号
方法一
方法二
7.盗链防盗链
盗链:
防盗链:
8.文件句柄
9.keepalive timeout会话保持时间
10.buffer工作原理
11.流量控制
12、FPM模块参数优化
当我需要进行性能优化时,说明我们服务器无法满足日益增长的业务。性能优化是一个比较大的课题,需要从以下几个方面进行探讨
当前系统结构瓶颈
了解业务模式
性能与安全
首先需要了解的是当前系统瓶颈,用的是什么,跑的是什么业务。里面的服务是什么样子,每个服务最大支持多少并发。比如针对Nginx而言,我们处理静态资源效率最高的瓶颈是多大?
可以通过查看当前cpu负荷,内存使用率,进程使用率来做简单判断。还可以通过操作系统的一些工具来判断当前系统性能瓶颈,如分析对应的日志,查看请求数量。
也可以通过nginx http_stub_status_module模块来查看对应的连接数,总握手次数,总请求数。也可以对线上进行压力测试,来了解当前的系统的性能,并发数,做好性能评估。
虽然我们是在做性能优化,但还是要熟悉业务,最终目的都是为业务服务的。我们要了解每一个接口业务类型是什么样的业务,比如电子商务抢购模式,这种情况平时流量会很小,但是到了抢购时间,流量一下子就会猛涨。也要了解系统层级结构,每一层在中间层做的是代理还是动静分离,还是后台进行直接服务。需要我们对业务接入层和系统层次要有一个梳理
性能与安全也是一个需要考虑的因素,往往大家注重性能忽略安全或注重安全又忽略性能。比如说我们在设计防火墙时,如果规则过于全面肯定会对性能方面有影响。如果对性能过于注重在安全方面肯定会留下很大隐患。所以大家要评估好两者的关系,把握好两者的孰重孰轻,以及整体的相关性。权衡好对应的点。
大家对相关的系统瓶颈及现状有了一定的了解之后,就可以根据影响性能方面做一个全体的评估和优化。
网络(网络流量、是否有丢包,网络的稳定性都会影响用户请求)
系统(系统负载、饱和、内存使用率、系统的稳定性、硬件磁盘是否有损坏)
服务(连接优化、内核性能优化、http服务请求优化都可以在nginx中根据业务来进行设置)
程序(接口性能、处理请求速度、每个程序的执行效率)
数据库、底层服务
vim /usr/local/nginx/conf/nginx.conf
location ~ \.(gif\jpg|jepg|png|bmp|ico)$ { #加入新的location,以图片作为缓冲对象
root html;
expires 1d; #指定缓存时间,1天
}
# !/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 ] ll mkdir -p $logs_path
mv /usr/local/nginx/logs/access.log $ {logs_path} /test.com-access.log-$dkill -HUP $ (cat $pid path)
find $logs path -mtime +30| xargs rm -rf
chmod +x /opt / fenge.sh
crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
crontab -l
0 1 * * * /opt/ fenge.sh
systemctl restart nginx
netstat –natp l grep nginx
tcp 0 0 0.0.0.0 : 80 0.0.0.0:* LISTEN 111019/nginx : maste
bash -x fenge. sh
++ date -d '-1 day' +%Y%m%d
- d=20210623
- logs_path=/var/log/nginx
- pid_path=/usr/local/nginx/logs/nginx.pid
- '[' -d /var/log/nginx ']'
- mv /usr/local/nginx/logs/access.log /var/log/nginx/test.com-access.log-20210623
++ cat /usr/local/nginx/logs/nginx.pid
- kill -HUP 111019
- find /var/log/nginx -mtime +30
- xargs rm -rf
[root@client opt]# ls /var/log/nginx/
test.com-access.log-20210623
#可以看到前一天的日志
date -s 20210625
2021年 06月 25日 星期五 00:00:00 CST
./fenge.sh
ls /var/log/nginx/
test.com-access.log-20210623 test.com-access.log-20210624
date
2021年 06月 25日 星期五 00:00:15 CST
vim /usr/local/nginx/conf/nginx.conf
32 #keepalive_timeout 0;
33 keepalive_timeout 100;
34 client_header_timeout 80; #等待客户端发送请求头的超时时间,超时会发送408 错误
35 client_body_timeout 80; #等待客户端发送请求体的超时时间
cd /sys/fs/cgroup
cd cpu
cat cpu.cfs_quota_us
查看cpu核数
cat /proc/cpuinfo | grep -c “physical”
修改cpu使用核心数、
vim /usr/local/nginx/conf/nginx.conf
即假设此时有两个进程,则将此两个进程均分给两个内核使用,分别为01,10
vim /usr/local/nginx/conf/nginx.conf
gzip on; #取消注释,开启gzip压缩功能
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区,大小为4个16k缓冲区
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; #压缩类型,表示哪些网页文档启用压缩功能
在生产环境中,对于nginx最基本的优化即为隐藏nginx版本号,因为nginx服务是直接暴露在外的,需隐藏nginx版本号,一面安全漏洞的泄露。
查看版本号
curl -I http://192.168.239.129
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #添加,关闭版本号
......
}
systemctl restart nginx
curl -I http://192.168.239.129
修改源码
vim /opt/nginx-1.15.0/src/core/nginx.h
#define NGINX_VERSION "1.1.1" #修改版本号
#define NGINX_VER "IIS" NGINX_VERSION #修改服务器类型
在版本号里可以随意修改成你想要的内容
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/usr/local/nginx-module
make &&make install
192.168.239.129 被盗链
192.168.239.128 盗链
网页准备在服务端
1.在/etc/hosts文件中即在盗链的机子中配置
其中192.168.239.128是盗链机
192.168.239.129是被盗链机
3.将图片放在/usr/local4/nginx/html下此处放在服务器中
4.修改html文件
vim index.html
再次访问如下
5.配置盗链主机128
vim /etc/hosts
cd /usr/local/nginx/html
vim index.html
在windows配置文件
C:\WINDOWS\System32\drivers\etc加入路径
6.验证
在windows的浏览器中访问盗链机即www.daolian.com
vim /usr/local/nginx/conf/nginx.conf
location ~*\.(jpg|gif|swf)$ {
valid_referers *.benet.com benet.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.dog.com/error.png;
return 403;
}
}
防盗链设置参数详细说明:
valid referers:设置信任的网站,即能引用相应图片的网站
none:浏览器中Referer为空的情况,就是直接在浏览器访问图片
blocked:referer不为空的情况,但是值被代理或防火墙删除了,这些值不以以http://或者https://开头
后面的网址或者域名:referer中包含相关字符串的网址
if语句:如果链接的来源域名不在valid referers所列出的列表中,Sinvalid referer为1,则执行后面的操作,即进行重写或返回403页面
##上传error.png文件至/usr/local/nginx/html
验证:在windows端访问盗链的网址
在linux上,所有皆为文件,每个用户每发起一次请求就会生成一个文件句柄,即可以理解为一个索引,随着用户账号不断的使用,其生成的文件句柄则会越来越多,但是系统对文件句柄的默认值为1024个,其值对于在生产环境中是非常小的,需要对其进行增大。
三种设置方式
系统全局修改
用户局部行修改
进程局部性修改
系统全局修改与用户局部性修改
vim /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
* soft nofile 25535
* hard nofile 25535
在End of file前面添加4个参数
soft:软控制,到达设定值后,操作系统不会采取措施,只是发提醒
hard:硬控制,到达设定值后,操作系统会采取机制对当前进程进行限制,这个时候请求就会受到影响
root:这里代表root用户(系统全局性修改)
*:代表全局,即所有用户都受此限制(用户局部性修改)
nofile:指限制的是文件数的配置项。后面的数字即设定的值,一般设置10000左右
进程局部性修改
ulimit -n查看每个进程的最大打开数
vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 65535;
这里如果系统资源压力过大或者网络波动过大时可以将保活时间增加。
(1)所有的proxy buffer参数都是作用到每一个请求的。每一个全球有会按照参数的配置获得自己的buffer。proxy buffer不是global(全局配置),而是per request(在请求前执行的操作(如时间戳、签名))的
(2)proxy_buffering是为了开启response buffering of the proxied server(反向代理服务器响应数据的缓存),开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用
(3)无论peoxy_buffer是否开启,proxy_buffer_size都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。
(4)在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffer们。同时如果response的内容很大的话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。
(5)一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的。
我们构建网站是为了让用户访问它们,我们希望用于合法访问。所以不得不采取一些措施限制滥用访问的用户。这种滥用指的是从同一IP每秒到服务器请求的连接数。因为这可能是在同一时间内,世界各地的多台机器上的爬虫机器人多次尝试爬取网站的内容。
#限制用户连接数来预防DOS攻击
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
#限制同一客户端ip最大并发连接数
limit_conn perip 2;
#限制同一server最大并发连接数
limit_conn perserver 20;
#限制下载速度,根据自身服务器带宽配置
limit_rate 300k;
cd /usr/local/php/etc/
cp php-fpm.conf.default
php-fpm.confvim 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#动态方式下最大空闲进程数#启动php-fpm,不可用于重启
/usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini#执行第一个命令后,就可以使用下面这条命令查看pid号重启
php-fpmkill -USR2 `cat /usr/ local/php/var/run/php-fpm.pid
netstat -anpt l grep 9000