在Cloud Run中用Nginx配置多子域名遇500错误的排查请求
问题根源与解决方案
根源分析
从日志和配置来看,导致sub2.example.com返回500错误的核心原因有两个:
- 证书验证请求处理失败:日志中的请求来自
Google-Certificates-Bridge,是Google为自定义域名颁发SSL证书时的ACME验证请求。你的Nginx配置中没有专门处理/.well-known/acme-challenge/路径的规则,当验证请求到达时,Nginx会通过try_files尝试返回index.html,如果该文件无法被读取(权限问题、文件缺失),就会触发500内部错误。 - sub2站点目录/文件异常:虽然sub1正常,但sub2对应的
/usr/share/nginx/html/sub2目录可能缺失、文件权限不正确(Nginx进程无读取权限),或者index.html/50x.html文件损坏/缺失,导致Nginx无法正常返回内容,触发500错误。
注:第二个server块中location的多余缩进不影响Nginx功能,不是错误根源。
解决方案
1. 修正Nginx配置,处理ACME验证请求
添加专门的规则处理证书验证请求,避免触发500错误,推荐两种配置方式:
全局配置(所有域名共用)
在http块下添加规则,所有server自动继承:
http { # 保留原有基础配置(如include mime.types等) # 处理ACME证书验证请求 location /.well-known/acme-challenge/ { root /usr/share/nginx/html; try_files $uri =404; } # 你的两个server块... }
单个server块配置
在sub2的server块内单独添加:
server { listen $PORT; listen [::]:$PORT; server_name sub2.example.com; # 添加ACME验证处理 location /.well-known/acme-challenge/ { root /usr/share/nginx/html; try_files $uri =404; } # 原有location /规则... }
2. 确保站点文件目录与权限正确
在Dockerfile中添加命令,保证sub2目录和文件的权限符合Nginx运行要求:
# 复制站点文件 COPY sub1 /usr/share/nginx/html/sub1 COPY sub2 /usr/share/nginx/html/sub2 # 设置正确的权限 RUN chown -R nginx:nginx /usr/share/nginx/html \ && chmod -R 755 /usr/share/nginx/html \ && chmod 644 /usr/share/nginx/html/sub1/*.html \ && chmod 644 /usr/share/nginx/html/sub2/*.html
3. 验证Cloud Run域名映射状态
进入Cloud Run服务的自定义域名页面,确认sub1.example.com和sub2.example.com的状态均为Active,无验证失败提示。若状态异常,重新完成域名验证流程。
4. 查看Nginx详细错误日志
在Cloud Run日志页面切换到容器日志(而非请求日志),查看Nginx输出到stderr的错误信息,可直接定位500错误的具体原因(如文件缺失、权限拒绝等),辅助进一步排查。
内容的提问来源于stack exchange,提问作者vadim_v
相关产品推荐
相关产品推荐

