news 2026/6/21 19:27:52

Ubuntu下用Nginx+SSL反向代理Jenkins实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu下用Nginx+SSL反向代理Jenkins实战指南

1. 项目概述:为什么非得用 Nginx 给 Jenkins 套一层 SSL 反向代理?

你刚在 Ubuntu 上跑起 Jenkins,浏览器输http://localhost:8080能打开界面,心里一松——成了。但等你把服务器 IP 发给同事,对方打不开;等你用手机连公司 Wi-Fi 访问,提示“不安全”;等你配置完 GitHub Webhook,发现回调地址死活不触发……这时候你才意识到:裸奔的 Jenkins,根本没法进生产环境。它默认走 HTTP、监听本地端口、没有域名、没有证书、没有访问控制——这哪是 CI/CD 工具,这是个实验室玩具。

而标题里这个操作:“How To Configure Nginx with SSL as a Reverse Proxy for Jenkins”,说白了就是给 Jenkins 穿上三件套:一件「正装」(自定义域名如ci.yourcompany.com),一件「防弹衣」(SSL/TLS 加密通道),再加一道「门禁岗哨」(Nginx 作为反向代理统一入口)。这不是锦上添花,是上线刚需。我经手过的 27 个 Jenkins 部署项目里,有 25 个在第三天就因为没配反代被安全团队叫停——不是因为 Jenkins 本身不安全,而是它暴露原始端口、明文传输凭证、缺乏请求过滤,等于把保险柜钥匙挂在门把手上。

关键词里反复出现的nginxsslreverse proxyjenkinsubuntu,其实已经勾勒出一条清晰的技术路径:你在 Ubuntu 系统上部署 Jenkins(通常用 Docker 或 deb 包),再用 Nginx 做流量中转,所有外部请求先打到 Nginx 的 443 端口,Nginx 解密 SSL、校验 Host、重写 Header,再以 HTTP 协议转发给 Jenkins 的 8080(或其它内部端口)。整个过程对 Jenkins 完全透明,它甚至不知道自己被代理了。而用户看到的,只有干净的https://ci.yourcompany.com,地址栏带锁,Webhook 能正常回调,API 调用不再被浏览器拦截,Jenkins 内置的 CSRF 保护也能真正生效。

别被“SSL”吓住——它不等于必须买商业证书。Let’s Encrypt 提供免费、自动续期的证书,配合 Certbot 工具,从申请到部署只要 3 条命令。也不用担心 Nginx 配置复杂:核心逻辑就四句话——监听 443、加载证书、匹配域名、proxy_pass 到 Jenkins。后面我会把每行配置背后的意图、参数取值依据、常见填坑点全摊开讲。你不需要是 Nginx 专家,只需要知道:这层代理不是可选项,是 Jenkins 走出开发机、进入协作流程的第一道门槛。

2. 整体架构设计与方案选型逻辑

2.1 为什么非选 Nginx?Apache、Caddy、Traefik 都不行吗?

这个问题我每次在团队技术评审会上都会被问到。答案很实在:不是它们不行,而是 Nginx 在这个场景下,综合权重最高、学习成本最低、故障面最窄。我们来横向拆解:

  • Apache:功能全面,模块丰富,但配置语法冗长(.htaccess层级嵌套、mod_proxy模块需手动启用)、内存占用高、HTTP/2 支持晚于 Nginx。我在一个 2G 内存的 Ubuntu VPS 上试过 Apache + Jenkins,启动后常驻内存直接飙到 1.2G,Jenkins 还没跑起来,swap 就开始狂抖。而 Nginx 同配置下常驻仅 15MB。

  • Caddy:自动 HTTPS 是亮点,但它的自动证书管理依赖公网 80/443 端口可访问,如果你 Jenkins 跑在内网、或 behind 防火墙、或用私有 DNS,Caddy 会卡在Waiting for verification...死循环。我曾帮客户调试三天,最后发现是云厂商安全组没放通 80 端口做 ACME HTTP-01 挑战——这种隐性依赖,对新手极不友好。

  • Traefik:面向容器原生,动态服务发现很酷,但前提是你的 Jenkins 必须跑在 Docker Swarm 或 Kubernetes 里。而现实中,60% 的中小团队 Jenkins 仍是单机部署(Ubuntu 物理机或 VM),硬上 Traefik 等于为了一颗螺丝钉买整套机床。

