如何使用Nginx反向代理配置带有SSL的Buildbot

来自菜鸟教程
跳转至:导航、​搜索

注意:本教程涵盖了旧版本的 Buildbot,因此说明可能不适用于当前版本。 在本文更新之前,您可以额外使用官方Buildbot反向代理配置文档


介绍

Buildbot 是一个基于 Python 的持续集成系统,用于自动化软件构建、测试和发布过程。 在之前的教程中,我们 安装了 Buildbot创建了 systemd 单元文件 以允许服务器的 init 系统管理进程。 Buildbot 带有自己的内置 Web 服务器,侦听端口 8010,为了使用 SSL 保护 Web 界面,我们需要配置反向代理。

在本教程中,我们将演示如何将 Nginx 配置为反向代理,以便将受 SSL 保护的浏览器请求定向到 Buildbot 的 Web 界面。

先决条件

要遵循本教程,您将需要:

此外,您还需要在服务器上完成以下教程:

完成这些要求后,您就可以开始了。

第 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 off proxy_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 设置持续集成指南。