Nginx安全防护与HTTPS部署实战

 更新时间:2026年04月09日 08:55:18   作者:枕布响丸辣  
文章介绍了Nginx安全加固与HTTPS部署,从编译安装、隐藏版本号、限制危险请求、请求限制、防盗链、动态黑名单、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机制拦截。

实验环境

  • 源站: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 权重更高。

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

  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 服务安全性。

以上就是Nginx安全防护与HTTPS部署实战的详细内容,更多关于Nginx安全防护与HTTPS部署的资料请关注脚本之家其它相关文章!

相关文章

  • nginx安装第三方模块的方法

    nginx安装第三方模块的方法

    这篇文章主要介绍了nginx安装第三方模块的方法,包含在未安装nginx的情况下安装nginx第三方模块和在已安装nginx情况下安装nginx第三方模块,需要的朋友可以参考下
    2014-06-06
  • Nginx服务LNMP之WordPress部署流程步骤

    Nginx服务LNMP之WordPress部署流程步骤

    这篇文章主要为大家介绍了Nginx服务LNMP之WordPress部署流程步骤,本实验意在部署过程,使用单机版部署,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-03-03
  • centos服务器中配置nginx的方法示例

    centos服务器中配置nginx的方法示例

    这篇文章主要介绍了centos服务器中配置nginx的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • nginx如何通过proxy_pass设置反向代理,隐藏端口号

    nginx如何通过proxy_pass设置反向代理,隐藏端口号

    这篇文章主要介绍了nginx如何通过proxy_pass设置反向代理,隐藏端口号方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Windows下Nginx的启动停止重启等命令操作过程

    Windows下Nginx的启动停止重启等命令操作过程

    最近在window 上安装了nginx ,对nginx 的操作不是很熟,故在此记录一下常用操作,本文详细介绍了Windows下Nginx的启动,停止,重启等命令,需要的朋友可以参考下
    2024-03-03
  • 详解nginx平滑升级的过程

    详解nginx平滑升级的过程

    这篇文章主要介绍了详解nginx平滑升级的过程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • nginx配置keepalive长连接的实现方法

    nginx配置keepalive长连接的实现方法

    长连接允许客户端在同一个TCP连接上发送多个请求,以减少连接握手的开销,提高网站性能,本文主要介绍了nginx配置keepalive长连接的实现方法,感兴趣的可以了解一下
    2023-08-08
  • linux下Nginx 0.8.40的安装方法

    linux下Nginx 0.8.40的安装方法

    这篇文章主要介绍了linux下Nginx 0.8.40的安装方法,需要的朋友可以参考下
    2014-11-11
  • nginx 目录密码保护的设置方法

    nginx 目录密码保护的设置方法

    比如要对 网站目录下的 test 文件夹 进行加密认证
    2010-12-12
  • Nginx实现404页面的配置方法的两种方法

    Nginx实现404页面的配置方法的两种方法

    在使用Nginx作为Web服务器时,配置404页面是一项基本需求,本文介绍了两种配置404页面的方法,这两种方法各有特点,可以根据实际需求选择适合的配置方式
    2024-09-09

最新评论