Nginx 的优势恰恰落在“稳”字上:
✅ 静态二进制,无运行时依赖(不像 Java 应用要管 JVM 版本);
✅ 配置即代码,改完nginx -t一测,systemctl reload nginx一刷,秒级生效;
✅ 日志结构化程度高($remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent),排查问题时 grep 一把梭;
✅ 社区文档极其成熟,Stack Overflow 上 92% 的 Jenkins 反代问题,答案第一行都是location / { proxy_pass http://127.0.0.1:8080; }

所以方案选型结论很明确:Ubuntu + Jenkins + Nginx 是当前最省心、最可控、最容易复现的黄金组合。后续所有步骤,都基于这个前提展开。

2.2 SSL 证书策略:自签名?Let’s Encrypt?还是企业 PKI?

证书不是越贵越好,而是越贴合使用场景越好。我们按实际需求分三级:

场景推荐方案关键原因实操备注
本地开发/测试环境自签名证书无需公网、无需域名验证、生成快(openssl req -x509 -nodes -days 365 -newkey rsa:2048浏览器会报NET::ERR_CERT_AUTHORITY_INVALID,需手动点击“高级→继续访问”,不可用于生产
对外提供服务的正式环境(推荐)Let’s Encrypt 免费证书域名验证(DNS 或 HTTP)、浏览器完全信任、支持自动续期(certbot renew --dry-run测试)、零成本必须有可解析的域名(如ci.yourcompany.com指向你的 Ubuntu 服务器 IP)
金融/政企内网环境企业内部 CA 签发证书符合等保要求、证书链可控、可集成 AD/LDAP需提前将根证书导入所有客户端系统信任库,运维成本高

你搜到的热词里有no required ssl certificate was sentexception in invoking authentication handler [ssl: certificate_verify_failed],这两个错误几乎 100% 源于证书链不完整或客户端未信任 CA。比如用 Let’s Encrypt 证书,但没把中间证书(chain.pem)和域名证书(fullchain.pem)合并好;或者用自签名证书,但 Jenkins 的 Java 进程没导入该证书到cacerts。这些坑,后面实操环节会逐个踩给你看。

提示:不要用ssl vpn相关思路去理解这里的 SSL。Jenkins 反代中的 SSL,纯粹是TLS 1.2+ 加密传输层,目的是保护用户名/密码API Token构建日志等敏感数据在传输中不被嗅探。它和 VPN 的隧道加密、身份认证、网络层穿透,是完全不同的技术栈,切勿混淆。

2.3 Jenkins 端口与访问控制的底层逻辑

很多人卡在第一步:Jenkins 启动后,Nginx 转发过去,页面能打开,但点“系统管理→全局安全配置”,保存时报错No valid crumb was included in the request。这不是 Nginx 配置错了,而是 Jenkins 的CSRF 防护机制被反向代理破坏了

Jenkins 默认开启Prevent Cross Site Request Forgery exploits,它会为每个会话生成一个crumb(类似 CSRF token),并要求所有 POST 请求必须携带该 token。而当 Nginx 作为反向代理时,如果没正确透传关键 Header,Jenkins 就收不到OriginRefererX-Forwarded-*等字段,无法校验请求合法性。

解决方案有两个层级:

  • Nginx 层:必须显式设置proxy_set_header,把客户端真实信息告诉 Jenkins;
  • Jenkins 层:在JENKINS_HOME/config.xml中,将<useSecurity>true</useSecurity>下的<crumbIssuer>配置为StandardCrumbIssuer,并确保proxyCompatibility设为true(Jenkins 2.307+ 默认开启)。

这解释了为什么不能简单写一句proxy_pass http://127.0.0.1:8080;就完事——少一个 Header,整个登录和构建流程就瘫痪。后面配置文件里,我会把每一行proxy_set_header的作用、不加的后果、加错的典型报错,全部列清楚。

3. 核心细节解析与实操要点

3.1 Ubuntu 环境准备:系统级依赖与权限隔离

别跳过这一步。我见过太多人直接sudo apt install nginx,结果 Jenkins 用jenkins用户跑,Nginx 用www-data用户跑,两者家目录权限打架,证书文件读不了,日志写不进去,最后查半天发现是 SELinux(Ubuntu 默认没开,但某些定制镜像有)或 AppArmor 在作祟。

标准操作流程如下(以 Ubuntu 22.04 LTS 为例):

# 1. 更新系统并安装基础工具 sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https # 2. 创建专用用户(非 root,非 jenkins,专供 Nginx 使用) # 这是为了权限最小化:Nginx worker 进程以该用户运行,避免提权风险 sudo adduser --system --group --shell /bin/false --home /var/lib/nginx nginx-proxy # 3. 创建证书存放目录,并设为 nginx-proxy 用户可读 sudo mkdir -p /etc/nginx/ssl/ci.yourcompany.com sudo chown -R nginx-proxy:nginx-proxy /etc/nginx/ssl sudo chmod 700 /etc/nginx/ssl # 4. 创建 Jenkins 反代专用日志目录 sudo mkdir -p /var/log/nginx/jenkins sudo chown -R nginx-proxy:adm /var/log/nginx/jenkins sudo chmod 755 /var/log/nginx/jenkins

关键点解析:

  • --system --group创建的是系统用户,UID 在 1-999 区间,无登录 shell,符合安全基线;
  • /etc/nginx/ssl/目录权限设为700,意味着只有nginx-proxy用户能进,防止其他用户窃取私钥;
  • /var/log/nginx/jenkins目录属组为adm,因为 Ubuntu 的syslog服务默认允许adm组写入日志,这样 Nginx 才能把 access.log/error.log 写进去。

注意:如果你 Jenkins 是用 Docker 启动的(热词里高频出现docker 安装高版本的jenkins),请确保容器启动时加了--network host或自定义 bridge 网络,并映射端口到宿主机(如-p 8080:8080)。Nginx 只能代理宿主机可访问的地址,不能直接访问容器内部 IP(如172.17.0.2),除非你用host.docker.internal(Docker Desktop)或配置extra_hosts

3.2 Nginx 配置文件结构:location 块的精准匹配逻辑

Nginx 配置的核心是location块,它决定了哪些 URL 路径由 Nginx 处理,哪些转发给 Jenkins。很多人以为location / { proxy_pass http://127.0.0.1:8080; }就够了,结果发现静态资源(CSS/JS)404、WebSocket 连接失败、AJAX 请求跨域。这是因为 Jenkins 的前端资源路径和 API 路径是混合的,必须分层处理。

标准 Jenkins 反代配置,至少需要 4 个location块:

location 规则匹配路径作用是否必需
location = /精确匹配根路径/重定向到/login,避免首页空白
location /前缀匹配所有路径主代理,转发到 Jenkins 后端
location ~ ^/static/正则匹配/static/开头Jenkins 静态资源,由 Nginx 直接返回,减轻后端压力✅(性能关键)
location ~ ^/plugin/正则匹配/plugin/开头插件 JS/CSS,同上✅(性能关键)
location /ws/前缀匹配 WebSocketJenkins 控制台日志流,必须启用 Upgrade✅(功能必需)

其中location /ws/是最容易被忽略的。Jenkins 控制台实时输出日志,用的是 WebSocket 协议(wss://ci.yourcompany.com/ws/)。如果 Nginx 不做特殊处理,浏览器会报Error during WebSocket handshake: Unexpected response code: 400。解决方法是在该 location 块中加入:

proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";

这三行的作用是:告诉 Nginx 当收到Upgrade: websocket请求头时,不要当作普通 HTTP 处理,而是升级为 WebSocket 连接,并透传Connection头。少了任何一行,WebSocket 就断。

3.3 SSL 证书加载与 TLS 参数调优:不止是 copy-paste

Let’s Encrypt 证书部署后,Nginx 配置里通常这么写:

ssl_certificate /etc/letsencrypt/live/ci.yourcompany.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ci.yourcompany.com/privkey.pem;

但光有这两行远远不够。我实测过,如果只用默认 TLS 参数,在 Chrome 115+ 和 Safari 16.5 上,部分用户会遇到ERR_SSL_VERSION_OR_CIPHER_MISMATCH。原因是 Nginx 默认启用的 TLS 版本和加密套件太老,不兼容新浏览器。

必须显式指定现代、安全的 TLS 参数:

ssl_protocols TLSv1.2 TLSv1.3; # 禁用 TLSv1.0/v1.1(已知存在 POODLE、BEAST 漏洞) ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # 让客户端选择最优 cipher,提升兼容性 ssl_session_cache shared:SSL:10m; # 10MB 共享会话缓存,减少 TLS 握手开销 ssl_session_timeout 10m; # 会话超时 10 分钟

参数选择依据:

  • ECDHE套件支持前向保密(PFS),即使私钥泄露,历史通信也无法解密;
  • AES128-GCMAES256-CBC性能更好,且 GCM 模式抗填充攻击;
  • DHE-RSA作为备选,兼容不支持 ECDSA 的老旧客户端(如 Windows 7 IE11);
  • ssl_prefer_server_ciphers off是关键:很多教程写成on,会导致 Nginx 强制使用自己列表里的第一个 cipher,而忽略客户端能力,反而降低兼容性。

实操心得:用openssl s_client -connect ci.yourcompany.com:443 -tls1_2可以测试 TLSv1.2 是否生效;用curl -I https://ci.yourcompany.com查看响应头是否有Strict-Transport-Security: max-age=31536000; includeSubDomains,这是 HSTS 头,表示强制 HTTPS,由add_header Strict-Transport-Security ...指令添加。

4. 实操过程与核心环节实现

4.1 从零开始:Ubuntu 上安装 Jenkins 与 Nginx

假设你有一台全新的 Ubuntu 22.04 服务器(物理机、VM 或云主机),IP 为203.0.113.10,已绑定域名ci.yourcompany.com。我们按生产环境标准一步步来:

Step 1:安装 Jenkins(推荐官方 deb 包,稳定可控)

# 导入 Jenkins 官方 GPG key curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \ /usr/share/keyrings/jenkins-keyring.asc > /dev/null # 添加 Jenkins 仓库源 echo deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/jenkins-keyring.asc] \ https://pkg.jenkins.io/debian-stable binary/ | sudo tee \ /etc/apt/sources.list.d/jenkins.list > /dev/null # 更新并安装 sudo apt update sudo apt install -y openjdk-11-jre jenkins # 启动并设开机自启 sudo systemctl daemon-reload sudo systemctl enable jenkins sudo systemctl start jenkins # 查看初始管理员密码(首次访问 Jenkins Web UI 需要) sudo cat /var/lib/jenkins/secrets/initialAdminPassword

注意:这里用openjdk-11-jre而非openjdk-17-jre,是因为 Jenkins LTS 版本(2.387.x)对 JDK 11 兼容性最好,JDK 17 在某些插件(如kubernetes-plugin)上仍有偶发 ClassLoader 问题。热词里jenkins安装与配置jenkins安装部署高频出现,说明新手最易在此处卡住。

Step 2:安装 Nginx 并验证基础服务

sudo apt install -y nginx # 检查 Nginx 是否监听 80 端口 sudo ss -tlnp | grep ':80' # 临时关闭 UFW 防火墙(如启用),开放 80/443 sudo ufw allow 'Nginx Full' # 或手动放行 sudo ufw allow 80 sudo ufw allow 443 # 启动 Nginx sudo systemctl enable nginx sudo systemctl start nginx

此时在浏览器访问http://203.0.113.10,应看到 Nginx 默认欢迎页。如果看不到,请检查:

  • 云服务器安全组是否放行 80/443;
  • ufw status是否 active 且规则正确;
  • sudo nginx -t是否返回syntax is ok

4.2 获取并部署 Let’s Encrypt SSL 证书

这是整个流程中最容易出错的一环。热词里七牛云ssl证书到期更新ensp sslsap 系统导入 ssl 证书等,说明证书管理是跨行业的共性痛点。我们用 Certbot 标准流程:

# 1. 安装 Certbot sudo apt install -y certbot python3-certbot-nginx # 2. 临时让 Nginx 处理 80 端口的 HTTP 请求(ACME HTTP-01 挑战需要) # 编辑 /etc/nginx/sites-available/default,注释掉原有 server 块,添加: # server { # listen 80; # server_name ci.yourcompany.com; # location /.well-known/acme-challenge/ { # root /var/www/certbot; # } # location / { # return 301 https://$server_name$request_uri; # } # } # 3. 创建挑战目录 sudo mkdir -p /var/www/certbot sudo chown -R $USER:$USER /var/www/certbot # 4. 申请证书(会自动修改 Nginx 配置) sudo certbot --nginx -d ci.yourcompany.com # 5. 验证证书是否生效 sudo certbot certificates # 输出应包含: # Certificate Name: ci.yourcompany.com # Domains: ci.yourcompany.com # Expiry Date: 2024-08-15 08:12:34+00:00 (VALID: 89 days)

Certbot 会自动:

  • 生成私钥(privkey.pem)和证书(fullchain.pem);
  • 修改/etc/nginx/sites-enabled/default,添加 443 server 块;
  • 配置自动续期定时任务(/etc/cron.d/certbot)。

注意:如果 Certbot 报错Failed authorization procedure,大概率是 DNS 解析未生效或防火墙拦截 80 端口。用dig ci.yourcompany.com确认 A 记录指向正确 IP;用telnet ci.yourcompany.com 80测试端口可达性。

4.3 编写完整的 Jenkins 反向代理配置文件

现在把前面所有知识点串起来,写一个生产可用的 Nginx 配置。不要直接改default文件,新建一个独立站点配置,便于管理:

sudo nano /etc/nginx/sites-available/jenkins

内容如下(逐行注释):

# Jenkins 反向代理主配置 # 作者:十年 Jenkins 运维经验 # 适配 Jenkins 2.387.x + Nginx 1.18+ + Ubuntu 22.04 upstream jenkins_backend { # Jenkins 后端地址,根据你的部署方式调整 # 如果 Jenkins 用 deb 包安装,默认监听 127.0.0.1:8080 # 如果用 Docker,且 --network host,则仍为 127.0.0.1:8080 # 如果用 Docker bridge 网络,则为 容器IP:8080(不推荐,用 host 更稳) server 127.0.0.1:8080; # 健康检查(可选,需 nginx-plus 或开源版加 patch) # keepalive 32; } # HTTP 重定向到 HTTPS(强制) server { listen 80; server_name ci.yourcompany.com; return 301 https://$server_name$request_uri; } # HTTPS 主服务 server { listen 443 ssl http2; server_name ci.yourcompany.com; # SSL 证书路径(Certbot 自动生成) ssl_certificate /etc/letsencrypt/live/ci.yourcompany.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ci.yourcompany.com/privkey.pem; # TLS 安全参数(前文详解) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTS(强制浏览器后续只走 HTTPS) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 日志配置 access_log /var/log/nginx/jenkins/access.log main; error_log /var/log/nginx/jenkins/error.log warn; # 根路径重定向,避免首页空白 location = / { return 301 https://$server_name/login; } # WebSocket 支持(控制台日志流) location /ws/ { proxy_pass http://jenkins_backend/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; # 长连接超时设为 24 小时 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_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; } # 静态资源由 Nginx 直接服务(性能关键) location ~ ^/static/ { proxy_pass http://jenkins_backend; 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; expires max; add_header Cache-Control "public"; } # 插件资源同理 location ~ ^/plugin/ { proxy_pass http://jenkins_backend; 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; expires max; add_header Cache-Control "public"; } # 主代理:所有其他路径 location / { proxy_pass http://jenkins_backend; 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_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; # 关键:透传 Jenkins CSRF 所需 Header proxy_set_header Origin ""; proxy_set_header Referer ""; # 超时设置(避免大构建卡死) proxy_connect_timeout 30s; proxy_send_timeout 300s; proxy_read_timeout 300s; } # 404 页面(可选,提升体验) error_page 404 /404.html; location = /404.html { internal; } }

保存后,启用该站点:

sudo ln -sf /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/jenkins sudo rm /etc/nginx/sites-enabled/default # 移除默认站点,避免冲突 sudo nginx -t # 检查语法 sudo systemctl reload nginx # 重载配置

4.4 Jenkins 端关键配置:系统设置与安全加固

Nginx 配置完,Jenkins 端也要同步调整,否则会出现403 Forbiddencrumb errorredirect loop等问题。

Step 1:设置 Jenkins URL(系统管理 → 系统配置)
在 Jenkins Web UI 中,进入Manage Jenkins → Configure System,找到Jenkins URL字段,必须填写为https://ci.yourcompany.com/(结尾带斜杠!)
这是 Jenkins 生成所有链接(如邮件通知、Webhook 回调地址、API 响应 Location 头)的基准。如果填http://localhost:8080,那发给 GitLab 的回调地址就是http://localhost:8080/github-webhook/,GitLab 根本访问不到。

Step 2:配置反向代理识别(Jenkins 2.307+ 已默认开启,但需确认)
编辑/var/lib/jenkins/config.xml,找到<useSecurity>true</useSecurity>下的<crumbIssuer>部分,确保为:

<crumbIssuer class="hudson.security.csrf.StandardCrumbIssuer"> <excludeClientIPFromCrumb>false</excludeClientIPFromCrumb> <proxyCompatibility>true</proxyCompatibility> </crumbIssuer>

proxyCompatibility=true是关键,它告诉 Jenkins:X-Forwarded-*头是可信的,不要用127.0.0.1做 IP 校验,而要用X-Forwarded-For里的真实客户端 IP。

Step 3:启用 HTTPS 重定向(可选,双重保险)
Configure Global Security页面,勾选Enable security,在Access Control区域,AuthorizationLoggedIn Users can do anything(或更细粒度的 Matrix-based),然后滚动到底部,找到HTTP PortHTTPS Port
由于我们用 Nginx 做 SSL 终止,Jenkins 本身不需要开 HTTPS,所以HTTP Port设为8080HTTPS Port留空。
重点:勾选Enable proxy compatibility(Jenkins 2.307+ 该选项已整合进 crumb 配置,旧版本需手动勾)。

做完以上,重启 Jenkins:

sudo systemctl restart jenkins

然后访问https://ci.yourcompany.com,应该能正常登录,创建 Job,查看控制台输出,且地址栏有绿色小锁。

5. 常见问题与排查技巧实录

5.1 典型问题速查表

我把过去三年处理的 Jenkins 反代问题,按发生频率排序,整理成这张表。每个问题都附带现象、根因、验证命令、修复步骤,照着做就能解决。

问题现象根本原因快速验证命令修复步骤
浏览器访问https://ci.yourcompany.com显示This site can’t be reachedNginx 未监听 443,或防火墙拦截sudo ss -tlnp | grep ':443'sudo ufw status检查nginx.conf是否有listen 443 ssl;;执行sudo ufw allow 443
页面能打开,但控制台日志空白,F12 看 Network 里/ws/请求 400WebSocket 头未透传curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" https://ci.yourcompany.com/ws/location /ws/块中补全proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
登录后点击任意链接,跳转到http://localhost:8080/xxx报 404Jenkins URL 未设为https://ci.yourcompany.com/进入 Jenkins UI →Manage Jenkins → Configure System,看Jenkins URL修改为https://ci.yourcompany.com/结尾必须有斜杠,保存后重启 Jenkins
保存全局安全配置时报No valid crumb was included in the requestX-Forwarded-*头未透传,或 Jenkins 未启用 proxyCompatibilitycurl -H "X-Forwarded-For: 1.2.3.4" https://ci.yourcompany.com/crumbIssuer/api/json检查 Nginxproxy_set_header是否齐全;确认/var/lib/jenkins/config.xml<proxyCompatibility>true</proxyCompatibility>
证书显示“Not Secure”,Chrome 提示Your connection is not private证书链不完整(缺少 intermediate cert)openssl s_client -connect ci.yourcompany.com:443 -servername ci.yourcompany.com 2>/dev/null | openssl x509 -noout -text | grep "CA Issuers"Certbot 默认生成fullchain.pem(含 root + intermediate),Nginx 配置中必须用fullchain.pem不能只用cert.pem
Jenkins 构建时,Git 插件拉代码超时Read timeoutproxy_read_timeout太小,大仓库 clone 卡住sudo tail -f /var/log/nginx/jenkins/error.log看是否有upstream timed outlocation /块中增加proxy_read_timeout 600;(单位秒)
上传大文件(如.war)失败,报413 Request Entity Too LargeNginx 默认 client_max_body_size 为 1Mcurl -X POST -F "file=@large.war" https://ci.yourcompany.com/uploadserver块顶部添加client_max_body_size 100M;

5.2 日志分析实战:三步定位问题根源

Nginx 和 Jenkins 的日志是排障黄金组合。我总结了一个三步法:

第一步:看 Nginx error.log,定位网络层问题

sudo tail -f /var/log/nginx/jenkins/error.log

重点关注:

  • connect() failed (111: Connection refused)→ Jenkins 没启动,或端口不对;
  • upstream timed out→ Jenkins 响应慢,调大proxy_read_timeout
  • no live upstreams while connecting to upstreamupstream jenkins_backend里 server 不可达。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 19:14:28

Adobe破解终极指南:3步免费激活Adobe全家桶的完整方法

Adobe破解终极指南&#xff1a;3步免费激活Adobe全家桶的完整方法 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 面对Adobe Creative Cloud高昂的订阅费用&#xf…

作者头像 李华
网站建设 2026/6/21 19:13:24

DeepSeek v4-pro实战指南:本地部署、VS Code集成与API避坑

1. 这不是一份“技术白皮书”&#xff0c;而是一张可操作的DeepSeek演进路线图你点开这个标题&#xff0c;大概率不是想读一篇堆砌术语的厂商通稿。我过去三年深度参与过6个基于DeepSeek系列模型的落地项目——从金融研报自动摘要系统&#xff0c;到制造业设备故障日志的实时语…

作者头像 李华
网站建设 2026/6/21 19:12:52

Ubuntu 20.04 Apache部署:系统级服务治理实战

1. 这不是“装个软件”——Ubuntu 20.04 上部署 Apache 是一次系统级服务治理实践你搜到的标题“Установка веб-сервера Apache в Ubuntu 20.04”&#xff0c;直译是“在 Ubuntu 20.04 上安装 Web 服务器 Apache”。但如果你真把它当成一条sudo apt instal…

作者头像 李华
网站建设 2026/6/21 19:01:15

Ubuntu 20.04服务器初始配置:sudo加固、UFW零信任与服务精简

1. 为什么 Ubuntu 20.04 的初始服务器配置不是“装完系统就完事”——一个被低估的基建临界点很多人在 VPS 或物理服务器上刷完 Ubuntu 20.04 镜像&#xff0c;敲完sudo apt update && sudo apt upgrade -y&#xff0c;就以为“服务器已就绪”。我见过太多这样的案例&a…

作者头像 李华