首页 > 解决方案 > 如何将 Jenkins 放在 Nginx 后面

问题描述

Nginx 服务器正在运行链接到域的 HTTPS www.example.com。Jenkins 在端口 8080 上的同一台服务器上运行。我已成功配置 Nginx 以使用 Nginx 配置location语句通过端口 443 将所有不安全流量从端口 80 路由到安全流量:

location /  {
    proxy_pass http://localhost:8080;
}

现在,www.example.com在 Web 浏览器中输入内容通过安全的 HTTPS 将我连接到 Jenkins Web 界面。那太好了。但问题是location / 所有流量都www.example.com被路由到詹金斯。

我想继续修改location以包含/jenkins

location /jenkins  {
    proxy_pass http://localhost:8080;
}

尝试从中加载 Jenkinswww.example.com/jenkins会出现错误:

在此处输入图像描述

为了修复它,我使用 Nginxrewrite语句:

location /jenkins  {
    rewrite ^/jenkins?$ / break;
    proxy_pass http://localhost:8080;
}

现在,我可以访问 Jenkins www.example.com/jenkins,但只能访问 Jenkins root URL /。单击 Jenkins Web 界面中的任何导航链接,都会出现404 Not Found错误。

再次,https://www.example.com/将我连接到 Jenkins 根/并加载主 Jenkins Web 界面。单击Manage JenkinsJenkins Web 界面中的按钮会尝试路由到https://www.example.com/manage. 404 Not Found它因相同的错误而中断。

我尝试使用另一个重写正则表达式,/jenkins在将请求发送到之前删除 URL中的单词http://localhost:8080

location /jenkins  {
    rewrite ^/jenkins(.*) $1 break;
    proxy_pass http://localhost:8080;
}

导航到主根 Jenkins 站点现在必须完成

www.example.com/jenkins/

(URL 必须以正斜杠结尾/)。

它确实加载了 Jenkins 主界面。但同样,所有 Jenkins 内部导航链接都被破坏了。

在玩了之后,我注意到,单击Manage Jenkins按钮会路由到

https://www.example.app/manage

导致404 Not Found错误。

如果我将此 URL 修改为

https://www.example.app/jenkins/manage

它成功加载了Manage Jenkins页面。似乎解决方案就在附近...

有没有办法配置 Jenkins 路由,以便将自定义插入/jenkins到它创建的内部 URL 中,因此单击Manage Jenkins按钮会导致

https://www.example.app/jenkins/manage

代替

https://www.example.app/manage?

如何让它发挥作用?

詹金斯内部网址:

https://www.example.com 
https://www.example.com/view/all/newJob
https://www.example.com/projectRelationship
https://www.example.com/fingerprintCheck
https://www.example.com/manage
https://www.example.com/me/my-views/view/all/
https://www.example.com/lockable-resources/
https://www.example.com/job/freestyle/18/console

标签: nginxjenkinsdevops

解决方案


rewrite我没有在函数体中用语句重写传入的 URL,而是location实现了子域,以将到网页的流量与到 Jenkins 的流量分开。

首先,我已经使用我的 DNS 注册器(在我的例子中是 Google Cloud DNS 服务)注册了子域名。结果,我现在有以下记录集:

DNS NAME                    Type      Data 
example.com.                A        345.678.90.1 (server public IP)
www.example.com.            CNAME     example.com.  

jenkins.example.com.        A        345.678.90.1 (same server public IP)
www.jenkins.example.com.    CNAME    jenkins.example.com. 

接下来,我使用certbotwith 生成了证书:

sudo certbot certonly --standalone -d jenkins.example.com -d www.jenkins.example.com

最后,我编辑了位于的 Nginx 配置文件/etc/nginx/nginx.conf,添加了两个server声明,每个声明都有自己的ssl_certificatessl_certificate_key(一个用于example.com,另一个用于jenkins.example.com

由于两个服务器彼此独立地侦听两个不同的 URL(example.comjenkins.example.com),因此它们都location在根目录下配置了一个\

对于example.com网站,它是:

location /  {
    proxy_pass http://localhost:4200;
}

因为jenkins.example.com它是

location /  {
    proxy_pass http://localhost:8080;
}

现在,要获取网站,我使用www.example.com 要获取 Jenkins Web UI,我使用www.jenkins.example.com

请随时发布另一个解决方案或改进这个解决方案,并指出使用我发布的解决方案可能存在的问题。


推荐阅读