前言
Nginx 是一款高性能的 Web 服务器和反向代理服务器,不管是搭建网站、做反向代理还是负载均衡,都能发挥出色的作用。但默认配置下,它的性能潜力没有完全释放,而且还可能面临资源被盗用、版本漏洞攻击等问题。
本文就从实际应用出发,详细讲解 Nginx 的 8 大核心配置------隐藏版本号、修改用户与组、设置缓存时间、日志切割、配置连接超时、调整进程数、开启网页压缩和防盗链,每个步骤都通俗易懂,跟着操作就能完成配置,同时不遗漏关键细节。
一、隐藏版本号
Nginx 默认会在响应头中显示版本号,这可能让攻击者利用特定版本的已知漏洞攻击服务器。隐藏版本号能提升服务器安全性,有两种常用方法。
1.1 查看当前版本号
在 CentOS 系统中,可通过命令查看 Nginx 版本,也能使用 Fiddler 工具抓包查看:
bash
curl -I http://192.168.10.123 # 替换为你的服务器IP
执行后如果看到 "Server: nginx/1.20.2" 这类内容,后面的数字就是当前版本号。
1.2 方法一:修改配置文件
这是最简便的方法,无需重新编译 Nginx:
- 编辑 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,会发现响应头中只有 "Server: nginx",版本号已隐藏。
1.3 方法二:修改源码并重编译
如果想自定义服务器类型(比如伪装成 IIS),可以修改源码后重新编译:
- 编辑 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 # 自定义服务器类型(比如改成IIS)
- 重新配置并编译 Nginx:
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 # 编译
- 替换旧的 Nginx 二进制文件:
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 # 替换为新编译文件
- 编辑配置文件开启版本显示(验证效果):
bash
vim /usr/local/nginx/conf/nginx.conf
http {
server_tokens on; # 开启版本显示
...
}
- 重启服务并验证:
bash
systemctl start nginx
curl -I http://192.168.10.123 # 会显示 Server: IIS/1.1.1
二、修改用户与组
默认情况下,Nginx 可能以 root 用户运行,存在安全风险。遵循"最小权限原则",将运行用户改为非 root 的 nginx 用户,能降低被攻击后的影响范围。
2.1 配置用户与组
- 编辑 Nginx 主配置文件:
bash
vim /usr/local/nginx/conf/nginx.conf
- 找到并修改
user指令(取消注释,设置为 nginx 用户和组):
nginx
user nginx nginx; # 格式:用户 组
- 重启 Nginx 服务:
bash
systemctl restart nginx
- 验证配置效果:
bash
ps aux | grep nginx
执行后会看到,Nginx 主进程由 root 创建,而处理请求的子进程由 nginx 用户运行,说明配置生效。
三、缓存时间设置
对于图片、CSS、JS 等静态资源,设置浏览器缓存时间后,用户再次访问时会直接从本地缓存加载,无需重新向服务器请求,既能加快页面加载速度,又能减少服务器带宽消耗。
3.1 配置缓存时间
- 编辑 Nginx 主配置文件:
bash
vim /usr/local/nginx/conf/nginx.conf
- 在
server块中添加location配置,匹配静态资源类型:
nginx
server {
... # 原有配置(如监听端口、根目录等)
# 匹配图片、图标等静态资源
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
root html; # 资源存放目录(与主配置一致即可)
expires 1d; # 缓存时间:1天(可改为7d=7天、30d=30天等)
}
}
- 重启 Nginx 服务:
bash
systemctl restart nginx
- 验证缓存效果:
- 把一张图片(比如 game.jpg)放到
/usr/local/nginx/html目录下; - 浏览器访问
http://192.168.10.123/game.jpg(替换为你的服务器IP和图片名); - 按下 F12 打开开发者工具,切换到「网络」选项卡,双击该图片的请求;
- 在响应头中找到
Cache-Control: max-age=86400,86400 秒等于 1 天,说明缓存配置生效。
四、日志切割
Nginx 日志会不断记录访问信息,时间久了文件会变得极大,不仅占用磁盘空间,还会影响日志查看和分析。日志切割就是按时间(比如每天)拆分日志,并自动删除旧日志,保持日志文件轻量化。
4.1 日志切割脚本
- 创建日志切割脚本:
bash
vim /opt/fenge.sh # 脚本存放路径,可自定义
- 写入以下脚本内容(每行都有注释,易懂):
bash
#!/bin/bash
# 日志切割脚本:按天拆分,保留30天日志
day=$(date -d "-1 day" "+%Y%m%d") # 获取前一天的日期(格式:年月日)
logs_path="/var/log/nginx" # 切割后的日志存放目录
pid_path="/usr/local/nginx/logs/nginx.pid" # Nginx进程ID文件路径
[ -d $logs_path ] || mkdir -p $logs_path # 若目录不存在则创建
# 移动并改名旧日志(比如把access.log改为access.log-20250914)
mv /usr/local/nginx/logs/access.log ${logs_path}/access.log-$day
kill -USR1 $(cat $pid_path) # 向Nginx发送信号,重建新日志文件
find $logs_path -mtime +30 -exec rm -rf {} \; # 删除30天前的旧日志
- 给脚本添加执行权限:
bash
chmod +x /opt/fenge.sh
- 测试脚本是否生效:
bash
/opt/fenge.sh # 执行脚本
ls /var/log/nginx # 查看是否生成前一天的日志文件
ls /usr/local/nginx/logs/access.log # 查看是否重建了新日志
- 设置定时任务(每天自动执行):
bash
crontab -e # 编辑定时任务
- 加入以下内容(每天凌晨1点执行切割):
bash
0 1 * * * /opt/fenge.sh
保存退出即可,系统会每天自动执行脚本,无需手动操作。
五、连接超时设置
HTTP 的 KeepAlive 模式会让 TCP 连接在处理完请求后保持打开状态,方便同一客户端再次请求时复用连接。但连接长时间闲置会占用服务器资源,设置合理的超时时间,能释放闲置资源,防止恶意占用。
5.1 配置连接超时参数
- 编辑 Nginx 主配置文件:
bash
vim /usr/local/nginx/conf/nginx.conf
- 在
http块中添加以下超时参数:
nginx
http {
... # 原有配置
keepalive_timeout 65 180; # 核心参数:连接超时时间
client_header_timeout 80; # 客户端发送请求头的超时时间
client_body_timeout 80; # 客户端发送请求体的超时时间
}
- 参数说明(通俗易懂版):
keepalive_timeout 65 180:第一个值 65 秒是服务器关闭闲置连接的时间(默认65秒,浏览器一般只保持60秒,可改为60秒);第二个值 180 秒是告诉浏览器主动关闭连接的时间,减少服务器关闭压力;client_header_timeout 80:如果客户端80秒内没发送完整的请求头,服务器返回 408 超时错误;client_body_timeout 80:如果客户端80秒内没发送请求体(比如上传文件时卡住),服务器返回 408 超时错误。
- 重启 Nginx 服务:
bash
systemctl restart nginx
六、更改进程数
Nginx 采用"主进程+工作进程"模型,工作进程直接处理客户端请求。默认工作进程数较少,高并发场景下会出现阻塞,调整工作进程数能充分利用 CPU 资源,提升并发处理能力。
6.1 优化进程数与 CPU 亲和性
- 查看服务器 CPU 核数:
bash
cat /proc/cpuinfo | grep "processor" | sort -u | wc -l
执行后会输出 CPU 逻辑核数(比如 2 核、4 核)。
- 编辑 Nginx 主配置文件:
bash
vim /usr/local/nginx/conf/nginx.conf
- 修改工作进程数和 CPU 亲和性:
nginx
# 工作进程数:推荐设置为 CPU 核数或 auto(自动匹配核数,推荐)
worker_processes auto; # 比如2核CPU可改为 worker_processes 2;
# CPU 亲和性:让每个进程绑定不同CPU核心,避免进程切换消耗(2核配置示例)
worker_cpu_affinity 01 10; # 4核CPU改为 0001 0010 0100 1000
- 参数说明:
worker_processes auto:Nginx 会自动检测 CPU 核数,分配对应的工作进程数,无需手动计算,适合大多数场景;worker_cpu_affinity:绑定进程到指定 CPU 核心,减少进程切换带来的性能损耗,高并发场景建议配置。
- 重启 Nginx 服务:
bash
systemctl restart nginx
- 验证进程数:
bash
ps aux | grep nginx
执行后会看到,工作进程数与 CPU 核数一致(或与配置的数值一致),说明配置生效。
七、配置网页压缩
Nginx 自带的 Gzip 压缩模块,能在发送数据给客户端前,压缩 HTML、CSS、JS、图片等内容,减少数据传输量,节省带宽,同时加快页面加载速度(尤其是在网络较差的环境下)。
7.1 启用 Gzip 压缩
- 编辑 Nginx 主配置文件:
bash
vim /usr/local/nginx/conf/nginx.conf
- 在
http块中添加以下压缩配置(取消原有注释并补充完整):
nginx
http {
... # 原有配置
gzip on; # 开启Gzip压缩
gzip_min_length 1k; # 最小压缩文件大小(小于1KB的文件不压缩)
gzip_buffers 4 64k; # 压缩缓冲区:4个64KB缓冲区
gzip_http_version 1.1; # 压缩支持的HTTP版本(默认1.1)
gzip_comp_level 6; # 压缩级别:1(最快,压缩比最小)-9(最慢,压缩比最大),推荐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;
}
- 准备测试资源:
- 把一张图片(比如 game.jpg)放到
/usr/local/nginx/html目录; - 编辑 index.html 文件,添加图片引用:
bash
vim /usr/local/nginx/html/index.html
写入内容:
html
<html>
<body>
<img src="game.jpg"/> <!-- 引用图片 -->
</body>
</html>
- 重启 Nginx 服务:
bash
systemctl restart nginx
- 验证压缩效果:
- 浏览器访问
http://192.168.10.123; - 按下 F12 打开开发者工具,切换到「网络」选项卡;
- 双击首页或图片的请求,在响应头中找到
Content-Encoding: gzip,说明压缩生效。
八、配置防盗链
防盗链是防止其他网站直接引用你的服务器资源(比如图片、视频),避免带宽被非法占用,同时保护版权内容。核心原理是通过检测请求的来源(Referer),只允许可信域名访问资源。
8.1 防盗链配置示例
- 编辑 Nginx 主配置文件:
bash
vim /usr/local/nginx/conf/nginx.conf
- 在
server块中添加防盗链配置:
nginx
server {
... # 原有配置(如监听端口、server_name等)
# 匹配图片、动画等需要防盗链的资源
location ~* \.(jpg|gif|swf)$ {
# 可信来源:允许的域名和请求类型
valid_referers none blocked *.yjs.com yjs.com;
# 如果请求来源不在可信列表中
if ($invalid_referer) {
rewrite ^/ http://www.yjs.com/error.png; # 跳转到错误图片
# 也可以直接返回403禁止访问:return 403;
}
}
}
- 参数说明(通俗版):
~* \.(jpg|gif|swf)$:匹配不区分大小写、以 jpg/gif/swf 结尾的文件(可添加 png、mp4 等其他格式);valid_referers:可信来源列表:none:允许直接在浏览器地址栏输入资源URL访问(无 Referer);blocked:允许不带 http:// 协议的请求;*.yjs.com yjs.com:只允许来自 yjs.com 及其子域名的请求(替换为你的域名);
if ($invalid_referer):如果请求来源不在可信列表中,执行跳转或返回403。
8.2 测试准备
需要两台服务器(或虚拟机)模拟测试:
- 源主机(资源所在服务器):IP 192.168.10.110,域名 www.yjs.com;
- 盗链主机(非法引用资源的服务器):IP 192.168.10.123,域名 www.simoncwh.com。
源主机配置:
- 把资源文件(game.jpg 正常图片、error.png 错误图片)放到
/usr/local/nginx/html目录; - 编辑首页文件:
bash
vim /usr/local/nginx/html/index.html
写入内容:
html
<html>
<body>
<img src="game.jpg"/> <!-- 引用正常图片 -->
</body>
</html>
- 配置 hosts 文件(让服务器识别域名):
bash
echo "192.168.10.110 www.yjs.com" >> /etc/hosts
echo "192.168.10.123 www.simoncwh.com" >> /etc/hosts
盗链主机配置:
- 编辑首页文件,引用源主机的图片:
bash
vim /usr/local/nginx/html/index.html
写入内容:
html
<html>
<body>
<!-- 非法引用源主机的 game.jpg -->
<img src="http://www.yjs.com/game.jpg"/>
</body>
</html>
- 配置 hosts 文件:
bash
echo "192.168.10.110 www.yjs.com" >> /etc/hosts
echo "192.168.10.123 www.simoncwh.com" >> /etc/hosts
8.3 防盗链验证
- 正常访问测试:在任意服务器浏览器访问
http://www.yjs.com,能看到 game.jpg 正常图片,说明源主机配置正常; - 盗链访问测试:在盗链主机浏览器访问
http://www.simoncwh.com,此时不会显示 game.jpg,而是显示 error.png(或返回403页面),说明防盗链配置生效。
8.4 完整流程(理解原理)
- 用户访问盗链主机的
www.simoncwh.com,浏览器获取到首页的 HTML 内容,发现需要加载http://www.yjs.com/game.jpg; - 浏览器向源主机
192.168.10.110发送请求,请求头中携带 Referer(来源):http://www.simoncwh.com; - 源主机 Nginx 检测到请求是图片资源,触发防盗链规则;
- 检查 Referer 是否在可信列表(
*.yjs.com yjs.com)中,发现不在,执行rewrite跳转; - 浏览器收到跳转指令,加载源主机的 error.png,最终盗链页面显示错误图片,而非正常资源。
总结
Nginx 的优化和防盗链配置,核心是"提升性能"和"保障安全":
- 性能优化:通过调整进程数、开启缓存、压缩内容、合理超时设置,让服务器充分利用资源,响应更快、带宽更省;
- 安全防护:隐藏版本号、修改运行用户、配置防盗链,减少漏洞攻击和资源盗用风险。
实际部署时,建议先在测试环境验证配置,修改前备份原配置文件(比如 cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak),避免配置错误导致服务异常。根据自身业务场景(比如高并发、静态资源多、防盗需求高),灵活调整参数,让 Nginx 发挥最佳效果。