nginx - 如何将 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 Jenkins
Jenkins 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
解决方案
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.
接下来,我使用certbot
with 生成了证书:
sudo certbot certonly --standalone -d jenkins.example.com -d www.jenkins.example.com
最后,我编辑了位于的 Nginx 配置文件/etc/nginx/nginx.conf
,添加了两个server
声明,每个声明都有自己的ssl_certificate
和ssl_certificate_key
(一个用于example.com
,另一个用于jenkins.example.com
由于两个服务器彼此独立地侦听两个不同的 URL(example.com
和jenkins.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
请随时发布另一个解决方案或改进这个解决方案,并指出使用我发布的解决方案可能存在的问题。
推荐阅读
- excel - 仅顶部匹配的单元格
- python - 为 await 函数创建另一个线程
- bash - 如何在 shell 脚本中使用 unset 和 xargs?
- ros - 没有从 [summit_xl_...] 到 [summit_xl_base_footprint] 的转换
- java - 如何在 AWS EC2 上自动启动 2 个 Java jar?
- logging - 如果应用程序与特定过滤器不匹配,Log4net 将创建空日志文件。如何避免创建空文件
- reactjs - 在运行应用程序时给出的 .env 在创建构建时给出时显示未定义的工作位置
- python - 使用python正则表达式用字符串的小数部分替换数据框列值
- json - JSON 模式验证返回读取“必需”值时遇到的意外令牌。预期 StartObject,得到 StartArray
- sql - SQL为每个id选择最大值的计数