前言
在互联网高速发展的今天,Web 服务安全已成为企业与开发者必须重视的核心问题。Nginx 凭借轻量、高并发、模块化设计,占据全球近三分之一 Web 服务器市场。但 DDoS、CC 攻击、恶意爬虫、SQL 注入等威胁层出不穷,加之 GDPR、等保 2.0 等法规要求,掌握 Nginx 安全加固与 HTTPS 部署,已是运维与开发人员的必备技能。
一、Nginx 核心安全配置(生产必配)
1. 编译安装 Nginx(安全基础)
生产环境不推荐 yum 直接安装,编译安装可按需开启模块、关闭危险功能,安全性更高。
(1)安装依赖包
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)创建专用运行用户(最小权限原则)
禁止 nginx 使用 root 运行,降低入侵后风险:
useradd -M -s /sbin/nologin nginx
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
(3)编译配置(开启安全必备模块)
tar zxf nginx-1.26.3.tar.gz
cd nginx-1.26.3
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream
make && make install
(4)创建软链接、配置系统服务
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
新建 systemd 服务文件:
vi /lib/systemd/system/nginx.service
写入内容:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root
[Install]
WantedBy=multi-user.target
启动并设置开机自启:
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx
2. 隐藏 Nginx 版本号(防版本定向攻击)
攻击者可通过版本号查找对应 CVE 漏洞,生产环境必须隐藏。
查看版本号
curl -I 192.168.10.101
# 返回:Server: nginx/1.26.3
关闭版本显示
vi /usr/local/nginx/conf/nginx.conf
在http块中添加:
http {
server_tokens off;
}
重载配置:
nginx -t && nginx -s reload
再次验证:
curl -I 192.168.10.101
# 返回:Server: nginx(无版本号)
3. 限制危险 HTTP 请求方法
HTTP 中PUT/DELETE/CONNECT/TRACE等方法存在高危风险:
- PUT/DELETE:可上传 / 删除文件
- TRACE:易导致 XST 攻击
- CONNECT:可被用于代理滥用
只放行GET/HEAD/POST,其他直接返回 444 断开连接。
配置:
server {
...
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
}
测试:
curl -XPUT -I 192.168.10.101
# 返回 Empty reply from server
注意:TRACE/CONNECT 会被 Nginx 核心层直接拦截,返回 405/400,不会进入 if 判断。
4. 请求限制(CC 攻击防御核心)
CC 攻击通过海量请求耗尽服务器资源,Nginx 自带limit_req模块可精准限速。
配置请求速率限制
http {
# 定义限流区域:10M内存,按IP限速,10请求/秒
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location / {
root html;
index index.html;
# 突发队列20,不延迟直接处理
limit_req zone=req_limit burst=20 nodelay;
}
}
}
关键参数说明
limit_req_zone:定义共享内存,存储 IP 访问状态$binary_remote_addr:以客户端 IP 为维度限流rate=10r/s:每秒最多 10 个请求burst=20:缓冲队列,超出速率的请求排队nodelay:队列请求立即处理,否则会延迟返回
压力测试验证
安装 ab 工具:
dnf install httpd-tools -y
发起 300 请求,30 并发:
ab -n 300 -c 30 http://192.168.10.101/
查看日志:
tail -300 /usr/local/nginx/logs/access.log | grep -c 503
大量请求返回 503,限流生效。
5. 防盗链配置(保护静态资源)
盗链会消耗服务器带宽、侵犯版权,Nginx 可通过referer机制拦截。
实验环境
- 源站:www.aaa.com 192.168.10.101
- 盗链站:www.bbb.com 192.168.10.102
配置防盗链
location ~* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$ {
root html;
# 信任域名
valid_referers aaa.com *.aaa.com;
# 非法referer返回403
if ($invalid_referer) {
return 403;
}
}
配置后,盗链网站直接显示图片 403,防护生效。
二、Nginx 高级防护(进阶安全)
1. 动态黑名单(实时封禁恶意 IP)
静态allow/deny需要重启服务,动态黑名单可热加载,无需重启。
(1)创建黑名单文件
vi /usr/local/nginx/conf/blockips.conf
写入:
192.168.1.0/24 1;
192.168.10.102 1;
数字含义
- 0:允许
- 1:返回 403 封禁
- 2:返回 444 断开
- 3:返回 503
(2)主配置加载
http {
geo $block_ip {
default 0;
include /usr/local/nginx/conf/blockips.conf;
}
server {
if ($block_ip) {
return 403;
}
}
}
重载:
nginx -t && nginx -s reload
(3)自动封禁高频 IP 脚本
#!/bin/bash
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk '{if($1>100) print $2" 1;"}' > /usr/local/nginx/conf/blockips.conf
访问量超 100 的 IP 自动加入黑名单,配合定时任务使用。
三、Nginx HTTPS 部署(全站加密)
1. HTTPS 核心原理
HTTPS = HTTP + SSL/TLS,解决 HTTP 三大风险:
- 窃听风险:明文传输可被截取
- 篡改风险:数据被中间人修改
- 冒充风险:访问钓鱼网站
HTTPS 采用混合加密:
- 握手阶段:非对称加密(公钥 / 私钥)交换会话密钥
- 传输阶段:对称加密加密业务数据,效率更高
数字证书解决公钥信任问题,由 CA 机构签名,系统内置根证书信任。
2. 生成自签名证书(测试环境)
生产请使用 Let's Encrypt、DigiCert 等正规 CA 证书。
mkdir -p /etc/nginx/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx-selfsigned.key -out /etc/nginx/ssl/nginx-selfsigned.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost"
3. Nginx 配置 HTTPS
server {
listen 443 ssl;
server_name localhost;
# 证书路径
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
# 安全协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
location / {
root /usr/local/nginx/html;
index index.html;
}
}
# HTTP强制跳转HTTPS
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
重载配置:
nginx -t && nginx -s reload
4. 验证 HTTPS
访问https://服务器IP,浏览器提示证书不安全(自签名),测试环境可忽略。生产环境使用受信任证书后,浏览器显示安全锁,支持 HTTP/2,SEO 权重更高。
四、生产环境安全加固总结
- 最小权限:使用专用 nginx 用户,禁止 root 运行
- 隐藏信息:关闭版本号、隐藏服务器信息
- 请求限流:limit_req 防 CC,limit_conn 防并发过量
- 方法限制:只放行 GET/HEAD/POST
- 防盗链:保护静态资源,减少带宽浪费
- 动态黑名单:实时封禁恶意 IP
- 全站 HTTPS:开启 TLS1.2+,禁用不安全协议
- 定期更新:Nginx 保持最新版,修复 CVE 漏洞
五、结语
Nginx 安全防护不是一次性配置,而是持续优化的过程。本文覆盖的编译加固、版本隐藏、请求限流、防盗链、动态黑名单、HTTPS 部署,可直接应用于中小企业生产环境,大幅提升 Web 服务安全性。