Nginx 性能优化与防盗链配置

前言

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:

  1. 编辑 Nginx 主配置文件:
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
  1. http 块中添加以下配置(关闭版本号显示):
nginx 复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;  # 关键配置:关闭版本号
    ...  # 其他原有配置保留
}
  1. 重启 Nginx 使配置生效:
bash 复制代码
systemctl restart nginx
  1. 验证效果:再次执行 curl -I http://192.168.10.123,会发现响应头中只有 "Server: nginx",版本号已隐藏。

1.3 方法二:修改源码并重编译

如果想自定义服务器类型(比如伪装成 IIS),可以修改源码后重新编译:

  1. 编辑 Nginx 源码文件:
bash 复制代码
vim /opt/nginx-1.20.2/src/core/nginx.h  # 替换为你的源码路径
  1. 修改版本号和服务器类型定义:
c 复制代码
#define NGINX_VERSION "1.1.1"  # 自定义版本号
#define NGINX_VER "IIS" NGINX_VERSION  # 自定义服务器类型(比如改成IIS)
  1. 重新配置并编译 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  # 编译
  1. 替换旧的 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  # 替换为新编译文件
  1. 编辑配置文件开启版本显示(验证效果):
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
http {
    server_tokens on;  # 开启版本显示
    ...
}
  1. 重启服务并验证:
bash 复制代码
systemctl start nginx
curl -I http://192.168.10.123  # 会显示 Server: IIS/1.1.1

二、修改用户与组

默认情况下,Nginx 可能以 root 用户运行,存在安全风险。遵循"最小权限原则",将运行用户改为非 root 的 nginx 用户,能降低被攻击后的影响范围。

2.1 配置用户与组

  1. 编辑 Nginx 主配置文件:
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
  1. 找到并修改 user 指令(取消注释,设置为 nginx 用户和组):
nginx 复制代码
user nginx nginx;  # 格式:用户 组
  1. 重启 Nginx 服务:
bash 复制代码
systemctl restart nginx
  1. 验证配置效果:
bash 复制代码
ps aux | grep nginx

执行后会看到,Nginx 主进程由 root 创建,而处理请求的子进程由 nginx 用户运行,说明配置生效。

三、缓存时间设置

对于图片、CSS、JS 等静态资源,设置浏览器缓存时间后,用户再次访问时会直接从本地缓存加载,无需重新向服务器请求,既能加快页面加载速度,又能减少服务器带宽消耗。

3.1 配置缓存时间

  1. 编辑 Nginx 主配置文件:
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
  1. server 块中添加 location 配置,匹配静态资源类型:
nginx 复制代码
server {
    ...  # 原有配置(如监听端口、根目录等)
    
    # 匹配图片、图标等静态资源
    location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
        root html;  # 资源存放目录(与主配置一致即可)
        expires 1d;  # 缓存时间:1天(可改为7d=7天、30d=30天等)
    }
}
  1. 重启 Nginx 服务:
