用户在反向代理(如 Nginx)后配置 SSL证书,主要有两种主流的实现路径:一种是使用可视化管理工具(如 Nginx Proxy Manager),它通过 Web 界面将证书申请与代理配置高度自动化,非常适合希望快速上手、简化运维的场景;另一种是直接配置原生 Nginx,它提供了最大的灵活性和可定制性,适合对 Nginx 配置熟悉或有复杂需求的高级用户。
用户可以根据自己的技术偏好和管理需求,从以下两种方案中选择一种进行实施。
方案一:使用 Nginx Proxy Manager (NPM) 可视化配置
这种方式的核心价值在于将复杂的命令行操作转化为直观的图形界面操作,并深度集成了 Let's Encrypt,实现了 SSL 证书的自动申请和续期,极大地降低了配置门槛。
1. 安装部署
NPM 官方推荐使用 Docker Compose 进行安装,既简单又便于迁移。
创建安装目录和 `docker-compose.yml` 文件:
bash
mkdir -p ~/nginx-proxy-manager
cd ~/nginx-proxy-manager
vi docker-compose.yml
写入以下内容:
yaml
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
'80:80' # 公开的HTTP端口
'443:443' # 公开的HTTPS端口
'81:81' # 管理面板的Web端口
volumes:
./data:/data # 持久化Nginx配置和数据
./letsencrypt:/etc/letsencrypt # 持久化SSL证书
启动容器:
bash
docker-compose up -d
2. 初始登录
容器启动后,在浏览器中访问 `http://你的服务器IP:81` 打开管理界面。
默认登录凭证:
电子邮件:`admin@example.com`
密码:`changeme`
首次登录后,系统会**强制要求修改默认的电子邮件和密码**,请务必牢记新的登录信息。
3. 申请与配置SSL证书
NPM 可以让你在添加代理服务的同时,一键申请和配置 SSL 证书。
添加代理主机:登录后,点击导航栏中的 `Proxy Hosts` -> `Add Proxy Host`。
填写代理信息:
Domain Names:输入你想要绑定的域名(如 `example.com`),请确保该域名已解析到当前服务器IP。
Scheme:通常选择 `http`(除非你的后端服务本身就是 HTTPS)。
Forward Hostname / IP**:填写你实际想要代理的后端服务地址(如 `192.168.1.10` 或 `localhost`)。
Forward Port:填写后端服务的端口号(如 `3000`)。
可根据需要开启 `Cache Assets`、`Block Common Exploits` 等功能。
申请SSL证书:
切换到 `SSL` 标签页。
勾选 `SSL Certificate` 下的 `Request a new SSL Certificate`。
选择 `Let's Encrypt`。
输入你的**电子邮件地址,并勾选同意条款。
建议开启 `Force SSL`,这将强制所有 HTTP 请求跳转到 HTTPS。
点击 `Save` 按钮。NPM 会自动向 Let's Encrypt 发起申请、完成 HTTP 验证并部署证书。
> 进阶技巧:如果你需要管理多个子域名,可以考虑**申请泛域名证书 (`*.example.com`)。这需要在 NPM 的 SSL 证书管理页面选择 `DNS Challenge` 验证方式,并配置你的 DNS 服务商(如 Cloudflare)的 API 令牌,从而完成通配符域名的验证。
方案二:直接配置原生 Nginx
如果你对服务器操作熟悉,或需要进行深度定制,可以直接在 Nginx 配置文件中完成所有设置。
1. 核心配置示例
以下是一个完整的 Nginx 站点配置文件示例(通常位于 `/etc/nginx/conf.d/example.com.conf` 或 `/etc/nginx/sites-available/example.com`),包含了从 HTTP 重定向到 HTTPS 的关键配置。
nginx
# 1. HTTP 服务器块:将所有访问重定向到 HTTPS
server {
listen 80;
server_name example.com www.example.com;
# 将所有HTTP请求永久重定向到HTTPS地址
return 301 https://$server_name$request_uri;
}
# 2. HTTPS 服务器块:核心的反向代理和SSL配置
server {
listen 443 ssl http2; # 监听443端口,启用SSL和HTTP/2协议
server_name example.com www.example.com;
# --- SSL证书配置 ---
# 证书文件路径 (证书文件通常包含完整的证书链)
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
# 私钥文件路径 (请确保私钥文件权限正确,如 chmod 600)
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
# --- 安全与性能增强 (可选但推荐) ---
# 启用会话缓存,提高SSL握手效率
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# 使用现代、安全的协议和加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# 开启OCSP Stapling,提高TLS握手速度和隐私性
ssl_stapling on;
ssl_stapling_verify on;
# --- 反向代理配置 ---
location / {
# 将请求转发到后端服务,这里是 http://localhost:3000
proxy_pass http://localhost:3000;
# 设置必要的代理请求头,以便后端服务获取真实的客户端信息
proxy_set_header Host $host; # 传递原始域名
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递完整的代理链IP
proxy_set_header X-Forwarded-Proto $scheme; # 传递客户端原始协议(http或https)
# 支持WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 其他优化配置
proxy_buffering off;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
}
}
2. 证书获取与管理
手动配置 Nginx 时,你需要自己管理 SSL 证书的获取和续期。
使用 Certbot 自动获取 Let's Encrypt 证书:这是最推荐的方式。Certbot 可以自动修改你的 Nginx 配置并启用 HTTPS。
bash
# 安装 Certbot 和 Nginx 插件
sudo apt update && sudo apt install certbot python3-certbot-nginx
# 运行 Certbot,它会自动为配置文件中的域名获取并配置证书
sudo certbot --nginx -d example.com -d www.example.com
Certbot 还会自动添加一个定时任务来处理证书的自动续期,你只需定期运行 `sudo certbot renew --dry-run` 来测试续期流程是否正常即可。
手动上传已有证书:如果你已有来自其他 CA 的证书文件,需要将证书文件(通常为 `.crt` 或 `.pem`)和私钥文件(`.key`)上传到服务器,并在上面的 `ssl_certificate` 和 `ssl_certificate_key` 指令中指定正确的路径。
关键配置要点(适用于两种方案)
无论你选择哪种方案,以下几个要点都至关重要,能确保代理配置的正确性和安全性:
1. 代理协议头部:务必正确设置 `proxy_set_header` 指令,特别是 `Host`、`X-Real-IP`、`X-Forwarded-For` 和 `X-Forwarded-Proto`。这些头部信息将客户端的真实信息传递给后端应用,是许多应用正确运行(如生成绝对链接、记录客户端IP)的基础。
2. 强制跳转 HTTPS:在 Nginx 配置中增加一个监听 80 端口的 server 块,将所有 HTTP 请求 301 重定向到 HTTPS 地址。这是保证网站安全最基本也是最重要的一步。在 NPM 中,直接勾选 "Force SSL" 即可。
3. 防火墙与SELinux:
确保服务器的防火墙(如 `firewalld` 或 `ufw`)已经放行了 80 (HTTP) 和 443 (HTTPS) 端口。
对于启用了 SELinux 的 Linux 系统(如 CentOS),Nginx 默认可能不允许代理连接到后端端口。你需要运行 `semanage port -a -t http_port_t -p tcp <你的后端端口号>` 来添加许可。
验证与建议
配置完成后,可以通过以下方式验证:
直接用浏览器访问你的 `https://` 域名,查看是否成功打开后端服务,且地址栏显示连接安全。
使用 `curl -I https://你的域名` 命令,检查返回的 HTTP 头部,确认 `HTTP/2 200` 和 `Strict-Transport-Security` 等安全头部是否存在。
访问 `http://` 开头的地址,确认其是否自动跳转到 `https://`。
建议:如果你是个人站长、小型团队,或者管理着多个容器化服务,Nginx Proxy Manager 带来的便利性非常值得尝试。如果你对 Nginx 配置了如指掌,或者需要实现一些非常规的、NPM 界面无法覆盖的复杂逻辑,那么直接配置原生 Nginx 将是你的不二之选。
用户目前的运行环境是怎样的?是 Docker 容器居多,还是传统的物理机/虚拟机部署?如果用户告诉我具体情况,我可以帮用户推荐最合适的方案。