You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx/OpenResty配置server块实现多子域名反向代理问题咨询

问题原因
  1. 子域名未配置DNS解析:你仅完成了根域名myapp.john.com到实例A公网IP的A记录绑定,prod.myapp.john.com、test.myapp.john.com等子域名未配置对应的A记录指向实例A,导致浏览器发起请求时无法解析到正确IP,请求不会到达实例A。
  2. SSL证书覆盖范围不足:当前使用的Let's Encrypt证书仅对根域名myapp.john.com生效,未包含相关子域名,即使DNS解析配置完成,访问子域名时也会触发证书不安全警告。
  3. 配置文件存在语法不规范问题:Nginx/OpenResty的注释符号为#,你现有配置里用的//不符合语法要求,可能导致配置加载异常。
解决方案

步骤1:配置DNS解析

在你的域名解析服务商后台添加解析记录:

  • 方案一:单独添加两个子域名的A记录,分别将prod.myapp.john.com、test.myapp.john.com指向实例A的公网IP
  • 方案二:添加泛解析A记录,将*.myapp.john.com指向实例A的公网IP,后续新增子域名无需重复修改解析配置

步骤2:更新SSL证书

重新申请包含所有所需域名的Let's Encrypt证书,参考命令如下:

# 单域名/多域名验证(自动验证,无需手动配DNS)
certbot certonly --nginx -d myapp.john.com -d prod.myapp.john.com -d test.myapp.john.com

# 泛域名验证(需要手动添加DNS TXT记录完成验证)
certbot certonly --manual --preferred-challenges dns -d "myapp.john.com" -d "*.myapp.john.com"

证书更新完成后,同步修改所有站点配置里的ssl_certificate和ssl_certificate_key路径为新证书的路径。

步骤3:配置多子域名站点文件

首先修正现有/usr/local/openresty/nginx/sites/prod.myapp.john.com的配置注释语法:

server {
  listen 80;
  listen [::]:80;
  server_name prod.myapp.john.com; # 注释使用#号
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  server_name prod.myapp.john.com; # 注释使用#号

  ssl_certificate      /etc/letsencrypt/live/myapp.john.com/fullchain.pem; # 替换为新证书路径
  ssl_certificate_key  /etc/letsencrypt/live/myapp.john.com/privkey.pem; # 替换为新证书路径

  location / {
    proxy_pass http://192.42.56.87:80/;

    expires 0;

    proxy_set_header Host               $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  $scheme;

    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
  }
}

然后在同目录下新增test.myapp.john.com配置文件,内容如下:

server {
  listen 80;
  listen [::]:80;
  server_name test.myapp.john.com;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  server_name test.myapp.john.com;

  ssl_certificate      /etc/letsencrypt/live/myapp.john.com/fullchain.pem; # 替换为新证书路径
  ssl_certificate_key  /etc/letsencrypt/live/myapp.john.com/privkey.pem; # 替换为新证书路径

  location / {
    proxy_pass http://192.xx.xx.xx:80/; # 替换为实例C的私有IP

    expires 0;

    proxy_set_header Host               $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  $scheme;

    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
  }
}

步骤4:重载配置生效

执行以下命令验证配置语法正确性,无误后重载OpenResty配置:

# 验证配置语法
openresty -t
# 重载配置
openresty -s reload

内容的提问来源于stack exchange,提问作者Kid_Learning_C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:48:04