简介
- 在企业信息化应用环境中,服务器的安全性和响应速度需要根据实际情况进行相应参数配置,以达到最优的用户体验;
- 默认的Nginx安装参数只能提供最基本的服务,还需要调整如网页缓存时间、连接超时、网页压缩等相应参数,才能发挥出服务器的最大作用。
1.Nginx 常规服务优化
1.1 隐藏 Nginx版本号
- 目的:在生产环境中,需要隐藏Ngnx的版本号,以避免安全漏洞的泄漏。
1.1.1 查看版本号方法
- 使用fdde工具在 Windows客户端查看 Nginx版本号
- 在 Centos系统中使用“curl -l 网址”命令查看
示例:
centos系统查看版本号的命令
[root@server ~]# curl -I http://192.168.140.15
HTTP/1.1 200 OK
Server: nginx/1.12.2 '//显示版本号'
Date: Tue, 01 Dec 2020 18:46:49 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Tue, 01 Dec 2020 11:32:17 GMT
Connection: keep-alive
ETag: "5fc629c1-264"
Accept-Ranges: bytes
1.1.2 Nginx隐藏版本号的方法
- 修改Nginx源码文件,指定不显示版本号;
- 修改Nginx主配置文件。
1)修改主配置文件的方式如下:
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf
... //省略部分信息
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; '//关闭版本号'
...
}
[root@server ~]# nginx -t //检查nginx语法
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@server ~]# systemctl stop nginx
[root@server ~]# systemctl start nginx
[root@server ~]# curl -I http://192.168.140.15
HTTP/1.1 200 OK
Server: nginx '//不显示版本号'
Date: Tue, 01 Dec 2020 18:51:45 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Tue, 01 Dec 2020 11:32:17 GMT
Connection: keep-alive
ETag: "5fc629c1-264"
Accept-Ranges: bytes
注意:若php配置文件中配置了 fastcgi_ param SERVER SOFTWARE 选项,则编辑 php-fpm 配置文件,将 fastcgi_param SERVER SOFTWARE 对应的值修改为
fastcgi_param SERVER_SOFTWARE nginx
2)修改Nginx源码文件
- 由于Nginx源码文件 nginx-1.12.2/src/core/nginx.h 包含了版本信息,故更改设置参数后,重新编译安装,即可隐藏版本信息。
[root@server ~]# vi nginx-1.12.2/src/core/nginx.h
...
#define nginx_version 1548023 //发行时间
#define NGINX_VERSION "1.1.7" //发行版本号
#define NGINX_VER "IIS/" NGINX_VERSION //搭建服务所使用的软件
[root@server ~]# cd nginx-1.12.2/
[root@server nginx-1.12.2]# ./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx --with-http_stub_status_module
[root@server nginx-1.12.2]# make && make install
[root@server nginx-1.12.2]# cd
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf
... //省略部分信息
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; '//确认版本号开启,如未开启,开启后需重启nginx服务'
...
}
[root@server ~]# curl -I http://192.168.140.15
HTTP/1.1 200 OK
Server: IIS/1.1.7 //显示更改搭建服务的软件,及版本号
Date: Tue, 01 Dec 2020 19:13:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Tue, 01 Dec 2020 11:32:17 GMT
Connection: keep-alive
ETag: "5fc629c1-264"
Accept-Ranges: bytes
...
1.2 修改Nginx用户与组
- Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制;
- Nginx默认使用 nobody用户账号与组账号,一般也要进行修改。
修改的方法:
- 编译安装时指定用户与组;
- 修改配置文件时指定用户与组。
1.2.1 编译安装时指定用户与组
创建用户账号与组账号,如 nginx
在编译安装时–user与- -group指定Nginx服务的运行用户与组账号
[root@server ~]# cd nginx-1.12.2/
[root@server nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \ '//指定用户名是nginx'
--group=nginx \ '//指定组名是nginx'
--with-http_stub_status_module
[root@server nginx-1.12.2]# make && make install
1.2.2 修改配置文件时指定用户与组
- 新建用户账号,如nginx
- 修改主配置文件user选项,指定用户账号与组账号
- 重启nginx服务,使配置生效
- 使用ps aux命令查看nginx的进程信息,验证运行用户中改变效果
[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 1;
...
[root@server ~]# systemctl stop nginx
[root@server ~]# systemctl start nginx
[root@server ~]# ps aux | grep nginx
root 63459 0.0 0.0 20500 620 ? Ss 03:13 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 63460 0.0 0.0 23028 1644 ? S 03:13 0:00 nginx: worker process
root 63600 0.0 0.0 112676 984 pts/0 S+ 03:27 0:00 grep --color=auto nginx
1.3 配置Nginx网页缓存时间
- 当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度;
- 一般针对静态网页设置,对动态网页不设置缓存时间;
- 可在 Windows客户端中使用 fiddler查看网页缓存时间。
设置方法
可修改配置文件,在http段、或者 server段、或者 location段加入对特定内容的过期参数。
1.3.1 以图片作为缓存对象
- 首先需要添加图片到/usr/local/nginx/html/中,然后创建图片链接
[root@server ~]# cd /usr/local/nginx/html/
[root@server1 html]# vi index.html
<html><body>
...
<img src="hh.jpg" width="600" height="300" /> //添加图片
</body>
</html>
- 在浏览器上访问,效果如下
1.3.2 配置方法
- 修改Nginx的配置文件,在新的 location 段加入 expires 参数,指定缓存的时间。
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf
... //添加以下模块,指定缓存时间
location ~\.(gif|jpg|jepg|png|bmp|ico)$ {
root html;
expires 1d; '//1d表示1天'
}
...
- 检查nginx语法,重启服务
[root@server ~]# nginx -t
[root@server ~]# systemctl stop nginx
[root@server ~]# systemctl start nginx
- 访问网站抓包,如图
初始状态
当出现图片缓存时
1.4 Nginx的日志切割
1.4.1 为什么要进行日志分割
- 随着 Nginx运行时间增加,日志也会增加。为了方便掌握 Nginx运行状态,需要时刻关注Ngnx日志文件;
- 太大的日志文件对监控是一个大灾难。
1.4.2 定期进行日志文件的切割
- Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割,并通过Lnux的计划任务周期性地进行日志切割。
1.4.3 编写脚本进行日志切割的思路
- 设置时间变量
- 设置保存日志路径
- 将目前的日志文件进行重命名
- 重建新的日志文件
- 删除时间过长的日志文件
- 设置cron任务,定期执行脚本自动进行日志分割
1.4.4 脚本配置参数解析
- 时间变量
[root@server ~]# date "+%Y%m%d" //查看当前日期时间
[root@server ~]# date "+%Y-%m-%d" //查看当前的年月日
[root@server ~]# date -d "-1 day" "+%Y-%m-%d" //查看昨天日期
[root@server ~]# date -d "+1 day" "+%Y-%m-%d" //查看明天日期
补充
date -d "-1 month" "+%Y-%m-%d" //查看上个月昨天的日期
date -d "+1 year" "+%Y-%m-%d" //查看明年明天的日期
- 查看进程号
[root@server ~]# cd /usr/local/nginx/logs/
[root@server logs]# ls -lh
[root@server logs]# cat nginx.pid //当前nginx运行时产生的进程号
63844
- 时间参数的介绍(ctime、atime、mtime)
(1)modification time --- mtime
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会
改变,这就是和ctime的区别。
(2)change time --- ctime
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是createtime,
更像是change time。
只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会
更新这个时间。
(3)accesstime --- atime
当使用这个文件的时候就会更新这个时间。
- 查看文件的最近状态
[root@server ~]# stat initial-setup-ks.cfg
- -exec 和 xargs参数解析
(1) -exec
find /root -size 10M -exec rm -rf {} ; '//删除,find找到的内容作为后面rm删除的对象'
find /root -name tom_rename -exec mv {} /tmp ; '//移动'
find /root -name tom -exec mv {} tom_rename ; '//重命名'
(2) xarges
find /root -name Tom | xargs rm -rf '//删除'
find /root -name RABBIT_NEW | xargs -I 8 mv 8 /tmp '//移动'
find /root -name RABBIT | xargs -I - mv - RABBIT_NEW '//重命名'
注意:如果你需要查找的位置就在当前path(目录),那么系统默认就是" find . "
语法结构分析:
-exec参数后面跟的是命令,它的终止是以;为结束标志的。
{}代表前面find找出来的文件名,\代表换行符,是立即执行的意思。
xargs这个参数就是强力的意思,如果前面的输出结果包含空格或制表符也会被强力执行
1.4.5 编写运行脚本
[root@server ~]# vi fenge.sh
#!/bin/bash
# 日志分割
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}/aa.com.access.log-$d
'//移动并重命名日志文件'
kill -HUP $(cat $pid_path)
'//当服务重新加载后,会重新生成一个新的日志文件,以便后续的日志分割操作'
find $logs_path -mtime +30 | xargs rm -rf '//强力删除30天之前的日志文件'
[root@server ~]# which sh '//查看sh的绝对路径'
/usr/bin/sh
[root@server ~]# crontab -e '//设置 crontab 任务,定期执行脚本自动进行日志分割'
0 1 * * * /usr/bin/sh /root/fenge.sh '//每天凌晨一点执行脚本,进行日志分割'
- 运行进行日志分割检测,在浏览器上访问IP地址产生日志文件
[root@server ~]# cd /var/log/nginx/
[root@server nginx]# ls -lh
扩展
kill -QUIT //结束进程
kill -HUP //平滑重启类似reload
kill -USR1 //日志分隔
kill -USR2 //平滑升级
2.Nginx深入优化
2.1 配置Nginx实现连接超时
-
为避免同一客户端长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。
-
超时参数
Keepalive_time //设置连接保持超时时间
Client_header_timeout //指定等待客户端发送请求头的超时时间
Client_body_timeout //设置请求体读超时时间
2.1.1 请求头解析(header)
请求头header一般用来存放一些cookie, token信息;
请求体body一般用来存储post的参数和参数数据。
-
Cookie
1)Cookie是一个保存在客户机中的简单的文本文件,这个文件与特定的 Web. 文档关联在一起,保存了该客户机访问这个Web文档时的信息,
2)当客户机再次访问这个Web文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性,因此它可以帮助我们实现记录用户个人信息的功能,而这一切都不必使用复杂的CGI等程序。 -
Token
1)Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。
2)Token的定义: Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
3)使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
2.1.2 配置连接超时命令
- 修改nginx主配置文件
[root@server ~]# vi /etc/nginx.conf
...
Keepalive_time 65 180; //设置连接保持超时时间
Client_header_timeout 80; //设置请求头超时时间
Client_body_timeout 80; //设置请求体超时时间
...
[root@server ~]# 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@server ~]# systemctl stop nginx
[root@server ~]# systemctl start nginx
2.1.3 验证结果
- 在浏览器中访问,抓包查看
2.2 更改进程数
2.2.1 查看CPU或者核数
[root@server ~]# cat /proc/cpuinfo | grep -c "physical"
4
2.2.2 修改nginx主配置文件
[root@server ~]# vi /etc/nginx.conf
user nginx nginx;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
...
events {
use epoll;
worker_connections 4096;
}
... //省略部分信息
[root@server ~]# ulimit -n 65535 >> /etc/rc.d/rc.local
[root@server ~]# ulimit -n
65535
[root@server ~]# 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@server ~]# systemctl stop nginx.service
[root@server ~]# systemctl start nginx.service
2.2.3 查看运行进程数的变化情况
[root@server ~]# ps aux | grep nginx
root 63986 0.0 0.1 126368 1876 pts/0 S+ 08:20 0:00 vi /etc/nginx.conf
root 65253 0.0 0.0 20500 692 ? Ss 10:09 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 65254 0.0 0.1 24260 2728 ? S 10:09 0:00 nginx: worker process
nginx 65255 0.0 0.1 24260 2728 ? S 10:09 0:00 nginx: worker process
nginx 65256 0.0 0.1 24260 2728 ? S 10:09 0:00 nginx: worker process
nginx 65257 0.0 0.1 24260 2728 ? S 10:09 0:00 nginx: worker process
nginx 65258 0.0 0.1 24260 2728 ? S 10:09 0:00 nginx: worker process
nginx 65259 0.0 0.1 24260 2728 ? S 10:09 0:00 nginx: worker process
nginx 65260 0.0 0.1 24260 2728 ? S 10:09 0:00 nginx: worker process
nginx 65261 0.0 0.1 24260 2728 ? S 10:09 0:00 nginx: worker process
root 65295 0.0 0.0 112676 980 pts/1 S+ 10:11 0:00 grep --color=auto nginx
2.3 配置网页压缩
- Nginx的ngx_htto_gzip_ module压缩模块提供对文件内容压缩的功能;
- 允许Nginx服务器将输出内容在发送客户端之前进行压缩,节约网站带宽,提升用户的访问体验,默认已经安装;
- 可在配置文件中加入相应的压缩功能参数对压缩性能进行优化。
2.3.1 压缩功能参数
gzip on:开启gzip压缩输出g
zip_min_length 1k:用于设置允许压缩的页面最小字节数
gzip_buffers 4 16k:表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果(buffers:缓存区)
zip_http_version1.0:用于设置识别htt协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,但处理最慢,也比较消耗服务器CPU资源
gzip_comp_level 2:用来指定gzp缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,使用默认即可
gzip_types text/plain:压缩类型,是就对哪些网页文档启用压缩功能
gzip_vary on:选项可以让前端的缓存服务器缓存经过gzi压缩的页面
将以上的压缩功能参数加入到主配置文件httpd配置中段。重启服务,查看网页压缩功能的结果。
2.3.2 优化网页压缩设置
[root@server ~]# vi /etc/nginx.conf
...
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/x-javascript application/javascript application/json application/x-httpd-php application/xml image/jpg image/jpeg image/gif image/png;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
...
[root@server ~]# 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@server ~]# systemctl stop nginx.service
[root@server ~]# systemctl start nginx.service
- 在浏览器上访问IP,抓包查看
2.4 防盗链优化
2.4.1 防盗链概述
- 在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失;
- Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理。
2.4.2 配置流程及说明
- 配置流程
配置Nginx实现防盗链,重启服务,再次访问图片,检测防盗效果
- 配置说明
~* \.(jpg|gif|swf)$:匹配以.jpg或.swf结尾的不区分大小写的文件
valid_referes:设置信任的网站,即能引用相应图片的网站
网址或者域名:referer中包含相关字符串的网址
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面
2.4.3 配置步骤
- 修改nginx主配置文件
[root@server ~]# vi /etc/nginx.conf
...
location ~* \.(jpg|gif|swf)$ {
valid_referers none blocked *.aa.com aa.com 192.168.140.15;
if ($invalid_referer) {
rewrite ^/ http://192.168.140.15/error.png;
}
}
...
- 检查语法,并重启nginx服务
[root@server ~]# 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@server ~]# systemctl stop nginx.service
[root@server ~]# systemctl start nginx.service
- 删除原有的html文件,并设置映射地址
[root@server ~]# cd /usr/local/nginx/html/
[root@server html]# rm -rf index.html
[root@server html]# cd
[root@server ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.140.15 www.aa.com
- 添加 html 文件和需要的图片,放入该目录下
- 访问网址
2.4.4 进行盗链操作
- 在另一台主机上,进行以下配置
[root@server2 ~]# yum -y install httpd
[root@server2 ~]# vi /var/www/html/index.html
<html><body>no no no</p>
<img src="http://192.168.140.15/a.jpg" />
</body></html>b
[root@server2 ~]# systemctl stop firewalld
[root@server2 ~]# setenforce 0
[root@server2 ~]# systemctl start httpd
[root@server2 ~]# vi /etc/hosts
...
192.168.140.15 www.aa.com //添加映射地址
- 在浏览器中访问该主机的IP,如图
2.5 对FPM模块进行参数优化
FPM模块概述
- Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整
- FPM模块参数调整,要根据服务器的内存与服务负载进行调整
- 启动fpm进程方式
static:将产生固定数量的fpm进程dynamic:将以动态的方式产生fpm进程
通过pm参数指定
2.5.1 FPM优化参数
- Static的方式的参数
pm.max_children: 指定启动的进程数量
- Dynamic方式的参数
pm.max_children:指定启动进程数的最大值
pm.start_servers: 动态方式下初始的fpm进程数
pm.min_spare_servers: 动态方式下最小的fpm空闲进程数
pm.max_spare_servers: 动态方式下最大的fpm空闲进程数
2.5.2 FPM优化参数实例
-
优化原因:
服务器为云服务器,运行了个人论坛,内存为15G,fpm进程数为20,内存消耗近1G,处理比较慢 -
优化参数调整
FPM启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多可以有20个进程存在pm=dynamic
pm.max_children=20
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
要根据服务器的内存与服务负载进行调整
- 启动fpm进程方式
static:将产生固定数量的fpm进程
dynamic:将以动态的方式产生fpm进程
通过pm参数指定
[root@lnmp ~]# vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
pm = dynamic
pm.max_children =20 '//static模式下空闲进程数上限,大于下面的值'
pm.start_servers = 5 '//动态方式 下默认开启的进程数,在最小和最大之间'
pm.min_spare_servers = 2 '//动态方式下最少空闲进程数'
pm.max_spare_servers = 8 '//动态方式下最大空闲进程数'
[root@lnmp ~]# 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@lnmp ~]# systemctl restart nginx
- 验证结果
[root@lnmp ~]# ps aux | grep php-fpm //查看进程状态,默认进程2个
[root@lnmp ~]# pkill php-fpm //终止进程
[root@lnmp ~]# /usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini //重新加载
[root@lnmp ~]# ps aux | grep php-fpm