多租户应用Nginx配置实现自定义域名绑定及SSL支持问题咨询
解决方案
仅配置A记录是否足够?
不够,存在两个核心问题:
- 当前Nginx配置的
server_name仅匹配.one.com后缀的域名,用户自定义域名无法命中该业务server块,会被Nginx分配到默认站点,导致访问异常 - 现有SSL证书仅覆盖one.com及其子域名,自定义域名走HTTPS访问时会触发证书不被信任的报错,无法正常建立加密连接
Nginx配置调整步骤
1. 调整server_name匹配规则
将两个server块中的server_name .one.com "";修改为server_name _;,匹配所有指向该服务器的域名:
# 80端口跳转配置 server { listen 80; listen [::]:80; server_name _; # 保留ACME验证路径不跳转,方便后续签发自定义域名证书 location /.well-known/acme-challenge/ { root /home/forge/one.com/public; } return 301 https://$host$request_uri; }
原有FORGE相关的配置注释可正常保留,不影响业务运行。
2. 配置自定义域名动态SSL证书
你可以选择适配自身业务规模的证书方案:
方案A:少量自定义域名场景(手动维护)
每个用户提交自定义域名并验证A记录生效后,手动用certbot签发免费SSL证书:
# 安装certbot apt install certbot -y # 签发证书,webroot路径和你业务站点根目录保持一致 certbot certonly --webroot -w /home/forge/one.com/public -d 【用户自定义域名】
然后在443端口的server块中,将固定的ssl_certificate配置替换为变量匹配 (需Nginx版本≥1.11.5):
首先在Nginx全局http块(通常在/etc/nginx/nginx.conf中)新增map规则:
map $ssl_server_name $cert_dir { default /etc/nginx/ssl/one.com/1233982; # 匹配自定义域名映射到对应证书目录,可手动新增条目 "user1.com" /etc/letsencrypt/live/user1.com; "user2.com" /etc/letsencrypt/live/user2.com; }
再修改server块中的证书配置:
ssl_certificate $cert_dir/fullchain.pem; ssl_certificate_key $cert_dir/privkey.pem;
方案B:大量自定义域名场景(自动化)
搭配acme.sh的自动签发钩子,或者使用OpenResty的lua模块实现证书的自动申请、加载、续期,无需手动干预:
- 所有自定义域名的证书统一存放在指定目录,比如
/etc/nginx/ssl/custom_domains/ - 全局http块的map规则修改为正则匹配:
map $ssl_server_name $cert_path { default /etc/nginx/ssl/one.com/1233982/server; ~^(?<domain>.+)$ /etc/nginx/ssl/custom_domains/$domain; }
- server块证书配置:
ssl_certificate $cert_path.crt; ssl_certificate_key $cert_path.key;
- 新增后台脚本监听用户新增域名的事件,自动调用acme.sh签发证书并存放到对应目录即可。
3. 验证配置生效
修改完成后执行以下命令验证配置合法性,重载Nginx即可:
nginx -t systemctl reload nginx
内容的提问来源于stack exchange,提问作者JKA
相关产品推荐
相关产品推荐

