前言
在本地开发或内网测试环境中,我们常常需要通过 https 访问服务。虽然公网环境常用 let's encrypt,但在本地测试中,使用 openssl 生成“自签名证书”是最快捷且免费的方案。
本文详细记录了在 linux 环境下,为 nginx 配置 https 的完整步骤,以及配置过程中遇到的 配置重复报错、重启失效 等真实问题的排查与解决思路。
一、 环境准备
在开始之前,请确保你的 nginx 编译了 ssl 模块。
# 检查是否安装 nginx -v # 检查是否包含 ssl 模块 nginx -v 2>&1 | grep -- '--with-http_ssl_module'
如果命令没有回显 --with-http_ssl_module,说明当前 nginx 不支持 ssl,需重新编译或通过包管理器安装带 ssl 的版本。
二、 生成免费的自签名证书
本地测试推荐直接用 openssl 生成,无需域名即可通过 ip 访问。
1. 创建证书存放目录
sudo mkdir -p /usr/local/nginx/conf/ssl
2. 生成私钥与证书(有效期10年)
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /usr/local/nginx/conf/ssl/server.key \
-out /usr/local/nginx/conf/ssl/server.crt执行后会提示输入地区信息,测试环境可直接连续按回车跳过,或在 common name 处填入你的服务器 ip。
3. 收紧文件权限
sudo chmod 600 /usr/local/nginx/conf/ssl/server.key sudo chmod 644 /usr/local/nginx/conf/ssl/server.crt
三、 nginx 配置详解
编辑 nginx 配置文件,以下是本次部署沉淀下来的测试环境通用模板。
server {
listen 443 ssl;
server_name localhost;
# 证书路径
ssl_certificate /usr/local/nginx/conf/ssl/server.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/server.key;
# 安全策略:只开启 tlsv1.2 和 v1.3
ssl_protocols tlsv1.2 tlsv1.3;
# 加密套件:只用高强度算法,禁用匿名和md5
ssl_ciphers high:!anull:!md5;
# 优先使用服务器端加密顺序
ssl_prefer_server_ciphers on;
# 性能优化:开启会话缓存(1mb约存4000个会话)
ssl_session_cache shared:ssl:10m;
ssl_session_timeout 10m;
# 反向代理或静态资源目录
location / {
root html/sz;
index index.html index.htm;
try_files $uri $uri/ /main.html;
}
}关键指令白话释义:
- ssl_protocols:只允许安全的协议,禁止已淘汰的 sslv2/3 和 tlsv1.0/1.1。
- ssl_ciphers:过滤掉弱加密算法,防止数据被破解。
- ssl_session_cache:缓存握手信息,避免客户端二次连接时重新握手,提升访问速度。
四、 踩坑记录与排查
在配置过程中,遇到了两个典型错误,供大家避坑。
坑点 :nginx 语法正确但 443 端口未监听
现象:
执行 nginx -t 返回成功,但 netstat -tlnp | grep 443 没有任何输出。
核心原因:
这是最容易踩的坑。在修改配置文件并添加 443 的 server 块后,执行 ./nginx -s reload 并不会让新监听的端口生效(特别是从不监听变为监听时)。
排查验证:
- 通过
./nginx -t 2>&1 | grep -a 20 "listen.*443"确认配置已加载。 - 但
ss -tlnp | grep nginx下依然只有 80 端口。
终极解法:
使用完全的停止+启动代替 reload。
# 1. 彻底停止服务 ./nginx -s stop # 2. 确认进程已消失 ps aux | grep nginx # 3. 重新启动 ./nginx # 4. 验证端口 netstat -tlnp | grep 443
五、 浏览器验证
因为是自签名证书,浏览器会提示“您的连接不是私密连接”或“不安全”。
- chrome/edge:点击“高级” -> “继续前往 (不安全)”。
- 终端测试:
curl -k https://你的服务器ip或localhost
- 只要能返回网页内容,说明 https 配置成功。
总结
本文梳理了 nginx 配置 https 的完整链路,特别指出了“新增端口必须重启而非重载”的隐蔽坑点。希望这份记录能帮助其他开发者在本地测试中少走弯路。
以上就是在linux环境下为nginx配置https的完整流程的详细内容,更多关于nginx配置https全攻略的资料请关注代码网其它相关文章!
发表评论