You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在DigitalOcean的Docker容器中运行Jenkins时遇403 Forbidden无法访问管理端

解决Jenkins容器外部访问403 Forbidden的问题

这种情况我之前部署Jenkins时也碰到过,核心原因大多和Jenkins的安全校验或者URL配置不匹配有关,咱们一步步排查:

1. 先确认容器端口绑定是否正确

首先检查你启动Jenkins容器的命令,是不是把端口绑定到了主机的所有网卡。如果启动命令里写的是-p 127.0.0.1:8080:8080,那只有本地能访问,但你能拿到403,说明端口是通的,这条大概率没问题,但还是确认下:
正确的端口绑定应该是这样(没有127.0.0.1前缀):

docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts

如果之前加了127.0.0.1,去掉后重启容器就行。

2. 修正Jenkins的URL配置(最常见的解决方法)

这是90%的场景下导致外部访问403的原因:Jenkins内部配置的URL和你外部访问的地址不匹配,触发了CSRF(跨站请求伪造)校验失败。
当你用localhost:8080访问时,Jenkins识别的请求来源是localhost,但用公网IP访问时,请求的主机头和Jenkins配置的URL不一致,直接被安全拦截返回403。

解决步骤:

  • 先通过本地localhost:8080登录Jenkins后台
  • 点击左侧菜单的Manage JenkinsConfigure System
  • 找到Jenkins Location区块,把Jenkins URL改成你外部访问的地址:http://x.x.x.x:8080(把x.x.x.x换成你的DigitalOcean主机公网IP)
  • 保存配置后,再用公网IP访问试试,应该就能正常进入登录页了

3. 检查CSRF和权限限制

如果上面的方法没用,可能是CSRF校验过于严格或者设置了IP白名单:

  • 进入Manage JenkinsConfigure Global Security
  • 找到CSRF Protection,如果你的场景是直接访问容器(没有用Nginx这类反向代理),可以暂时取消勾选测试(测试完记得重新开启,安全很重要)
  • 另外,如果你安装了Role-based Authorization Strategy或者IP Whitelist Plugin这类插件,检查是否把公网IP或者所有IP段加入了白名单

4. 排查容器内Jenkins的启动参数

偶尔会遇到启动Jenkins时指定了仅监听容器内部地址的情况,你可以进入容器查看配置:

docker exec -it <你的Jenkins容器ID> bash
cat /var/jenkins_home/config.xml | grep -A 5 -B 5 "arguments"

如果看到--httpListenAddress=127.0.0.1这样的参数,说明Jenkins只监听容器内部的localhost,外部访问就会失败,但你本地能访问的话,这条应该不成立,不过还是确认下更稳妥。

5. 最后确认DigitalOcean防火墙规则

虽然你能得到403,说明端口是通的,但还是快速检查下DigitalOcean的云防火墙:

  • 登录DigitalOcean控制台,进入你的Droplet页面
  • 查看Firewalls标签,确保有一条允许0.0.0.0/0访问8080端口的入站规则

一般来说,第2步的URL配置修正就能解决问题,我之前碰到的几次类似情况都是这个原因导致的。

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

火山引擎 最新活动