Nginx 安全防护与 HTTPS 部署实战

HTTPS 部署(核心配置)

HTTP 强制跳转 HTTPS

|---------------------------------------------------------------------------------------------------------------------------|
| nginx server { listen 80; server_name 你的域名; # 替换为实际域名(如example.com) return 301 https://hostrequest_uri; # 永久跳转,保留请求路径 } |

HTTPS 安全配置(可直接上生产)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| nginx server { listen 443 ssl http2; # 开启SSL和HTTP/2,提升性能 server_name 你的域名; # 证书路径(替换为自身证书实际路径) ssl_certificate /etc/nginx/ssl/fullchain.pem; # 完整证书链 ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 私钥文件 # 安全协议与加密套件(仅启用高安全协议,禁用不安全套件) ssl_protocols TLSv1.2 TLSv1.3; # 禁用TLSv1.0、TLSv1.1 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; # 优先使用服务器指定的加密套件 # 会话优化(减少SSL握手开销,提升访问速度) ssl_session_cache shared:SSL:10m; # 共享会话缓存,大小10M ssl_session_timeout 1d; # 会话超时时间1天 # HSTS 强制HTTPS(防止降级攻击,浏览器自动跳转HTTPS) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 有效期1年,包含子域名 # 安全响应头(防御XSS、点击劫持等攻击) add_header X-Frame-Options DENY; # 禁止嵌入iframe,防点击劫持 add_header X-Content-Type-Options nosniff; # 禁止浏览器猜测文件类型 add_header X-XSS-Protection "1; mode=block"; # 开启XSS防护,发现攻击直接阻断 # 网站根目录与默认首页(替换为自身业务路径) root /var/www/html; index index.html; } |

Nginx 安全防护

隐藏 Nginx 版本号

|---------------------------------------------------------|
| nginx http { server_tokens off; # 关闭版本号显示,避免攻击者利用版本漏洞 } |

禁止访问隐藏文件

|----------------------------------------------------------------------------------------------------------------------|
| nginx location ~ /\. { # 匹配所有以.开头的隐藏文件(如.git、.env、.htaccess) deny all; # 禁止所有访问 access_log off; # 不记录访问日志,减少日志冗余 } |

上传目录禁止执行脚本

|----------------------------------------------------------------------------------------------------------------|
| nginx location /upload/ { # 匹配上传目录(替换为自身上传目录路径) location ~ \.php$ { deny all; } # 禁止在上传目录执行PHP脚本,可扩展其他脚本后缀 } |

防CC攻击------请求频率限制

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| nginx # 1. http块内定义请求限制规则 limit_req_zone binary_remote_addr zone=one:10m rate=10r/s; # binary_remote_addr:以客户端IP为标识;zone=one:10m:缓存区大小10M;rate=10r/s:每秒最多10个请求 # 2. server块内调用规则 limit_req zone=one burst=20 nodelay; # burst=20:允许突发20个请求;nodelay:突发请求不延迟,直接处理(避免队列等待) |

屏蔽恶意UA、扫描工具

|--------------------------------------------------------------------------------------------------------------------------------|
| nginx if ($http_user_agent ~* (sqlmap|nikto|python|scrapy|java|wget)) { # 匹配常见恶意UA(可根据实际情况增减) return 403; # 返回403禁止访问 } |

屏蔽敏感路径

|-------------------------------------------------------------------------------------------------------------|
| nginx location ~* (phpinfo|info\.php|test\.php) { # 匹配phpinfo、测试脚本等敏感路径(可根据业务补充) return 403; # 禁止访问 } |

SSL 证书检查脚本

脚本代码(check_ssl.sh)

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash #!/bin/bash # 检查是否传入域名参数 if $# -ne 1 ;then echo "用法: 0 域名" # 提示正确用法 exit 1 # 退出脚本 fi domain=1 # 接收传入的域名参数 # 输出证书起止时间 echo "===== domain SSL 证书信息 =====" echo \| openssl s_client -servername domain -connect domain:443 2\>/dev/null \| openssl x509 -noout -dates # 计算证书剩余有效天数 not_after=(echo | openssl s_client -servername domain -connect domain:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2) expire=(date -d "not_after" +%s) # 转换过期时间为时间戳 now=(date +%s) # 获取当前时间戳 left=(( (expire - now) / 86400 )) # 计算剩余天数(86400秒=1天) echo "证书剩余有效天数:$left 天" # 输出剩余天数 |

脚本使用方法

|---------------------------------------------------------------------------------------------------------|
| bash chmod +x check_ssl.sh # 赋予脚本执行权限 ./check_ssl.sh 你的域名 # 执行脚本,替换为实际域名(如./check_ssl.sh www.baidu.com) |

部署与验证

  1. 检查Nginx配置是否正确(避免配置错误导致服务无法启动)
    nginx -t
  1. 重启Nginx服务(使配置生效)
    systemctl restart nginx
  1. SSL安全评级测试(验证HTTPS安全等级,目标A+)
    访问链接:https://www.ssllabs.com/ssltest/,输入域名即可测试
相关推荐
无响应de神20 分钟前
三、用户与权限管理
数据库·mysql
网络研究院18 小时前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智18 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
麦聪聊数据18 小时前
数据服务化时代:企业数据能力输出的核心路径
数据库
treesforest18 小时前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_18 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡18 小时前
【MySQL数据库】数据类型与表约束
数据库·mysql
2601_9618451518 小时前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
程序猿阿伟19 小时前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome
曹牧19 小时前
Oracle EXPLAIN PLAN
数据库·oracle