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/,输入域名即可测试
相关推荐
敲上瘾16 分钟前
Redis持久化存储机制:从RDB到AOF再到混合持久化的配置与实践
linux·数据库·redis·缓存
2401_894915534 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
正儿八经的少年9 小时前
布隆过滤器(解决redis缓存穿透步骤之一)
数据库·redis·缓存
xrandzj9 小时前
MySQL8.0 从零通关核心操作手册(Ubuntu实战版)
数据库·mysql
我是乌鸦的空间9 小时前
什么是网络安全中的电子数据取证与响应?
网络·网络安全
我不会插花弄玉9 小时前
4.数据类型【由浅入深-MySQL】
数据库·mysql
跨境旺仔小拳头9 小时前
如何使用Crawl4AI进行网页爬虫?从0搭建教程与代理配置指南
网络·人工智能·爬虫·chatgpt·aigc
沫儿笙9 小时前
焊接机器人氩弧焊省气装置
网络·机器人
denggun123459 小时前
yield
前端·数据库·python
80s7779 小时前
什么是动态IP?静态IP和动态IP有什么区别?
网络·网络协议·tcp/ip