Nginx服务深入优化
一、Nginx深入优化
1.1、更改Nginx运行进程数
- 在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞
- 更改进程数的配置方法
■修改配置文件,修改进程配置参数 - 修改配置文件的worker_processes参数
■一般设为CPU的个数或者核数
■在高并发情况下可设置为CPU个数或者核数的2倍 - 增加进程数,可减少了系统的开销,提升了服务速度
- 使用ps aux查看运行进程数的变化情况
- 默认情况,Nginx的多个进程可能跑在一个CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU
1.1.1、更改Nginx运行进程数实验
- 先查看可以给的进程数,然后修改配置文件的进程数
## (CPU核数 + CPU个数) x 2 , 我这边虚拟机给的是双核双线程
[root@localhost nginx-1.15.9]# cat /proc/cpuinfo |grep -c "physical"
8
[root@localhost nginx-1.15.9]# vi /usr/local/nginx/conf/nginx.conf
worker_processes 8; ## 数字修改为8
== >> wq 保存
- 检测语法有无错误,并刷新配置Nginx文件
[root@localhost nginx-1.15.9]# nginx -t ## 检测语法有无错误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx-1.15.9]# killall -s HUP nginx ## 刷新nginx配置
- 再次进行过滤,验证实验
[root@localhost nginx-1.15.9]# ps aux | grep nginx
## 再过滤一次,这次是8个进程,验证了我们刚刚改的参数。
##最后一行 root 是我使用远程终端的进程
1.2、配置Nginx实现网页压缩
- Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能
- 允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
- 可在配置文件中加入相应的压缩功能参数对压缩性能进行优化
- 压缩功能的参数
■gzip on:开启gzip压缩输出
■gzip_min_length 1k:设置允许压缩的页面最小字节数
■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_types text/plain:压缩类型,对哪些网页文档启用压缩功能
■gzip_vary on:让前端缓存服务器缓存经过gzip压缩的页面
1.2.1、Nginx实现网页压缩实验
- 在浏览器输入 20.0.0.25 ,用 wireshark 进行抓包。我们先查看没有网页压缩之前的大小是612bytes
- 开启网页压缩功能,并刷新Nginx配置文件
[root@localhost nginx-1.15.9]# vi /usr/local/nginx/conf/nginx.conf
## 找到 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;
== > > wq 保存
注释:
1.开启gizp 压缩
2.表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间
3.用于设置识别http协议版本,默认是1.1
4.用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,处理速度慢
5.用于设置允许压缩的最小字节数;
6.选项可以让前端的缓存服务器缓存经过gzip压缩的页面
7.压缩类型,对那些网页文档启用压缩功能;
[root@localhost nginx-1.15.9]# killall -s HUP nginx ## 刷新配置参数
- 在浏览器输入 20.0.0.25 , 用 wireshark 进行抓包,压缩完之后网页为384 bytes。网页压缩成功!
1.3、配置Nginx实现防盗链
- 在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失
- Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理
1.3.1、配置Nginx实现防盗链实验
- 添加映射
C:\Windows\System32\drivers\etc ## 进入这个目录
用记事本打开 hosts ,在最下面添加如下两行。(如果直接更改不生效,建议复制一份去桌面,在桌面改完后,在覆盖源文件)
### 在最下面添加如下两行
20.0.0.25 www.TX.top ### 源主机
20.0.0.24 www.HH.top ### 盗链主机
- 真机测试是否可以 ping 通
- 配置源主机
用xftp在20.0.0.25 IP的虚拟机的 /usr/local/nginx/html/ 里放一张图片,图片名叫 x.jpg
[root@localhost opt]# vi /usr/local/nginx/html/index.html ## 在网页里面添加图片配置
<img src="./x.jpg"/> ## 因为在当前目录下 所以用 ./x.jpg
== >> wq 保存
- 验证下源主机图片是否放入成功
- 现在做盗链主机
[root@localhost ~]# vi /usr/local/httpd/htdocs/index.html ##进入修改默认页配置
<!DOCTYPE html> ## 添加如下代码
<html>
<head>
<title>--盗图测试--</title>
</head>
<body><h1>盗图页面</h1>
<img src="http://www.TX.top/x.jpg" / > ## x.jpg是本地图片
</body>
</html>
==> > wq 保存
[root@localhost ~]# vi /usr/local/httpd/conf/httpd.conf
ServerName 80 ## 找到这句代码
AddDefaultCharset utf-8 ## 添加这句代码,让网页显示中文(不加中文在网页里显示乱码)
[root@localhost ~]# systemctl restart httpd ## 重启 httpd
- 测试:浏览器输入20.0.0.24,查看能不能正常盗链
- 现在配置源主机的防盗链!
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# vi nginx.conf
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
root html;
expires 1d; ## 在这下面添加
valid_referers none blocked *.TX.top TX.top;
if ($invalid_referer) {
rewrite ^/ https://ss1.bdstatic.com/70cF635562513&fm=26&gp=0.jpg;
## 这里在网上找一张图片,复制地址,放进去
}
}
[root@localhost conf]# killall -s HUP nginx ## 重载配置
- 测试:浏览器输入20.0.0.24,查看能不能防止盗链!!!
再次登录验证,发现图片改变,但是图片连接地址是没有改变的,防盗成功!
1.4、FPM模块进行参数优化
####################安装PHP环境#####
yum -y install \
libjpeg \
libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 \
libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel
#######上传php-7.1.10.tar.bz2包到opt目录下#####
cd /opt
tar xjvf php-7.1.10.tar.bz2
cd php-7.1.10
./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip
make -j3 && make install
cp php.ini-development /usr/local/php/lib/php.ini
vi /usr/local/php/lib/php.ini
mysqli.default_socket = /usr/local/mysql/mysql.sock
date.timezone = Asia/Shanghai
[root@localhost php-7.1.10]# /usr/local/php/bin/php -m //验证安装的模块
[root@localhost php-7.1.10]# vi /etc/httpd.conf //在合适位置新增
AddType application/x-httpd-php .php ###添加
AddType application/x-httpd-php-source .phps ###添加
<IfModule dir_module>
DirectoryIndex index.php index.html ###找到这个添加
</IfModule>
[root@localhost php-7.1.10]# rm -f /usr/local/httpd/htdocs/index.html ###删除
[root@localhost php-7.1.10]# vi /usr/local/httpd/htdocs/index.php ###创建新的
<?php
phpinfo();
?>
[root@localhost php-7.1.10]# systemctl restart httpd.service
测试:20.0.0.6
#####FPM参数优化###
[root@localhost php-7.1.10]# cd /usr/local/php/etc/php-fpm.d
[root@localhost 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-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如果遇到了问题就会出现502Bad gateway这个错误。
max_children较好的设置方式根据req/s(吞吐率, 单位时间里服务器处理的最大请求数, 单位req/s) 来设置,
若程序是100D req/s的处理能力, 那么就设置100比较好, 这是动态来调整的。
本次内容就结束啦!
若有不足之处,请多多指教,敬请指出。