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/,输入域名即可测试
相关推荐
我真会写代码1 小时前
从底层到实战:MySQL核心原理拆解,解锁数据库高性能密码
数据库·mysql
神的孩子都在歌唱1 小时前
无线网络基础:802.11协议、信道干扰与加密方式
网络
LF3_2 小时前
监听数据库binlog日志变化,将变动实时发送到kafka
数据库·分布式·mysql·kafka·binlog·debezium
我真会写代码2 小时前
从入门到精通:Redis实战指南,解锁高性能缓存核心能力
数据库·redis·缓存
杰杰7982 小时前
一文掌握Django模型——认识模型
数据库·python·django
乾元2 小时前
未来展望: 当 AGI(通用人工智能)出现,网络安全是否会消失?
网络·人工智能·安全·机器学习·网络安全·架构·安全架构
add45a2 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
江不清丶2 小时前
事务隔离级别深度解析:从理论到MySQL实现
数据库·mysql
骇客野人2 小时前
向量数据库Milvus的安装使用
数据库·milvus