Nginx 优化与防盗链全解析:从性能调优到资源保护
Nginx 优化与防盗链全解析:从性能调优到资源保护
文章目录
- Nginx 优化与防盗链全解析:从性能调优到资源保护
- 一、基础安全优化:隐藏版本号
- 1.1 查看当前版本号
- 1.2 两种隐藏/修改方案
- 方案一:修改配置文件(快速隐藏)
- 方案二:修改源码(深度伪装)
- 二、权限优化:修改运行用户与组
- 2.1 操作步骤
- 三、性能优化:缓存时间设置
- 3.1 配置缓存规则
- 3.2 验证缓存效果
- 四、日志管理:日志切割
- 4.1 编写日志切割脚本
- 4.2 配置定时执行
- 五、连接优化:超时参数配置
- 5.1 核心超时参数说明
- 5.2 配置超时参数
- 六、并发优化:调整进程数与CPU亲和性
- 6.1 查看CPU核数
- 6.2 配置进程数与CPU亲和性
- 6.3 调整系统文件描述符限制
- 七、传输优化:配置网页压缩
- 7.1 配置压缩参数
- 7.2 验证压缩效果
- 八、资源保护:配置防盗链
- 8.1 防盗链核心原理
- 8.2 配置防盗链规则
- 参数说明:
- 8.3 实操验证(两台服务器对比)
- 1. 源服务器配置
- 2. 盗链服务器配置
Nginx 作为高性能的 HTTP 和反向代理服务器,在实际生产环境中需要通过 性能优化提升并发处理能力、降低资源消耗,同时通过 防盗链配置保护服务器上的静态资源(如图片、视频、文档等)不被非法站点盗用。本文将详细拆解 Nginx 的核心优化手段与防盗链配置方案,并附完整实操代码。
一、基础安全优化:隐藏版本号
Nginx 默认会在响应头中暴露服务器版本号(如 Server: nginx/1.24.0
),攻击者可能利用特定版本的漏洞发起攻击。隐藏或修改版本号可降低被针对性攻击的风险。
1.1 查看当前版本号
通过 curl
命令查看响应头中的版本信息:
curl -I http://192.168.10.23 # 替换为你的Nginx服务器IP
响应中会包含类似 Server: nginx/1.12.0
的字段,即当前版本号。
1.2 两种隐藏/修改方案
方案一:修改配置文件(快速隐藏)
通过 server_tokens
指令关闭版本号显示,无需重新编译,适合快速部署:
vim /usr/local/nginx/conf/nginx.conf # 编辑主配置文件
在 http
块中添加 server_tokens off;
:
http {include mime.types;default_type application/octet-stream;server_tokens off; # 关闭版本号显示# 其他配置...
}
重启 Nginx 使配置生效:
systemctl restart nginx # 若使用systemd管理;若无则用 /usr/local/nginx/sbin/nginx -s reload
再次执行 curl -I
命令,响应头中 Server: nginx
将不再显示版本号。
方案二:修改源码(深度伪装)
若需伪装成其他服务器(如 IIS、Apache),需修改 Nginx 源码后重新编译,适合对安全要求极高的场景:
-
修改源码定义:
vim /opt/nginx-1.12.0/src/core/nginx.h # 替换为你的源码路径
修改版本号和服务器类型:
#define NGINX_VERSION "1.1.1" // 自定义版本号 #define NGINX_VER "IIS/" NGINX_VERSION // 伪装成IIS服务器
-
重新编译安装:
cd /opt/nginx-1.12.0/ # 进入源码目录 # 重新配置编译参数(保持与原安装一致) ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module make && make install # 编译并安装
-
开启版本显示验证:
编辑配置文件,确保server_tokens on;
(默认开启):http {server_tokens on; # 开启后显示伪装的版本和类型 }
重启 Nginx 后,
curl -I
响应头将显示Server: IIS/1.1.1
,实现深度伪装。
二、权限优化:修改运行用户与组
Nginx 默认以 root
用户启动(主进程),子进程也继承 root
权限,若服务器被入侵,攻击者可能获得高权限。建议创建低权限用户运行 Nginx 子进程。
2.1 操作步骤
-
创建nginx用户组(若未创建):
useradd -r -M -s /sbin/nologin nginx # 创建系统用户,无登录权限
-
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
在配置文件顶部指定运行用户和组:
user nginx nginx; # user 用户名 组名;(默认注释,取消注释并修改) worker_processes 1; # 进程数,后续会优化 # 其他配置...
-
重启验证:
systemctl restart nginx ps aux | grep nginx # 查看进程权限
输出中主进程(
master process
)为root
,子进程(worker process
)为nginx
,符合权限最小化原则。
三、性能优化:缓存时间设置
对于静态资源(图片、CSS、JS 等),设置浏览器缓存可减少重复请求,降低服务器带宽消耗,提升用户访问速度。动态资源(如 PHP 生成的页面)不建议设置缓存。
3.1 配置缓存规则
编辑 Nginx 配置文件,在 server
块中添加静态资源缓存规则:
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.kgc.com; # 替换为你的域名location / {root html;index index.html index.htm;}# 对图片类型设置1天缓存location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {root html;expires 1d; # 缓存时间:1d(天)、1h(小时)、30m(分钟)}# 对CSS、JS设置12小时缓存location ~ \.(css|js)$ {root html;expires 12h;}
}
3.2 验证缓存效果
-
重启 Nginx:
systemctl restart nginx
-
浏览器验证:
- 访问
http://www.kgc.com/game.jpg
(替换为你的静态资源)。 - 打开浏览器「开发者工具」→「网络」→ 选中资源,查看「响应头」,若包含
Cache-Control: max-age=86400
(86400秒=1天),说明缓存配置生效。
- 访问
四、日志管理:日志切割
Nginx 日志默认写入单个文件(access.log
、error.log
),长期运行会导致日志文件过大,难以查看和分析。通过日志切割定期归档旧日志,删除过期日志,可优化磁盘空间占用。
4.1 编写日志切割脚本
创建 fenge.sh
脚本,实现日志归档、重建和清理:
vim /opt/fenge.sh
#!/bin/bash
# 日志切割脚本
# 1. 定义变量
day=$(date -d "-1 day" "+%Y%m%d") # 前一天的日期(如20241001)
logs_path="/var/log/nginx" # 日志归档目录
pid_path="/usr/local/nginx/logs/nginx.pid" # Nginx主进程PID文件# 2. 若归档目录不存在则创建
[ -d $logs_path ] || mkdir -p $logs_path# 3. 移动旧日志到归档目录并命名
mv /usr/local/nginx/logs/access.log ${logs_path}/kgc-access-${day}.log
mv /usr/local/nginx/logs/error.log ${logs_path}/kgc-error-${day}.log# 4. 向Nginx发送USR1信号,重建新日志文件
kill -USR1 $(cat $pid_path)# 5. 删除30天前的旧日志,释放磁盘空间
find $logs_path -name "kgc-*.log" -mtime +30 -exec rm -rf {} \;
4.2 配置定时执行
-
添加执行权限:
chmod +x /opt/fenge.sh
-
测试脚本:
/opt/fenge.sh ls /var/log/nginx # 查看是否生成归档日志
-
设置crontab定时任务:
每天凌晨1点自动执行脚本:crontab -e
添加以下内容:
0 1 * * * /opt/fenge.sh # 分 时 日 月 周 脚本路径
五、连接优化:超时参数配置
HTTP 的 Keep-Alive
模式可复用 TCP 连接,减少握手开销,但连接长时间闲置会占用服务器资源。合理设置超时参数可平衡性能与资源消耗。
5.1 核心超时参数说明
参数 | 作用 | 建议值 |
---|---|---|
keepalive_timeout | 保持连接的超时时间,超时后服务器关闭连接 | 65s |
client_header_timeout | 等待客户端发送请求头的超时时间,超时返回408错误 | 80s |
client_body_timeout | 等待客户端发送请求体的超时时间,超时返回408错误 | 80s |
send_timeout | 服务器向客户端发送响应的超时时间,超时后关闭连接 | 60s |
5.2 配置超时参数
编辑 Nginx 配置文件,在 http
块中添加超时设置:
vim /usr/local/nginx/conf/nginx.conf
http {include mime.types;default_type application/octet-stream;# 连接超时配置keepalive_timeout 65 180; # 第一个值:连接超时;第二个值:响应头中Keep-Alive: timeout=180client_header_timeout 80;client_body_timeout 80;send_timeout 60;# 其他配置...
}
重启 Nginx 使配置生效。
六、并发优化:调整进程数与CPU亲和性
Nginx 采用「主进程+多子进程」模型,子进程(worker_processes
)负责处理客户端请求。合理设置子进程数与 CPU 亲和性,可充分利用多核 CPU 资源,提升并发处理能力。
6.1 查看CPU核数
cat /proc/cpuinfo | grep -c "physical id" # 查看物理CPU数
cat /proc/cpuinfo | grep -c "core id" # 查看总核心数(推荐以此为参考)
6.2 配置进程数与CPU亲和性
编辑配置文件,在 user
指令后修改进程相关设置:
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 2; # 子进程数,建议设置为CPU核心数或2倍(如4核设为4或8)# CPU亲和性:绑定子进程到指定CPU核心(避免进程切换开销)
# 2核CPU:01(第一个核心)、10(第二个核心)
# 4核CPU:0001、0010、0100、1000
worker_cpu_affinity 01 10;# 每个子进程的最大连接数(需结合系统ulimit调整)
events {worker_connections 10240; # 默认1024,可提升至10240(需系统支持)
}
6.3 调整系统文件描述符限制
Nginx 处理连接需占用文件描述符,默认系统限制可能过低,需调整:
-
临时调整:
ulimit -n 65535 # 临时设置最大文件描述符为65535
-
永久调整:
vim /etc/security/limits.conf
添加以下内容:
* soft nofile 65535 * hard nofile 65535 nginx soft nofile 65535 nginx hard nofile 65535
重启系统后生效。
七、传输优化:配置网页压缩
Nginx 的 ngx_http_gzip_module
模块可对响应内容(HTML、CSS、JS、图片等)进行 Gzip 压缩,减少传输数据量,提升加载速度。该模块默认已安装。
7.1 配置压缩参数
编辑 Nginx 配置文件,在 http
块中添加压缩设置:
vim /usr/local/nginx/conf/nginx.conf
http {# 开启Gzip压缩gzip on;# 最小压缩文件大小(小于1k不压缩,避免小文件压缩开销大于收益)gzip_min_length 1k;# 压缩缓冲区(4个64k缓冲区)gzip_buffers 4 64k;# 支持的HTTP版本(1.1兼容性更好)gzip_http_version 1.1;# 压缩级别(1-9,级别越高压缩率越高但CPU消耗越大,推荐6)gzip_comp_level 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/json;
}
7.2 验证压缩效果
-
重启 Nginx:
systemctl restart nginx
-
浏览器验证:
- 访问
http://www.kgc.com
,打开「开发者工具」→「网络」→ 选中资源,查看「响应头」。 - 若包含
Content-Encoding: gzip
,说明压缩生效。
- 访问
八、资源保护:配置防盗链
防盗链通过验证 Referer
字段(表示请求来源),禁止非法站点盗用服务器上的静态资源(如图片、视频),避免带宽被滥用。
8.1 防盗链核心原理
Referer
字段记录了请求的来源域名,Nginx 通过 valid_referers
指令定义「信任的来源」,若来源不在信任列表中,则执行重定向或返回403错误。
8.2 配置防盗链规则
编辑 Nginx 配置文件,在 server
块中添加防盗链规则:
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.kgc.com;# 对图片、视频等资源设置防盗链location ~* \.(jpg|jpeg|png|gif|swf|mp4|flv)$ {root html;# 定义信任的来源(允许这些来源访问资源)valid_referers none blocked *.kgc.com kgc.com;# 若来源非法($invalid_referer为true)if ($invalid_referer) {# 方案1:重定向到自定义错误图片rewrite ^/ http://www.kgc.com/error.png;# 方案2:直接返回403禁止访问# return 403;}}# 其他配置...
}
参数说明:
~* \.(jpg|...)$
:不区分大小写匹配指定格式的资源;valid_referers
:信任的来源列表:none
:允许直接在浏览器地址栏输入资源URL(无Referer);blocked
:允许Referer为空或被浏览器隐藏的请求;*.kgc.com
:允许所有子域名(如blog.kgc.com
);kgc.com
:允许主域名;
$invalid_referer
:内置变量,若来源不在信任列表则为true
。
8.3 实操验证(两台服务器对比)
假设存在两台服务器:
- 源服务器:192.168.10.23(
www.kgc.com
,存放合法资源game.jpg
和错误图片error.png
); - 盗链服务器:192.168.10.80(
www.benet.com
,试图盗用game.jpg
)。
1. 源服务器配置
- 准备资源:将
game.jpg
、error.png
放入/usr/local/nginx/html
; - 配置 hosts(本地解析):
echo "192.168.10.23 www.kgc.com" >> /etc/hosts
- 重启 Nginx。
2. 盗链服务器配置
- 编辑盗链页面:
vim /usr/local/nginx/html/index.html
<html> <body><h1>盗链测试</h1>