如何正确配置NGINX反向代理运行Docker部署的Jenkins服务
问题根因
出现这个问题是两个配置缺失叠加Docker网络特性导致的:
- Jenkins默认以根路径
/作为服务上下文,所有页面跳转、静态资源请求都会生成根路径下的地址,请求不会带上/jenkins前缀,自然会匹配到NGINX上部署在/路径的Next.js应用,返回Next.js的404响应 - 现有NGINX反代配置缺少必要的请求头传递、路径匹配规则,且
127.0.0.1在Docker容器语境下指向NGINX容器自身的回环地址,默认无法直接访问宿主机或其他容器上的8080端口
分步修复方案
1. 配置Jenkins服务上下文路径
首先要让Jenkins明确自己被部署在/jenkins子路径下,根据你的部署方式调整:
如果是docker run启动Jenkins,启动命令追加环境变量参数:
-e JENKINS_OPTS="--prefix=/jenkins"
如果是docker-compose部署,在Jenkins服务的配置块中添加环境变量:
environment: - JENKINS_OPTS=--prefix=/jenkins
配置完成后重启Jenkins容器,先验证容器内部访问http://<Jenkins容器IP>:8080/jenkins可以正常加载Jenkins页面,确认配置生效。
2. 修复Docker网络连通性
不要在NGINX配置中使用127.0.0.1作为Jenkins服务地址:
- 推荐创建自定义Docker桥接网络,将NGINX和Jenkins容器都接入该网络,反代地址直接写Jenkins的容器名(比如Jenkins容器名为
jenkins,则反代地址为http://jenkins:8080) - 如果不想调整网络,也可以将Jenkins的8080端口映射到宿主机,反代地址写宿主机的Docker网桥IP(通常为
172.17.0.1)
如果要实现Jenkins仅能通过NGINX访问,不要将Jenkins的8080端口映射到公网网卡,只保留容器网络或宿主机本地的访问能力即可。
3. 替换为完整的NGINX反代配置
location /jenkins/ { # 注意proxy_pass末尾必须带/jenkins/路径和尾斜杠 proxy_pass http://<替换为实际的Jenkins访问地址>:8080/jenkins/; 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_redirect default; sendfile off; client_max_body_size 1024m; # 适配大文件上传、插件安装场景 }
配置完成后执行nginx -t检查语法无误,重载NGINX配置即可。
验证与排错
- 首次验证建议使用浏览器无痕模式,避免缓存旧的302跳转规则导致异常
- 如果仍然返回404,先检查NGINX的access.log,确认请求路径是否正确转发到Jenkins的
/jenkins前缀下 - 后续配置SSL时,只需要给NGINX的443端口配置证书即可,Jenkins侧不需要额外调整SSL配置
内容的提问来源于stack exchange,提问作者Alex Bran
相关产品推荐
相关产品推荐

