如何使用Nginx在同一域名下反向代理Jenkins、SonarQube等多个站点
问题根源
- 当前配置里
proxy_pass结尾携带了/,Nginx转发请求时会自动去除匹配到的location路径前缀,比如/sonar/demo会被转发为http://sonarqube:9000/demo - 核心原因是Jenkins和SonarQube默认生成的页面资源、跳转链接都是基于根路径
/生成的,不会自动带上你配置的/jenkins、/sonar前缀,导致浏览器发起资源请求时直接访问根路径下的资源,触发404。
修复方案
第一步:修改服务自身的上下文路径配置
SonarQube配置
启动容器时添加环境变量SONAR_WEB_CONTEXT=/sonar,docker run启动时可添加参数:-e SONAR_WEB_CONTEXT=/sonar
docker-compose.yml配置示例:
services: sonarqube: image: sonarqube:latest environment: - SONAR_WEB_CONTEXT=/sonar # 其余配置保持不变
配置后SonarQube所有生成的链接都会自动带上/sonar前缀。
Jenkins配置
启动容器时添加环境变量JENKINS_OPTS="--prefix=/jenkins",docker run启动时可添加参数:-e JENKINS_OPTS="--prefix=/jenkins"
docker-compose.yml配置示例:
services: jenkins: image: jenkins/jenkins:lts environment: - JENKINS_OPTS=--prefix=/jenkins # 其余配置保持不变
配置后Jenkins所有内部链接都会自动带上/jenkins前缀。
第二步:调整Nginx配置
修改后配置如下,注意proxy_pass结尾不要加多余的斜杠,同时补充必要的代理头保证服务能正确识别请求来源:
server { listen 80; server_name my.domain.com; # 通用代理头配置 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; location /sonar { # 结尾不要加斜杠,保证路径前缀完整转发到上游 proxy_pass http://sonarqube:9000; } location /jenkins { # 结尾不要加斜杠,保证路径前缀完整转发到上游 proxy_pass http://jenkins:8080; # Jenkins额外适配配置,避免大请求头报错 proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } }
验证操作
- 重启Jenkins、SonarQube容器加载上下文配置
- 执行
nginx -s reload重载Nginx配置 - 分别访问
my.domain.com/jenkins和my.domain.com/sonar,确认页面资源路径都已携带对应前缀,无404异常即可。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