bash 复制代码
systemctl restart nginx
  1. 验证缓存效果:
  • 把一张图片(比如 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 日志切割脚本

  1. 创建日志切割脚本:
bash 复制代码
vim /opt/fenge.sh  # 脚本存放路径,可自定义
  1. 写入以下脚本内容(每行都有注释,易懂):
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天前的旧日志
  1. 给脚本添加执行权限:
bash 复制代码
chmod +x /opt/fenge.sh
  1. 测试脚本是否生效:
bash 复制代码
/opt/fenge.sh  # 执行脚本
ls /var/log/nginx  # 查看是否生成前一天的日志文件
ls /usr/local/nginx/logs/access.log  # 查看是否重建了新日志
  1. 设置定时任务(每天自动执行):
bash 复制代码
crontab -e  # 编辑定时任务
  1. 加入以下内容(每天凌晨1点执行切割):
bash 复制代码
0 1 * * * /opt/fenge.sh

保存退出即可,系统会每天自动执行脚本,无需手动操作。

五、连接超时设置

HTTP 的 KeepAlive 模式会让 TCP 连接在处理完请求后保持打开状态,方便同一客户端再次请求时复用连接。但连接长时间闲置会占用服务器资源,设置合理的超时时间,能释放闲置资源,防止恶意占用。

5.1 配置连接超时参数

  1. 编辑 Nginx 主配置文件:
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
  1. http 块中添加以下超时参数:
nginx 复制代码
http {
    ...  # 原有配置
    
    keepalive_timeout 65 180;  # 核心参数:连接超时时间
    client_header_timeout 80;  # 客户端发送请求头的超时时间
    client_body_timeout 80;    # 客户端发送请求体的超时时间
}
  1. 参数说明(通俗易懂版):
  • keepalive_timeout 65 180:第一个值 65 秒是服务器关闭闲置连接的时间(默认65秒,浏览器一般只保持60秒,可改为60秒);第二个值 180 秒是告诉浏览器主动关闭连接的时间,减少服务器关闭压力;
  • client_header_timeout 80:如果客户端80秒内没发送完整的请求头,服务器返回 408 超时错误;
  • client_body_timeout 80:如果客户端80秒内没发送请求体(比如上传文件时卡住),服务器返回 408 超时错误。
  1. 重启 Nginx 服务:
bash 复制代码
systemctl restart nginx

六、更改进程数

Nginx 采用"主进程+工作进程"模型,工作进程直接处理客户端请求。默认工作进程数较少,高并发场景下会出现阻塞,调整工作进程数能充分利用 CPU 资源,提升并发处理能力。

6.1 优化进程数与 CPU 亲和性

  1. 查看服务器 CPU 核数:
bash 复制代码
cat /proc/cpuinfo | grep "processor" | sort -u | wc -l

执行后会输出 CPU 逻辑核数(比如 2 核、4 核)。

  1. 编辑 Nginx 主配置文件:
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
  1. 修改工作进程数和 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
  1. 参数说明:
  • worker_processes auto:Nginx 会自动检测 CPU 核数,分配对应的工作进程数,无需手动计算,适合大多数场景;
  • worker_cpu_affinity:绑定进程到指定 CPU 核心,减少进程切换带来的性能损耗,高并发场景建议配置。
  1. 重启 Nginx 服务:
bash 复制代码
systemctl restart nginx
  1. 验证进程数:
bash 复制代码
ps aux | grep nginx

执行后会看到,工作进程数与 CPU 核数一致(或与配置的数值一致),说明配置生效。

七、配置网页压缩

Nginx 自带的 Gzip 压缩模块,能在发送数据给客户端前,压缩 HTML、CSS、JS、图片等内容,减少数据传输量,节省带宽,同时加快页面加载速度(尤其是在网络较差的环境下)。

7.1 启用 Gzip 压缩

  1. 编辑 Nginx 主配置文件:
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
  1. 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;
}
  1. 准备测试资源:
  • 把一张图片(比如 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>
  1. 重启 Nginx 服务:
bash 复制代码
systemctl restart nginx
  1. 验证压缩效果:
  • 浏览器访问 http://192.168.10.123
  • 按下 F12 打开开发者工具,切换到「网络」选项卡;
  • 双击首页或图片的请求,在响应头中找到 Content-Encoding: gzip,说明压缩生效。

八、配置防盗链

防盗链是防止其他网站直接引用你的服务器资源(比如图片、视频),避免带宽被非法占用,同时保护版权内容。核心原理是通过检测请求的来源(Referer),只允许可信域名访问资源。

8.1 防盗链配置示例

  1. 编辑 Nginx 主配置文件:
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
  1. 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;
        }
    }
}
  1. 参数说明(通俗版):
  • ~* \.(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
源主机配置:
  1. 把资源文件(game.jpg 正常图片、error.png 错误图片)放到 /usr/local/nginx/html 目录;
  2. 编辑首页文件:
bash 复制代码
vim /usr/local/nginx/html/index.html

写入内容:

html 复制代码
<html>
<body>
<img src="game.jpg"/>  <!-- 引用正常图片 -->
</body>
</html>
  1. 配置 hosts 文件(让服务器识别域名):
bash 复制代码
echo "192.168.10.110 www.yjs.com" >> /etc/hosts
echo "192.168.10.123 www.simoncwh.com" >> /etc/hosts
盗链主机配置:
  1. 编辑首页文件,引用源主机的图片:
bash 复制代码
vim /usr/local/nginx/html/index.html

写入内容:

html 复制代码
<html>
<body>
<!-- 非法引用源主机的 game.jpg -->
<img src="http://www.yjs.com/game.jpg"/>
</body>
</html>
  1. 配置 hosts 文件:
bash 复制代码
echo "192.168.10.110 www.yjs.com" >> /etc/hosts
echo "192.168.10.123 www.simoncwh.com" >> /etc/hosts

8.3 防盗链验证

  1. 正常访问测试:在任意服务器浏览器访问 http://www.yjs.com,能看到 game.jpg 正常图片,说明源主机配置正常;
  2. 盗链访问测试:在盗链主机浏览器访问 http://www.simoncwh.com,此时不会显示 game.jpg,而是显示 error.png(或返回403页面),说明防盗链配置生效。

8.4 完整流程(理解原理)

  1. 用户访问盗链主机的 www.simoncwh.com,浏览器获取到首页的 HTML 内容,发现需要加载 http://www.yjs.com/game.jpg
  2. 浏览器向源主机 192.168.10.110 发送请求,请求头中携带 Referer(来源):http://www.simoncwh.com
  3. 源主机 Nginx 检测到请求是图片资源,触发防盗链规则;
  4. 检查 Referer 是否在可信列表(*.yjs.com yjs.com)中,发现不在,执行 rewrite 跳转;
  5. 浏览器收到跳转指令,加载源主机的 error.png,最终盗链页面显示错误图片,而非正常资源。

总结

Nginx 的优化和防盗链配置,核心是"提升性能"和"保障安全":

  • 性能优化:通过调整进程数、开启缓存、压缩内容、合理超时设置,让服务器充分利用资源,响应更快、带宽更省;
  • 安全防护:隐藏版本号、修改运行用户、配置防盗链,减少漏洞攻击和资源盗用风险。

实际部署时,建议先在测试环境验证配置,修改前备份原配置文件(比如 cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak),避免配置错误导致服务异常。根据自身业务场景(比如高并发、静态资源多、防盗需求高),灵活调整参数,让 Nginx 发挥最佳效果。

相关推荐
草莓熊Lotso41 分钟前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
历程里程碑44 分钟前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
七夜zippoe9 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64810 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满10 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠11 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90311 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技12 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀12 小时前
Linux环境变量
linux·运维·服务器
zzzsde12 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器