Nginx反向代理Jenkins返回404,请求排查解决方法
问题背景
Jenkins部署在192.168.0.37:8080,Nginx运行在192.168.0.80,期望通过http://192.168.0.80/jenkins访问Jenkins,但两种Nginx配置均返回404错误。其中Nexus的代理配置正常,已尝试给JENKINS_ARGS添加--prefix=/jenkins但无效果。
配置问题分析
第一种配置的核心问题
- Server块匹配失败:配置中
server_name设为jenkins.example.com,但实际访问用的是IP地址,导致该server块未被触发,Nginx使用默认server块处理请求,/jenkins路径未被代理。 - 转发路径不匹配:即使server块匹配成功,
location /jenkins的proxy_pass指向http://jenkins,会将请求转发到http://192.168.0.37:8080/jenkins,但Jenkins默认根路径为/,未配置prefix时不存在该路径,返回404。
第二种配置的核心问题
proxy_pass直接指向http://192.168.0.37:8080/,与Jenkins配置的--prefix=/jenkins路径不匹配,导致转发请求到Jenkins的根路径,而非/jenkins路径。
解决方案
步骤1:确保Jenkins的prefix配置生效
在Ubuntu 22.04中,编辑Jenkins配置文件/etc/default/jenkins,修改JENKINS_ARGS行:
JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpPort=8080 --prefix=/jenkins"
重启Jenkins服务:
sudo systemctl restart jenkins
验证配置:直接访问http://192.168.0.37:8080/jenkins,若能正常打开Jenkins页面,说明prefix配置成功。
步骤2:修正Nginx代理配置
修改/etc/nginx/conf.d/jenkins.conf(或默认server块),确保转发路径与Jenkins的prefix对应:
server { listen 80; server_name 192.168.0.80; location / { root /usr/share/nginx/html; index index.html index.htm; } location /jenkins/ { proxy_pass http://192.168.0.37:8080/jenkins/; proxy_redirect off; 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; # 支持Jenkins websocket代理(用于agent连接) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location /nexus/ { proxy_pass http://192.168.0.25:8081/; proxy_redirect off; 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_pass末尾添加/jenkins/,与location /jenkins/的路径完全对应,确保Nginx将/jenkins/xxx转发到Jenkins的/jenkins/xxx路径。
步骤3:验证Nginx配置并重启
检查Nginx配置语法:
sudo nginx -t
无错误后重启Nginx:
sudo systemctl restart nginx
额外排查步骤
- 若Jenkins配置prefix后仍无法直接访问,查看Jenkins启动日志:
sudo journalctl -u jenkins -f
排查是否有端口占用、配置加载失败等错误。
2. 若Nginx仍返回404,查看Nginx错误日志:
sudo tail -f /var/log/nginx/error.log
确认请求是否被正确转发到目标地址。
内容的提问来源于stack exchange,提问作者user21938903

