文章目录
- 前言
- 一、隐藏版本号
-
- [1.1 查看当前版本号](#1.1 查看当前版本号)
- [1.2 方法一:修改配置文件](#1.2 方法一:修改配置文件)
- [1.3 方法二:修改源码并重编译](#1.3 方法二:修改源码并重编译)
- 二、修改用户与组
-
- [2.1 配置用户与组](#2.1 配置用户与组)
- 三、缓存时间设置
-
- [3.1 配置缓存时间](#3.1 配置缓存时间)
- 四、日志切割
-
- [4.1 日志切割脚本](#4.1 日志切割脚本)
- 五、连接超时设置
-
- [5.1 配置连接超时参数](#5.1 配置连接超时参数)
- 六、更改进程数
-
- [6.1 优化进程数与 CPU 亲和性](#6.1 优化进程数与 CPU 亲和性)
- 七、配置网页压缩
-
- [7.1 启用 Gzip 压缩](#7.1 启用 Gzip 压缩)
- 八、配置防盗链
-
- [8.1 防盗链配置示例](#8.1 防盗链配置示例)
- [8.2 测试准备](#8.2 测试准备)
- [8.3 防盗链验证](#8.3 防盗链验证)
- [8.4 完整流程](#8.4 完整流程)
- 总结
前言
Nginx 作为一款高性能的 Web 服务器和反向代理服务器,广泛应用于各类互联网业务中。良好的配置实践不仅可以显著提升服务性能与访问体验,还能有效增强服务的安全性。
本文系统梳理了 Nginx 常见的性能优化方法与防盗链配置步骤,涵盖隐藏版本号 、调整用户与组 、设置缓存时间 、日志切割 、超时设置 、进程调优 、网页压缩 以及防盗链策略等多个方面,适用于生产环境中的 Nginx 服务调优与安全加固。
一、隐藏版本号
1.1 查看当前版本号
可使用 Fiddler 工具抓包查看 Nginx 版本,或在 CentOS 中使用以下命令查看响应报文首部信息:
bash
curl -I http://192.168.10.123

1.2 方法一:修改配置文件
编辑 Nginx 配置文件:
bash
vim /usr/local/nginx/conf/nginx.conf
在 http 块中添加以下配置:
nginx
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; # 关闭版本号显示
...
}

重启 Nginx 服务并验证:
bash
systemctl restart nginx
curl -I http://192.168.10.123

1.3 方法二:修改源码并重编译
修改 Nginx 源码文件:
bash
vim /opt/nginx-1.20.2/src/core/nginx.h
更改以下定义:
c
#define NGINX_VERSION "1.1.1" # 自定义版本号
#define NGINX_VER "IIS" NGINX_VERSION # 自定义服务器类型

重新配置并编译:
bash
cd /opt/nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
make
手动替换二进制文件:
bash
systemctl stop nginx #关闭服务
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.backup # 备份旧版本
cp /opt/nginx-1.20.2/objs/nginx /usr/local/nginx/sbin/nginx # 替换为新编译的二进制文件
systemctl start nginx #重启服务

编辑配置文件,将 server_tokens
设置为 on,并重启服务:
bash
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens on;
......
}
# 重启服务并测试
systemctl restart nginx
curl -I http://192.168.10.110

二、修改用户与组
2.1 配置用户与组
编辑 Nginx 配置文件,修改用户和组为 nginx:
nginx
user nginx nginx; # 取消注释并修改
重启服务并验证进程所属用户:
bash
systemctl restart nginx
ps -aux | grep nginx
应显示主进程由 root 创建,子进程由 nginx 创建。

三、缓存时间设置
3.1 配置缓存时间
当Nginx将网页数据返回给客户端后,可设置缓存时间 ,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度。一般针对静态网页设置,对动态网页不设置缓存时间。
Nginx服务器处理请求并配置缓存的完整流程。核心流程和关键配置如下:
1、用户请求:浏览器发起对图片资源(如JPG/PNG)的HTTP请求。
2、Nginx接收请求:通过80端口监听请求,匹配配置中的location规则(例如正则表达式location ~ .(jpg|png))。
3、资源处理:Nginx根据root配置找到磁盘上的文件,并读取数据。
4、响应与缓存控制:
- 返回资源时,Nginx 根据 expires 1d的配置,在响应头中设置 Cache-Control: max-age=86400和 Expires字段,从而强制浏览器缓存资源1天。
- 浏览器接收后会将资源存入本地缓存,并在后续请求中优先使用缓存(避免重复请求)。
5、客户端行为:浏览器遵循缓存策略,在有效期内(86400秒)直接使用本地缓存,提升页面加载效率。
为静态资源设置缓存时间,提升静态资源访问效率并降低服务器负载。在 server 块中添加以下 location 配置:
nginx
location / {
root html;
index index.html index.htm;
}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
root html;
expires 1d; # 设置缓存时间为1天
}
重启服务并测试访问
bash
#重启服务
systemctl restart nginx
#测试访问
http://192.168.10.110/game.jpg
- 打开浏览器(推荐使用Chrome),按下
F12
键 - 切换到Network(网络)选项卡
- 访问URL:http://192.168.10.110/game.jpg
- 在响应列表中找到200状态码的请求,双击查看详情
- 在响应头中确认存在
Cache-Control:max-age=86400
字段
该设置表示资源缓存有效期为86400秒(24小时)。在此期间,浏览器会直接使用本地缓存数据,无需向Nginx服务器重复请求,有效降低服务器带宽消耗。

四、日志切割
优化日志分割策略,便于日常分析和文件大小管理,防止日志文件过大。
4.1 日志切割脚本
创建日志切割脚本 /opt/fenge.sh
,内容如下:
bash
vim /opt/fenge.sh
#!/bin/bash
# Filename: fenge.sh
#显示前一天的时间
day=$(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#移动并重命名日志文件(需通知Nginx重建)
mv /usr/local/nginx/logs/www.simoncwh.access.log ${logs_path}/www.simoncwh.access.log-$day
#重建新日志文件
kill -USR1 $(cat $pid_path)
#删除30天之前的日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;
#find $logs_path -mtime +30 | xargs rm -rf
添加执行权限并设置定时任务:
bash
chmod +x /opt/fenge.sh
crontab -e
# 添加以下行,每天凌晨1点执行日志切割
0 1 * * * /usr/bin/sh /opt/fenge.sh
五、连接超时设置
HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。
5.1 配置连接超时参数
在 http 块中设置以下参数,优化连接管理:
nginx
http {
......
keepalive_timeout 65 180; # 保持连接的超时时间,空闲连接65秒后关闭,建议客户端超时180秒
client_header_timeout 80; # 客户端发送请求头超时时间
client_body_timeout 80; # 客户端发送请求体超时时间
}

参数说明:
keepalive_timeout
:指定 TCP 连接保持时间。- Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
client_header_timeout
:客户端发送完整请求头的超时时间,超时返回 408(Request Timed Out)。client_body_timeout
:客户端发送请求体的超时时间,超时返回 408。
重启 Nginx 使配置生效。
bash
systemctl restart nginx
六、更改进程数
在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞
6.1 优化进程数与 CPU 亲和性
查看 CPU 核数并调整 Nginx 工作进程数:
bash
cat /proc/cpuinfo | grep "processor" |sort -u |wc -l #查看cpu逻辑核数
ps -aux | grep nginx #查看nginx主进程中包含几个子进程

编辑配置文件,设置工作进程数和 CPU 亲和性:
nginx
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2; # 建议与 CPU 核数相同或为其2倍
worker_cpu_affinity 01 10; # 设置进程与 CPU 绑定(示例为2核配置),进程数配为4时0001 0010 0100 1000

最优雅和自动化的方式是直接使用 auto 参数,Nginx 会自动检测并设置为逻辑核心数。
bash
worker_processes auto; # 推荐:自动设置为逻辑CPU核心数

重启 Nginx 服务。
bash
systemctl restart nginx
使用场景 :
1、高并发
2、CPU压力不均衡的时候
七、配置网页压缩
Nginx的ngx_http_gzip_module模块提供了内容压缩功能。
该模块默认已安装,能够在向客户端发送数据前对输出内容进行压缩,有效节省带宽并提升用户体验。
可以通过修改配置文件中的相关参数来优化压缩性能。
7.1 启用 Gzip 压缩
在 http 块中启用压缩功能,优化传输效率:
nginx
vim /usr/local/nginx/conf/nginx.conf
http {
......
gzip on; #取消注释,开启gzip压缩功能
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 64k; #压缩缓冲区,大小为4个64k缓冲区
gzip_http_version 1.1; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 6; #压缩比率 1:压缩比最小,速度最快;9:压缩比最大,传输速度最快,但处理也最慢,也比较的消耗CPU资源
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; #压缩类型,表示哪些网页文档启用压缩功能
......
}
在 HTML 中引用图片资源,重启 Nginx 后通过浏览器验证响应头是否包含 Content-Encoding: gzip
。
bash
cd /usr/local/nginx/html
先将game.jpg文件传到/usr/local/nginx/html目录下
vim index.html
......
<html>
<body>
<img src="game.jpg"/> #网页中插入图片
</body>
</html>
重启nginx服务
bash
systemctl restart nginx
- 打开浏览器(推荐使用Chrome),按下
F12
键 - 切换到Network(网络)选项卡
- 访问URL:http://192.168.10.110
- 在响应列表中找到200状态码的请求,双击查看详情
- 在响应头中确认存在
Content-Encoding: gzip
字段

八、配置防盗链
环境规划
- Nginx 源主机:192.168.10.110:80 域名(www.yjs.com)
- 盗链网站主机:192.168.10.123:80 域名(www.simoncwh.com)
8.1 防盗链配置示例
在 Nginx 源主机nginx.conf中的server 块中添加以下 location 配置,防止非法网站盗用资源:
bash
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
......
location ~* \.(jpg|gif|swf)$ {
valid_referers none blocked *.yjs.com yjs.com;
if ( $invalid_referer ) {
# 将请求路径为 ^/(^/会匹配 所有请求路径)的URL重定向到 http://www.yjs.com/error.png
rewrite ^/ http://www.yjs.com/error.png;
#return 403;
}
}
......
}
}
参数说明:
~* \.(jpg|gif|swf)$
:匹配不区分大小写,以.jpg、.gif或.swf结尾的文件valid_referers
:配置可信来源网站,允许其正常访问图片资源- 访问控制规则:
none
:允许不带Referer字段的请求(如直接在地址栏输入URL,这种请求是不会包含 Referer 字段的)blocked
:允许非http://开头的,不带协议的请求访问资源*.yjs.com
:仅允许来自该域及其子域的请求
访问示例:通过http://www.yjs.com
访问game.jpg
时,请求被视为来自http://www.yjs.com
判断逻辑(if):当请求来源不在valid_referers列表中时,$invalid_referer为true,将执行重定向或返回403禁止访问
8.2 测试准备
在 Web 源主机和盗链网站主机分别配置 hosts 和 HTML 页面,测试防盗链是否生效。
网页准备:
Web源主机(192.168.10.110)配置:
bash
cd /usr/local/nginx/html
将game.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
<html>
<body>
<img src="game.jpg"/>
</body>
</html>
echo "192.168.10.110 www.yjs.com" >> /etc/hosts
echo "192.168.10.123 www.simoncwh.com" >> /etc/hosts
盗链网站主机(192.168.10.123):
bash
cd /usr/local/nginx/html
vim index.html
......
<html>
<body>
<img src="http://www.yjs.com/game.jpg"/>
</body>
</html>
echo "192.168.10.110 www.yjs.com" >> /etc/hosts
echo "192.168.10.123 www.simoncwh.com" >> /etc/hosts
在盗图网站主机上进行浏览器验证
8.3 防盗链验证
- 正常访问
www.yjs.com

- 不设置防盗链时访问
http://www.simoncwh.com

- 设置防盗链时访问
http://www.simoncwh.com

8.4 完整流程
-
DNS 解析:
- 在浏览器中访问
http://www.simoncwh.com
。 - 客户端检查
/etc/hosts
文件,发现www.simoncwh.com
映射到192.168.10.123
。 - 浏览器向
192.168.10.123
发送 HTTP 请求获取index.html
。
- 在浏览器中访问
-
获取 HTML 内容:
-
192.168.10.123
的 Nginx 服务器返回index.html
内容。 -
HTML 内容如下:
html<html> <body> <img src="http://www.yjs.com/game.jpg"/> </body> </html>
-
-
加载图片资源:
- 浏览器解析 HTML 后,发现需要加载图片
http://www.yjs.com/game.jpg
。 - 客户端再次检查
/etc/hosts
文件,发现www.yjs.com
映射到192.168.10.110
。 - 浏览器向
192.168.10.110
发送请求获取game.jpg
,并在请求头中设置Referer
为http://www.simoncwh.com/
(因为图片是从www.simoncwh.com
页面引用的)。
- 浏览器解析 HTML 后,发现需要加载图片
-
防盗链检查:
- 请求到达
192.168.10.110
的 Nginx 服务器。 - Nginx 匹配防盗链规则
location ~* \.(jpg|gif|swf)$
,因为请求的是game.jpg
。 - Nginx 检查
Referer
头(值为http://www.simoncwh.com/
)是否在valid_referers
列表中(none blocked *.yjs.com yjs.com
)。 Referer
来自www.simoncwh.com
,不在允许列表中,因此$invalid_referer
变量值为 1,触发防盗链操作。- Nginx 执行
rewrite ^/ http://www.yjs.com/error.png;
,这返回一个 302 重定向 响应, Response Header 中的 Location 头为http://www.yjs.com/error.png
。
- 请求到达
-
重定向处理:
- 浏览器收到 302 重定向响应,自动向新 URL
http://www.yjs.com/error.png
发送请求。 - 浏览器在这次请求中可能还会设置
Referer
头为http://www.simoncwh.com/
(因为重定向发生在同源环境下,浏览器通常保留原始 Referer)。
- 浏览器收到 302 重定向响应,自动向新 URL
-
获取 error.png:
- 请求
error.png
到达192.168.10.110
的 Nginx 服务器。 - 防盗链规则只针对
.jpg
、.gif
和.swf
文件,因此error.png
不匹配防盗链 location 块。 - Nginx 直接返回
error.png
图片内容(假设该文件存在于服务器上)。
- 请求
-
最终显示:
- 浏览器接收到
error.png
图片,并显示在www.simoncwh.com
的页面上,代替原本的game.jpg
。 - 用户看到的是错误图片(error.png),而不是预期的 game.jpg。
- 浏览器接收到
总结
通过以上几个方面的配置优化,不仅可以提升 Nginx 服务器的处理能力和响应速度,还能有效加强服务的安全性。
在实际生产环境中,应根据具体业务需求和服务器资源情况灵活调整各项参数。定期审查和更新配置,结合监控日志,可确保服务持续稳定运行。
建议在修改配置前备份原文件,并在测试环境验证无误后再部署至生产环境。