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/,输入域名即可测试
相关推荐
白露与泡影37 分钟前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存
灯琰11 小时前
STM32F4+W5500 移植与开发常见问题
网络
赵渝强老师2 小时前
【赵渝强老师】使用Oracle可传输的表空间迁移数据
数据库·oracle
IpdataCloud3 小时前
跨区服玩家延迟高怎么办?用IP离线库自动分配到最近服务器
数据库·tcp/ip·github·php·ip
qyr67893 小时前
全球新能源汽车电机驱动器市场深度调研报告
大数据·网络·人工智能·自动化·汽车
Hiyajo pray3 小时前
SDN 访问控制性能调优方法
服务器·网络·网络安全
初晴融雪-快雪时晴4 小时前
网络硬件全景梳理:从光纤到手机,一张网是如何连接的?
网络·智能手机·智能路由器
wuqingshun3141594 小时前
MYSQL默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
空中湖4 小时前
电池简史(五):极限之梦与终章——锂硫、锂空气、量子电池,以及你该知道的电池投资与生活指南
数据库·程序人生
huainingning5 小时前
交换机通过ftp下载文件或者传输文件到ftp服务器
运维·服务器·网络