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 发挥最佳效果。

相关推荐
热爱学习的小怪兽2 小时前
Docker容器的一些总结
运维·docker·容器
原神启动12 小时前
云计算大数据——Nginx 实战系列(性能优化与防盗链配置)
大数据·nginx·云计算
要站在顶端2 小时前
基于 curl 实现 Jenkins 上传制品到 JFrog Artifactory
运维·ci/cd·jenkins
杨德杰2 小时前
Ubuntu设置VNC远程桌面
linux·运维·ubuntu
toooooop82 小时前
CentOS 7 系统上安装 **Nginx + MySQL 5.7 + PHP 7.3 + Redis** 的完整步骤
redis·mysql·nginx·centos·php7
写代码的学渣3 小时前
Ubuntu/麒麟默认锁定root账户
linux·运维·ubuntu
虎子_layor4 小时前
单机压测从百到三千:一次短链跳转服务的全链路性能优化实战
后端·性能优化
刚哥的进化路5 小时前
Linux系统日志管理完全教程:从基础查看 to 集中分析(附实战命令)
运维·自动化运维
互联网小顽童5 小时前
Linux系统进阶管理教程:从基础操作到企业级运维(附实战命令)
运维·自动化运维