如何使用Nginx反向代理配置带有SSL的Buildbot
注意:本教程涵盖了旧版本的 Buildbot,因此说明可能不适用于当前版本。 在本文更新之前,您可以额外使用官方Buildbot反向代理配置文档。
介绍
Buildbot 是一个基于 Python 的持续集成系统,用于自动化软件构建、测试和发布过程。 在之前的教程中,我们 安装了 Buildbot 和 创建了 systemd 单元文件 以允许服务器的 init 系统管理进程。 Buildbot 带有自己的内置 Web 服务器,侦听端口 8010,为了使用 SSL 保护 Web 界面,我们需要配置反向代理。
在本教程中,我们将演示如何将 Nginx 配置为反向代理,以便将受 SSL 保护的浏览器请求定向到 Buildbot 的 Web 界面。
先决条件
要遵循本教程,您将需要:
- 一台具有至少 1 GB RAM 的 Ubuntu 16.04 服务器,按照 Ubuntu 16.04 初始服务器设置指南 配置非 root
sudo
用户和防火墙
此外,您还需要在服务器上完成以下教程:
- 如何在 Ubuntu 16.04 上安装 Buildbot
- 如何为 Buildbot 创建 Systemd 单元文件
- 如何在 Ubuntu 16.04 上安装 Nginx
- 如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Nginx。
完成这些要求后,您就可以开始了。
第 1 步 — 配置 Nginx
在先决条件教程 How to Secure Nginx with Let's Encrypt on Ubuntu 16.04 中,我们在 /etc/nginx/sites-available/default
文件中配置 Nginx 以使用 SSL。 在开始之前,我们将备份我们的工作配置文件:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.ssl.bak
接下来,我们将打开 default
并添加我们的反向代理设置。
sudo nano /etc/nginx/sites-available/default
首先,我们将在 SSL server
块中添加特定的访问和错误日志。
/etc/nginx/sites-available/default
. . . server { # SSL Configuration # . . . # include snippets/snakeoil.conf; access_log /var/log/nginx/buildbot.access.log; error_log /var/log/nginx/buildbot.error.log; . . .
接下来,我们将配置代理设置。
由于我们将所有请求发送到 Buildbot,我们需要删除或注释掉默认的 try_files
行,如所写,它将在请求到达 Buildbot 之前返回 404 错误。
注意: 与大多数应用程序不同,Buildbot 将在启用 try_files
设置的情况下向文档根目录返回 200 响应请求。 如果资产被浏览器缓存,Buildbot 可能看起来正在工作。 如果没有缓存资产,它将返回一个空白页面。
然后我们将添加反向代理配置。 第一行包括 Nginx 提供的 proxy_params
以确保主机名、客户端请求的协议和客户端 IP 地址等信息在我们的日志文件中可用。 proxy_pass
设置代理服务器的协议和地址,在我们的例子中是在 localhost 的 8010 端口上访问的 Buildbot 服务器。
/etc/nginx/sites-available/default
. . . location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; # Reverse proxy settings include proxy_params; proxy_pass http://localhost:8010; } . . .
在这节之后,我们将配置两个额外的位置,/sse
和 /ws
:
- 服务器发送事件 (SSE) 设置 服务器发送事件 are a simpler, more REST compliant protocol than WebSockets that allow clients to subscribe to events. The Buildbot SSE endpoint requires its own
proxy_pass
setting and benefits from turning offproxy_buffering
. - WebSocket 设置 网络套接字 is a protocol for messaging between the web server and web browsers. Like the SSE protocol, it requires its own
proxy_pass
setting. Additional configuration is also required to pass header information. You can learn more these settings from the Nginx WebSocket 代理文档.
/etc/nginx/sites-available/default
. . . # Server sent event (sse) settings location /sse { proxy_buffering off; proxy_pass http://localhost:8010; } # Websocket settings location /ws { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://localhost:8010; proxy_read_timeout 6000s; } . . .
完成这些更改后,保存并退出文件。
最后,我们将编辑 ssl_params.conf
并将 ssl_session_timeout
增加到项目推荐的 1440 分钟(24 小时)设置以适应更长的构建:
sudo nano /etc/nginx/snippets/ssl-params.conf
在文件的底部,添加以下行:
/etc/nginx/snippets/ssl-params.conf
. . . ssl_session_timeout 1440m;
完成后,保存并退出文件。
注意: Buildbot 文档的示例 Nginx 文件包括将 ssl_session_cache
大小设置为 1,440 兆字节的行,这允许超过 500 万个连接。 我们选择保留 10 兆字节的内存密集度较低的设置。 每兆字节可以存储大约 4000 个会话,因此这将存储大约 40,000 个会话,这对于大多数用例来说已经足够了。
在配置 Buildbot 之前,我们不会重新启动 Nginx,但我们现在将测试我们的配置,以防我们犯了任何错误:
sudo nginx -t
如果一切正常,命令将返回:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
如果没有,请修复报告的错误,直到测试通过。
第 2 步 — 配置 Buildbot
Buildbot 在其 Web 界面中使用相对于根的链接,并且需要在 master.cfg
中定义基本 URL 才能使链接正常工作。
sudo nano /home/buildbot/master/master.cfg
找到 buildbotURL
设置,将 http
更改为 https
,并将 localhost
更改为您的域。 删除端口规范(:8010
),因为 Nginx 将代理对传统 Web 端口的请求。 重要: 协议必须是 https
并且定义必须包含尾部斜杠。
/home/buildbot/master/master.cfg
. . . c['buildbotURL'] = "https://your.ssl.domain.name/" . . .
我们还将通过绑定到本地环回接口来确保主服务器不会接受来自运行在其他主机上的工作人员的直接连接。 将现有协议行 c['protocols'] = {'pb': {'port': 9989}}
注释掉或替换为以下内容:
/home/buildbot/master/master.cfg
. . . c['protocols'] = {"pb": {"port": "tcp:9989:interface=127.0.0.1"}} . . .
完成后,保存并退出文件。
现在我们正在使用 HTTPS 和域名,我们将安装 service_identity 模块,它提供了确定证书对于预期目的是否有效的工具。
sudo -H pip install service_identity
如果我们跳过这一步,Buildbot 仍然会重新启动,但会发出 UserWarning “您没有安装 service_identity 模块的工作”,这将在 systemd 的 status
命令的输出中可见。
第 3 步 — 重启服务
现在我们准备重启 Nginx:
sudo systemctl restart nginx
由于 systemctl
不提供输出,我们将使用它的 status
命令来确保 Nginx 正在运行。
sudo systemctl status nginx
输出应突出显示“活动:活动(运行)并以如下内容结束:
OutputMay 08 18:07:52 buildbot-server systemd[1]: Started A high performance web server and a reverse proxy server.
接下来,我们将使用 systemctl
重新启动 buildmaster 和 worker,这是我们在 上一教程 中配置的。
首先,检查配置文件是否有语法错误:
sudo buildbot checkconfig /home/buildbot/master/
OutputConfig file is good!
如果没有报错,重启服务:
sudo systemctl restart buildbot-master sudo systemctl status buildbot-master
输出应突出显示“活动:活动(运行)并以如下内容结束:
OutputMay 10 21:28:05 buildbot-server systemd[1]: Started BuildBot master service.
接下来,我们将重新启动worker:
sudo systemctl restart buildbot-worker sudo systemctl status buildbot-worker
同样,输出应突出显示“活动:活动(运行),在这种情况下以类似以下内容结束:
OutputMay 10 21:28:05 buildbot-server systemd[1]: Started BuildBot worker service.
现在我们已经重新启动了 Nginx、buildmaster 和 worker,我们已经准备好验证反向代理是否按预期工作。 当我们通过 http
访问该站点时,我们应该被重定向到 https
并成功到达我们的 Buildbot 站点。
在您的网络浏览器中,输入“http://your.ssl.domain.name”,将您的域替换为 your.ssl.domain.name
。 按 Enter 后,URL 应以 https
开头,并且位置栏应指示连接是安全的。
接下来,我们将花点时间查看 Web Socket 和服务器发送事件是否被正确代理。
首先,访问/sse
目录。 如果重定向正常工作,浏览器应该返回以下页面。 请注意,页面将继续尝试加载,这是正常行为:
接下来,访问 /ws 目录。 如果代理重定向不正确,访问 /ws
目录将返回 404 Not Found
错误。 如果一切正常,浏览器应该返回以下页面:
最后,由于内置 Web 服务器侦听所有接口,我们将删除允许外部流量到端口 8010 的规则,以防止通过 IP 地址访问服务器时未加密的连接:
sudo ufw delete allow 8010
OutputRule updated Rule updated (v6)
我们现在已将 Nginx 配置为反向代理,并阻止用户使用 HTTP
访问 Buildbot。
结论
在本教程中,我们将 Nginx 配置为 Buildbot 内置 Web 服务器的反向代理,以保护通过 Web 界面传输的凭据和其他信息。 如果您是 Buildbot 的新手,您可能想探索 Buildbot 项目的快速浏览 指南。 当您准备好学习如何设置完整的持续集成过程时,请查看我们的 如何在 Ubuntu 16.04 上使用 Buildbot 设置持续集成指南。