Nginx 安全防护与 HTTPS 部署实战

前言

在互联网高速发展的今天,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机制拦截。

实验环境
配置防盗链
复制代码
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 权重更高。


四、生产环境安全加固总结

  1. 最小权限:使用专用 nginx 用户,禁止 root 运行
  2. 隐藏信息:关闭版本号、隐藏服务器信息
  3. 请求限流:limit_req 防 CC,limit_conn 防并发过量
  4. 方法限制:只放行 GET/HEAD/POST
  5. 防盗链:保护静态资源,减少带宽浪费
  6. 动态黑名单:实时封禁恶意 IP
  7. 全站 HTTPS:开启 TLS1.2+,禁用不安全协议
  8. 定期更新:Nginx 保持最新版,修复 CVE 漏洞

五、结语

Nginx 安全防护不是一次性配置,而是持续优化的过程。本文覆盖的编译加固、版本隐藏、请求限流、防盗链、动态黑名单、HTTPS 部署,可直接应用于中小企业生产环境,大幅提升 Web 服务安全性。

相关推荐
Vallelonga2 小时前
认识 Linux 终端
linux
顶点多余2 小时前
进程控制详解
linux·运维·服务器
liuyao_xianhui2 小时前
优选算法_丢失的数字_位运算_C++
linux·数据结构·c++·算法·动态规划·哈希算法·散列表
CCPC不拿奖不改名2 小时前
RAG基础:评测系统RAGAS的四大指标
linux·服务器·人工智能·计算机视觉·前端框架·知识库搭建
阳光下的米雪2 小时前
存储过程的使用以及介绍
java·服务器·数据库·pgsql
NGC_66112 小时前
TCP可靠传输怎么实现的
服务器·网络·php
橘子132 小时前
ICMP协议
运维·服务器·网络
智能工业品检测-奇妙智能2 小时前
openclaw使用硅基流动免费模型
服务器·人工智能·spring boot·电商·openclaw
chalmers_152 小时前
封禁暴力破解SSH的攻击IP
linux·服务器·ssh