文章目录
前言
在企业信息化应用环境中,服务器的安全性和响应速度需要根据实际情况进行响应参数配置,以达到最优的用户体验
默认的 Nginx 安装参数只能提供最基本的服务,还需要调如网页缓存时间、连接超时、网页压缩等响应参数,才能发挥出服务器的最大作用
一、Nginx 服务优化
1. 隐藏版本号
- 在生产环境中,需要隐藏 Nginx 版本号,以避免泄露 Nginx 的版本,使攻击者不能针对特定版本进行攻击
1.1 查看版本号
- 网页查看
f12–>网络–> ctrl+r–>选择请求–>标头
- 本地查看
[root@c7-3 ~]# curl -I http://192.168.3.101
HTTP/1.1 200 OK
Server: nginx/1.12.2
1.2 隐藏版本号
- 方法一:修改配置文件
[root@c7-3 ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #添加,关闭版本号
......
[root@c7-3 ~]# 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@c7-3 ~]# systemctl restart nginx #重启服务
[root@c7-3 ~]# curl -I http://192.168.3.101 #验证是否已隐藏
HTTP/1.1 200 OK
Server: nginx #隐藏成功
- 方法二:修改源码文件
[root@c7-3 ~]# vim /opt/nginx-1.12.2/src/core/nginx.h
......
#define nginx_version 1012002
#define NGINX_VERSION "8.8.8.8" #修改版本号
#define NGINX_VER "mysql/" NGINX_VERSION #修改服务器类型
......
[root@c7-3 ~]# cd /opt/nginx-1.12.2/ #重新编译安装
[root@c7-3 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@c7-3 nginx-1.12.2]# make && make install
[root@c7-3 nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
.......
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; #开启版本号
[root@c7-3 nginx-1.12.2]# 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@c7-3 nginx-1.12.2]# systemctl restart nginx
[root@c7-3 nginx-1.12.2]# curl -I http://192.168.3.101 #验证
HTTP/1.1 200 OK
Server: mysql/8.8.8.8 #成功
2. 修改用户与组
- Nginx 运行时进程需要有用户与组的支持,用以实现对网站文件读取时进行访问控制。
主进程由 root 创建,子进程由指定的用户与组创建。 - Nginx 默认使用 nobody 用户账号与组账号,一般需要进行修改。
- 修改 Nginx 用户和组有两种方法
1.编译安装时指定用户和组,
2.修改配置文件指定用户和组。
2.1 编译时指定用户和组
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
2.2 修改配置文件
[root@c7-3 nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
user nginx; #第一行,去掉注释,修改为nginx
worker_processes 1;
[root@c7-3 nginx-1.12.2]# systemctl restart nginx
[root@c7-3 nginx-1.12.2]# ps aux |grep nginx
root 8119 0.0 0.0 20500 604 ? Ss 01:00 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 8120 0.0 0.0 23028 1388 ? S 01:00 0:00 nginx: worker process #修改成功
root 8124 0.0 0.0 112676 976 pts/2 S+ 01:00 0:00 grep --color=auto nginx
3. 配置网页缓存时间
- 当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度
- 一般针对静态网页设置,对动态网页不设置缓存时间;因为动态页面是一直交互的状态,若是设置动态页面缓存时间会一直占用网页的缓存空间
3.1 修改配置文件
- 在新的 location 段加入 expires 参数,指定缓存的时间,1d表示一天(若设置1.5天可指定为1d12h)
[root@c7-3 nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location,以图片作为缓存对象
root html;
expires 1d; #指定缓存时间为1天
}
......
2. 上传图片到 html 目录中、修改站点文件
[root@c7-3 html]# cd /usr/local/nginx/html/
[root@c7-3 html]# rz -E #把图片直接拖进去就行
rz waiting to receive.
[root@c7-3 html]# vim index.html
<body>
14 <h1>天冷了,多加衣服,照顾好自己</h1>
15 <img src="1.jpg"/> #添加图片
16 <p>If you see this page, the nginx web server is successfully installed and
- 访问页面
- Cache-Control: max-age=86400 表示缓存时间是86400秒(一天),在一天内访问这个页面都是用的缓存中的数据,不需要向服务器重新发出请求,可以有效减小服务器的带宽使用率
4. 日志切割
- 随着 Nginx 服务运行时间的增加,它的日志也会增加,为了能够方便知道 Nginx 的运行状态,需要时刻关注 Nginx 日志文件。过大的日志文件不利于日常监控和分析排查,因此需要定期的对日志文件进行切割。
- Nginx 没有类似 Apache 的 cronlog 日志分割处理功能,但可以通过 Nginx 的信号控制功能脚本来实现日志的自动切割,并将脚本加入到 Linux 的计划任务中
- 通过Linux的计划任务周期性地进行日志切割
4.1编写脚本进行日志切割
- 设置时间变量
- 设置保存日志路径
- 将目前的日志文件进行重命名
- 重建新日志文件
- 删除时间超过30天的日志文件
- 设置cron任务,定期执行脚本自动进行日志分割
vim /opt/rzfg.sh
#!/bin/bash
#Filename:fenge.sh
d=$(date -d "-1 day" "+%Y%m%d") #-d表示设置,-1 day表示前一天
logs_path="/var/log/nginx" #日志存放的位置
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path #判断是否有日志文件的目录,没有就创建
#移动访问日志到log_path,并命名test.com;脚本执行后创建日志进行命令,用时间戳的方式来标记唯一性
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d
kill -HUP $(cat $pid_path) #重载然后生成新的access日志
find $logs_path -mtime +30 | xargs rm -rf #删除30天前的日志
#!/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 -HUP $(cat $pid_path)
find $logs_path -mtime +30 | xargs rm -rf
4.2 测试脚本
[root@c7-3 opt]# bash -x rzfg.sh
++ date -d '-1 day' +%Y%m%d
+ d=20211010
+ logs_path=/var/log/nginx
+ pid_path=/usr/local/nginx/logs/nginx.pid
+ '[' -d /var/log/nginx ']'
+ mkdir -p /var/log/nginx
+ mv /usr/local/nginx/logs/access.log /var/log/nginx/test.com-access.log-20211010
++ cat /usr/local/nginx/logs/nginx.pid
+ kill -HUP 8652
+ find /var/log/nginx -mtime +30
+ xargs rm -rf
[root@c7-3 /]# ls /var/log/nginx/
test.com-access.log-20211010 #成功按日期进行了日志分割
[root@c7-3 /]# ls /usr/local/nginx/logs/
access.log error.log nginx.pid
[root@c7-3 /]# date -s 20211111 #修改时间进行测试
2021年 11月 11日 星期四 00:00:00 CST
[root@c7-3 /]# bash /opt/rzfg.sh
[root@c7-3 /]# ls /var/log/nginx/
test.com-access.log-20211010 test.com-access.log-20211110 #成功分割
[root@c7-3 /]# ntpdate ntp1.aliyun.com #再同步回时间
11 Oct 01:46:02 ntpdate[8964]: step time server 120.25.115.20 offset -2672155.488919 sec
4.3 设置 crontab 任务,定期执行脚本自动进行日志分割
[root@c7-3 /]# crontab -e
0 1 * * * /opt/rzfg.sh #添加
#每天凌晨 1:30 分执行/opt/rzfg.sh 脚本,进行日志分割
[root@c7-3 /]# crontab -l
0 1 * * * /opt/rzfg.sh
5.设置连接超时
- 为避免同一客户端长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
5.1 参数配置
[root@c7-3 /]# vim /usr/local/nginx/conf/nginx.conf
http {
......
#keepalive_timeout 0;
keepalive_timeout 65; #设置连接保持超时时间
Client_header_timeout 80; #等待客户端发送请求头的超时时间,超时会发送408错误
Client_body_timeout 80; #等待客户端发送请求体的超时时间
......
- 添加两行
二、nginx深入优化
1.更改进程数
- 在高并发环境中,需要启动更多的 Nginx 进程以保证快速响应,用以处理用户的请求,避免造成阻塞
#ps aux 命令可以查看 Nginx 运行进程的个数
[root@c7-3 ~]# ps -aux | grep nginx
root 904 0.0 0.0 20500 612 ? Ss 11:27 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 906 0.0 0.0 23028 1396 ? S 11:27 0:00 nginx: worker process
root 1651 0.0 0.0 112680 980 pts/0 S+ 11:31 0:00 grep --color=auto nginx
#master process 是 Nginx 的主进程,开启了一个;worker process 是子进程,开启了一个
- 修改 Nginx 配置文件中的 work_processes 参数,一般设为 CPU 的个数或核数,在高并发的情况下可以设置为 CPU 个数或核数的2倍
#可以先查看 CPU 的核数来确定参数
[root@c7-3 ~]# cat /proc/cpuinfo |grep -c "physical"
8
[root@c7-3 ~]# vim /usr/local/nginx/conf/nginx.conf
1
2 user nginx;
3 worker_processes 8; #修改为8核
4 worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001;
##10000000表示启用第一个CPU内核,01000000表示启用第二个CPU内核,以此类推
参数设置为8,和CPU的核数相同。
运行进程数设置多一些,响应客户端访问请求时,Nginx 就不会启动新的进程提供服务,从而减小了系统的开销,提升了服务的速度
- 修改完成后,重启服务,再使用 ps aux 命令查看运行进程数的变化情况
[root@c7-3 ~]# systemctl restart nginx.service
[root@c7-3 ~]# ps aux |grep nginx
root 2407 0.0 0.0 20500 668 ? Ss 12:42 0:00 nginx: master process /usr/local/ng
inx/sbin/nginxnginx 2408 0.0 0.0 23028 1400 ? S 12:42 0:00 nginx: worker process
nginx 2409 0.0 0.0 23028 1400 ? S 12:42 0:00 nginx: worker process
nginx 2410 0.0 0.0 23028 1400 ? S 12:42 0:00 nginx: worker process
nginx 2411 0.0 0.0 23028 1400 ? S 12:42 0:00 nginx: worker process
nginx 2412 0.0 0.0 23028 1400 ? S 12:42 0:00 nginx: worker process
nginx 2413 0.0 0.0 23028 1400 ? S 12:42 0:00 nginx: worker process
nginx 2414 0.0 0.0 23028 1400 ? S 12:42 0:00 nginx: worker process
nginx 2415 0.0 0.0 23028 1400 ? S 12:42 0:00 nginx: worker process
root 2419 0.0 0.0 112676 980 pts/0 S+ 12:42 0:00 grep --color=auto nginx
#开启了一个主进程和八个子进程,设置的参数成功生效了
#默认情况下,Nginx 的多个进程可能更多地跑在一个 CPU 上,可以分配不同的进程给不同的 CPU 处理,
#以充分利用硬件多核多 CPU 。
#在一台 8 核的 CPU 服务器上,设置每个进程分别由不同的 CPU 核心处理,来达到 CPU 的性能最大化。
2. 配置网页压缩
- Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,允许 Nginx 服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验。
- 默认 Nginx 已安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
2.1 压缩功能参数
[root@c7-3 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......
gzip on;
#开启gzip压缩功能
gzip_min_length 1k;
#用于设置允许压缩的页面最小字数
gzip_buffers 4 16k;
#表示申请4个单位为16KB的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1;
#用于识别http协议版本,默认是1.1,目前大部分浏览器已支持gzip压缩,但处理很慢,也比较消耗CPU资源
gzip_comp_level 6;
#用来指定gzip压缩比,压缩比1最小,处理速度最快;压缩比为9最大,传输速度快,但处理速度最慢,使用默认即可
gzip_vary on;
#该选项可以让前端的缓存服务器缓存经过gzip压缩的页面
gzip_types text/plain application/x-javascript text/css image/jpg image/jpeg image/png image/gif application/xml text/javascript application/x-httpd-php application/javascript application/json;
#压缩类型,表示哪些网页文档启用压缩功能
......
}
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_vary on;
gzip_types text/plain application/x-javascript text/css image/jpg image/jpeg image/png image/gif application/xml text/javascript application/x-httpd-php application/javascript application/json;
2.2 上传图片到 /usr/local/nginx/html 目录下
[root@c7-3 ~]# cd /usr/local/nginx/html/
[root@c7-3 html]# rz -E
rz waiting to receive.
[root@c7-3 html]# ls
50x.html index.html 口出狂言.jpg
[root@c7-3 html]# vim index.html
......
<h1>口出狂言</h1>
<img src="口出狂言.jpg"/>
......
- 浏览器访问
3.盗链与防盗链
- 盗链是一种恶意行为,在互联网上广泛存在;在企业网站中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免不必要的带宽浪费
3.1 盗链
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率,受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益
- 所需环境
三台机器
盗链端: 192.168.3.
服务端:192.168.3.101
win10: 192.168.3.105 #配置/hosts
3.1.1 服务端配置
#设置域名和IP映射关系
[root@c7-3 ~]# vim /etc/hosts
192.168.3.101 www.dsj.com
[root@c7-3 ~]# cd /usr/local/nginx/html
[root@c7-3 html]# rz -E #直接把图片拖进去
rz waiting to receive.
[root@c7-3 html]# vim index.html
14 <h1>嘿嘿嘿嘿</h1>
15 <img src="猴.jpg"/>
3.1.2盗链端配置
[root@c7-1 ~]# vim /etc/hosts
192.168.3.3 www.dsj1.com
192.168.3.101 www.dsj.com
[root@c7-1 opt]# vim /usr/local/nginx/html/index.html
<h1>盗链啦</h1>
<img src="http://www.dsj.com/猴.jpg"
[root@c7-1 opt]# curl www.dsj1.com
.....
<h1>盗链啦</h1>
<img src="http://www.dsj.com/猴.jpg">
.....
3.1.3 win10配置
首次修改文件需要更改权限,文件位置——C:\WINDOWS\System32\drivers\etc
- 找到自己的用户,选择他,点击确定
- 然后以记事本的方式打开,添加盗链端dns
- 访问盗链端
3.2 防盗链
3.2.1 server 端配置
[root@c7-3 html]# vim /usr/local/nginx/conf/nginx.conf
server {
......
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
valid_referers *.dsj.com dsj.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.dsj.com/error.png;
}
}
......
- 配置文件说明
location ~*\.(gif|jpg|swf)$ { #匹配不区分大小写,以.gif或.gpg或.swf为结尾的文件
valid_referers *.dsj.com dsj.com; #设置被信任的访问来源,www.haha.com可以正常使用图片
if ( $invalid_referer ) {
rewrite ^/ http://www.dsj.com/error.png;
#nginx可以识别简单的if单分支判断语句
#if语句来表示若链接的来源域名不是被信任的网址,$invalid_referer为1,则进行重写或返回403页面
- 上传 error.png 文件到 /usr/local/nginx/html 目录
[root@c7-3 html]# cd /usr/local/nginx/html/
[root@c7-3 html]# rz -E
rz waiting to receive.
[root@c7-3 html]# ls
50x.html error.jpg index.html 猴.jpg 口出狂言.jpg
- 检查配置文件语法,重启服务
[root@c7-3 html]# 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@c7-3 html]# systemctl restart nginx
- 浏览器验证
上面可以看到显示出来的是被重写的图片,说明防盗链配置成功!
4.FPM 参数优化
Nginx 的 PHP 解析功能实现如果是交由 FPM 处理的,为了提供 PHP 的处理速度,可对 FPM 模块进行参数的调整。
- 首先安装带 FPM 模块的 PHP 环境,保证 PHP 可以正常运行
- FPM 进程有两种启动方式,由 pm 参数指定,分别是 static 和 dynamic,前者将产生固定数据的 fpm 进程,后者将以动态的方式产生 fpm 进程
- static 方式可以使用 pm.max_children 指定启动的进程数量。dynamic 方式的参数则要根据服务器的内存与服务负载进行调整,参数下所示
选项 | 说明 |
---|---|
pm.max_children | pm.max_children |
pm.start_servers | 动态方式下初始的 ftpm 进程数量 |
动态方式下初始的 ftpm 进程数量 | 动态方式下最小的 fpm 空闲进程数 |
pm.max_spare_servers | 动态方式下最大的 fpm 空闲进程数 |
假设云服务器上运行了个人论坛,内存为1.5 GB ,fpm 进程数为20,内存消耗将近 1GB ,处理速度较慢,需对参数进行优化处理
[root@server ~]# vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
[root@server ~]# vim /usr/local/php/etc/php-fpm.d/www.conf
pm = dynamic #将以动态的方式产生fpm进程
pm.max_children=20 #static模式下空闲进程数上限,大于下面的值
pm.start_servers = 5 #动态方式下默认开启的进程数,在最小和最大之间
pm.min_spare_servers = 2 #动态方式下最少空闲进程数
pm.max_spare_servers = 8 #动态方式下最大空闲进程数
#FPM 启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多可以有20个进程存在
#重启 php-fpm
[root@server ~]# kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
[root@server ~]# netstat -anpt | grep 9000
总结
- Nginx 配置文件路径:/usr/local/nginx/conf/nginx.conf
- Nginx 配置文件组成:global 全局模块配置;http { } 模块配置;server 模块;location 匹配 URL 和路径
- Nginx 服务优化包括隐藏版本号、更改用户与组、配置网页缓存时间、日志切割、设置连接超时