在 macOS 上用 Nginx 配置多个域名 HTTPS 服务,需为每个域名申请独立 Let’s Encrypt 证书(Certbot 支持多域名),Nginx 中为各域名设独立 server 块并正确引用 fullchain.pem 和 privkey.pem,再通过 launchd 定时续期并重载。
在 macOS 上用 Nginx 配置多个域名的 HTTPS 服务,核心是为每个域名准备独立的 SSL 证书,并在 Nginx 配置中正确指向对应的证书文件。系统自带的 OpenSSL 和 Homebrew 安装的 Nginx 足以支撑完整流程,无需额外编译或特殊权限。
使用 Certbot 自动申请多域名证书
Certbot 是最便捷的 Let’s Encrypt 证书获取工具,支持单次申请覆盖多个域名(包括子域名)。确保已安装 Homebrew 和 Certbot:
-
安装 Certbot:
brew install certbot -
申请证书(需提前将所有域名解析到本机 IP,并确保 80 端口可访问):
sudo certbot certonly --standalone -d example.com -d www.example.com -d api.example.com
执行后证书会保存在/etc/letsencrypt/live/example.com/下,含fullchain.pem和privkey.pem - 如需为不同主域名(如
site-a.com和site-b.net)分别申请,需运行两次命令,各自指定对应域名
Nginx 配置多个 server 块并绑定对应证书
每个域名应有独立的 server 块,监听 443 端口,且 server_name 与证书域名严格匹配(通配符证书除外)。示例配置片段:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /usr/local/var/www/example;
index index.html;
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
server {
listen 443 ssl http2;
server_name site-b.net;
ssl_certificate /etc/letsencrypt/live/site-b.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-b.net/privkey.pem;
root /usr/local/var/www/site-b;
}
注意:ssl_certificate 必须指向包含完整证书链的 fullchain.pem,不能只用 cert.pem,否则部分客户端会提示证书不完整。
MonkeyCode
企业级AI开发平台,全新的AI编程体验,让你的研发团队效率Max
下载
自动续期与 Nginx 重载集成
Let’s Encrypt 证书有效期为 90 天,建议设置定时任务自动续期并平滑重载 Nginx:
- 创建续期脚本(如
/usr/local/bin/renew-nginx.sh):
#!/bin/zsh sudo certbot renew --quiet --no-self-upgrade sudo nginx -s reload
- 赋予执行权限:
chmod +x /usr/local/bin/renew-nginx.sh - 添加到 macOS 的 launchd 定时任务(每周二凌晨 2:15 运行):
创建~/Library/LaunchAgents/homebrew.certbot.renew.plist,内容包含StartCalendarInterval和程序路径
验证与调试常见问题
配置完成后务必验证语法并检查实际效果:
- 检查 Nginx 配置是否合法:
sudo nginx -t - 重启服务生效:
sudo nginx -s reload - 用浏览器访问各域名,点击地址栏锁图标确认证书信息是否匹配当前域名
- 若出现 NET::ERR_CERT_COMMON_NAME_INVALID,说明证书未覆盖该
server_name,需重新申请或检查域名拼写 - 若提示“证书不可信”,大概率是用了
cert.pem而非fullchain.pem,或证书链缺失中间 CA
整个过程不需要修改系统 keychain 或手动导入根证书,Nginx 本身只负责提供标准 PEM 格式证书链。只要域名解析正确、端口开放、路径无误,HTTPS 就能稳定运行。