虚拟机里Jenkins启动后打不开网页,十有八九是8080端口被宿主机或其他服务占用了,解决办法是修改Jenkins的HTTP端口配置,然后同步调整虚拟机的网络端口映射和防火墙放行规则。
是什么在跟Jenkins抢端口?先从现象判断冲突类型
Jenkins默认监听8080端口,但虚拟机的网络环境比物理机复杂,端口冲突的表现也更多样,常见的有三种:
- 宿主机端口被占:你在宿主机浏览器访问
http://虚拟机IP:8080,页面一直转圈,但Jenkins服务本身已经启动了。 - 虚拟机内部端口被占:在虚拟机里执行
curl http://localhost:8080,返回的是其他服务的页面,比如Tomcat、Spring Boot应用、或者Nacos,而不是Jenkins的欢迎页。 - 代理或反代端口冲突:你配置了Nginx反向代理,但Nginx监听的端口被防火墙或另一个Nginx实例抢占,导致外网访问被拒。
判断方法很简单,在虚拟机终端执行:
netstat -tlnp | grep 8080
或者用更直观的lsof -i:8080,看输出的PID和进程名,如果显示的是java -jar jenkins.war,那Jenkins确实在跑,问题出在访问链路上;如果显示的是java -jar app.jar或者其他进程,那就是端口被顶掉了。
Jenkins端口被占用怎么办?首选方案是修改httpPort参数
修改Jenkins端口的方式取决于你的安装方式,但核心思路一致:改配置文件里的HTTP监听端口,然后重启服务。
原生安装(deb/rpm包或直接Java部署)
配置文件位于/etc/default/jenkins(Ubuntu/Debian)或/etc/sysconfig/jenkins(CentOS/RHEL),找到这一行:
HTTP_PORT=8080
改成你想要的端口,比如8081、8899,或者干脆换个不常用的高位端口,修改后重启服务:
sudo systemctl restart jenkins
使用Docker容器运行Jenkins
Docker方式的端口冲突更隐蔽,因为端口映射是在docker run命令里指定的,如果你之前跑的是:
docker run -p 8080:8080 jenkins/jenkins:lts
而宿主机8080被占,那就把左边的宿主端口改掉:
docker run -p 8899:8080 -p 50000:50000 jenkins/jenkins:lts
注意左边是宿主机端口,右边是容器内Jenkins的端口,改完后访问http://虚拟机IP:8899。
配置文件改了没用?可能是JENKINS_HOME参数作怪
有些场景下你改了HTTP_PORT,但重启后Jenkins依然监听8080,这通常是因为启动脚本里显式传了--httpPort=8080参数,这个参数的优先级高于配置文件,检查/etc/init.d/jenkins或者systemd service文件,看看有没有硬编码的--httpPort,如果有,把它改成与配置文件一致。
改完端口打不开?虚拟机环境要三步走
改端口只是第一步,在虚拟机环境里,你还需要处理三层访问链路:虚拟机防火墙、宿主机到虚拟机的端口转发、以及Jenkins自身的访问控制。
第一步:放行虚拟机内部防火墙
以CentOS为例,新端口不在firewalld放行列表里,外部永远连不上:
sudo firewall-cmd --permanent --add-port=8899/tcp sudo firewall-cmd --reload
Ubuntu的ufw则是:
sudo ufw allow 8899/tcp
第二步:配置宿主机到虚拟机的端口映射
这一步是大多数人踩坑的地方,你的宿主机浏览器访问虚拟机时,数据包走了两条不同路径:
-
使用VMware Workstation或VirtualBox的NAT模式:虚拟机只有一个私有IP(如192.168.x.x),宿主机可以直接用这个IP访问虚拟机,前提是防火墙放行,但如果你在宿主机上访问的是
localhost:8899,就需要在虚拟机的网络设置里添加端口转发规则,把宿主机的8899端口转发到虚拟机的8899端口。 -
使用Hyper-V的默认交换机:默认交换机使用NAT,但端口转发配置方式跟VirtualBox不同,需要在PowerShell里用
New-NetNatStaticMapping命令手动添加,具体路径是:Hyper-V管理器 → 虚拟机设置 → 网络适配器 → 高级功能(不同系统版本路径有差异)。 -
云服务器场景(简米云、酷番云等):需要在安全组里放行新端口,否则改了配置、关了防火墙也白搭,访问
https://虚拟机公网IP:8899。
行业共识认为,大多数虚拟机访问失败的问题,都出在虚拟机防火墙和宿主机端口映射的配置不一致上,而Jenkins本身配置文件并没有问题。
第三步:检查JVM启动参数里的代理设置
如果你的虚拟机走公司代理上网,而且Jenkins是通过java -Dhttp.proxyPort=8080 -jar jenkins.war启动的,那就出现了诡异现象:Jenkins监听的--httpPort和JVM代理端口都是8080,虽然netstat看不到两个进程同时监听,但JVM的代理逻辑会拦截部分请求,这种场景下,把代理端口改掉,或者改用环境变量JENKINS_OPTS统一管理,避免端口号混淆。
同一台机器上跑多个Jenkins实例,怎么避免端口打架?
实际运维中,经常出现一台虚拟机需要同时跑测试环境和生产环境两套Jenkins的情况,这时只改一个端口没用,因为两个实例的配置都要动,而且还有JVM内存和JENKINS_HOME目录的冲突风险。
- 实例A:
--httpPort=8080 --prefix=/jenkins-a,JENKINS_HOME指向/var/lib/jenkins-a - 实例B:
--httpPort=8090 --prefix=/jenkins-b,JENKINS_HOME指向/var/lib/jenkins-b
访问路径分别为http://虚拟机IP:8080/jenkins-a和http://虚拟机IP:8090/jenkins-b,注意--prefix参数可以让两个实例共用同一个域名和端口,但路径不同,这在配合Nginx反向代理时特别有用。
用Nginx反向代理解决端口暴露问题
如果虚拟机已经跑了Nginx,且80端口空闲,更优雅的做法是让Nginx监听80,把请求转发给Jenkins的8080端口,这样做的好处是:用户不用记端口号,也方便绑定域名和配置HTTPS。
在/etc/nginx/conf.d/下新建jenkins.conf:
server {
listen 80;
server_name jenkins.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
然后sudo nginx -s reload,这样用户访问http://jenkins.example.com
就到了Jenkins,外面完全看不到8080端口,安全性也更高。
端口改完,旧地址访问不了是正常的
有人改完端口后,发现Jenkins能通过新端口访问了,但旧地址http://虚拟机IP:8080依然能打开,而且页面还是Jenkins,这不是”端口没改成功”,而是浏览器缓存了重定向,或者虚拟机里还有另一个Jenkins进程在监听8080。
用这个命令确认:
ps aux | grep jenkins.war
如果有两个java进程,分别监听8080和8899,说明改配置前没有彻底停掉旧实例,把旧进程Kill掉再重启新实例就好。
最后再划一次重点:先确认Jenkins监听在哪个端口,再检查虚拟机的防火墙和端口映射,最后才是改配置,如果照着上面步骤走完还是访问不了,大概率是虚拟机网络模式的锅,把虚拟机网络从NAT切换为桥接模式,问题通常就迎刃而解了。
Q&A
Q:配置Jenkins时发现8080端口已经被其他程序占用,怎么保留8080端口给Jenkins用?
A:先找出占用8080端口的进程,使用lsof -i:8080或netstat -ano | findstr 8080查看PID,然后根据PID搜索进程名称,如果是开发时的临时服务,直接kill -9 PID停掉;如果是系统服务(如Nginx的默认站点),那就去它的配置文件里改端口,不建议强行杀进程,因为可能是数据库管理面板或监控服务,停掉会引发连锁问题,更稳妥的做法是让Jenkins用另一个端口,比如8080被占了但8899空闲,就用8899。
Q:在VMware虚拟机里配置Jenkins端口映射后,宿主机能访问但局域网其他电脑访问不了,是什么原因?
A:原因通常是VMware的NAT模式不会自动向局域网广播虚拟机的端口映射规则,宿主机能访问是因为NAT网关在宿主机上,而其他电脑访问的是宿主机IP,数据包到达宿主机后,需要宿主机有一条NAT转发规则把请求转向虚拟机的IP,解决方法是使用桥接模式,让虚拟机直接获取局域网IP,这样其他电脑直接访问虚拟机IP加端口即可,如果坚持用NAT,确认VMware虚拟网络编辑器中是否勾选了”允许本地系统管理网络适配器”,并在NAT设置里添加了正确的TCP转发端口。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/751516.html





