如何在Ubuntu16.04上使用Nginx使用SSL保护ConcourseCI
介绍
Concourse CI 是一个现代且可扩展的持续集成系统,旨在使用可组合的声明性语法自动化测试管道。 基于早期 CI 系统的成功,Concourse 旨在简化管道管理并消除“雪花”服务器,以便测试服务器与其处理的代码一样受到监管。
在 上一篇教程 中,我们演示了如何在 Ubuntu 16.04 服务器上安装和配置 Concourse CI 实例。 最后,我们得到了一个持续集成服务器,可以从命令行和 Web 界面进行管理和监控。
在本指南中,我们将通过使用 Nginx 设置 TLS/SSL 反向代理来保护 Concourse CI 接口。 虽然可以将 Concourse 配置为本地使用 SSL,但反向代理为未来的扩展和访问更强大的功能集提供了更大的灵活性。
先决条件
在开始之前,您需要一台 Ubuntu 16.04 服务器 ,至少 1G 内存 。 完成以下指南以设置非 root 用户、安装和配置 Concourse、安装 Nginx 并在服务器上配置 TLS/SSL 连接。 您还需要一个指向您的 Concourse 服务器的 域名 以正确保护它:
- 使用 Ubuntu 16.04 进行初始服务器设置
- 如何在 Ubuntu 16.04 上安装 Concourse CI
- 如何在 Ubuntu 16.04 上安装 Nginx
- 如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Nginx
满足这些先决条件后,您将拥有一个在端口 8080 上运行的 Concourse 服务器。 此外,Nginx 将在端口 80 和 443 上启动并运行。 到端口 80 的流量将被重定向到端口 443,这将对发送到服务器域名的请求的流量进行加密。
当你准备好开始时,继续下面。
将 Nginx 配置为 Concourse 的反向代理
我们需要做的第一件事是修改 SSL 服务器块文件以将流量路由到 Concourse CI 服务器。
找到要编辑的正确文件
由于我们希望我们的 SSL 安全域名服务于 Concourse 接口,我们需要找到当前正在处理我们的域名的服务器块文件。 由于我们只对活动服务器块感兴趣,我们可以使用 grep
在 /etc/nginx/sites-enabled
目录中搜索:
grep -R server_name /etc/nginx/sites-enabled
你可能会看到这样的东西:
Output/etc/nginx/sites-enabled/default: server_name example.com; /etc/nginx/sites-enabled/default: return 301 https://$server_name$request_uri; /etc/nginx/sites-enabled/default: server_name example.com; /etc/nginx/sites-enabled/default:# server_name example.com;
在上面的输出中,域名(在本例中为 example.com
)是在 /etc/nginx/sites-enabled/default
文件中定义的。 您将要编辑与您的域名关联的文件(第一列)。
您可能还会看到如下内容:
Output/etc/nginx/sites-enabled/default: server_name _; /etc/nginx/sites-enabled/default: return 301 https://$server_name$request_uri; /etc/nginx/sites-enabled/default: server_name _; /etc/nginx/sites-enabled/default:# server_name example.com;
上面输出中的 server_name _;
通常是匹配任何不匹配请求的服务器块定义。 如果您找不到与您的域名匹配的 server_name
定义,则应使用类似的文件。
定义大厅服务器块
在文本编辑器中打开定义域的文件以开始:
sudo nano /etc/nginx/sites-enabled/default
为简洁起见删除了注释,如果您正确遵循先决条件部分中的教程,您的文件可能看起来与此类似:
/etc/nginx/sites-enabled/default
server { listen 80 default_server; listen [::]:80 default_server; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name example.com; location / { try_files $uri $uri/ =404; } location ~ /.well-known { allow all; } }
可能会有细微的变化,但这应该是文件的一般结构。 我们可以通过进行两次重要的编辑来调整它以代理到我们的 Concourse 服务器。
首先,在文件的最开始,在 server
块之前,我们将创建一个名为 concourse 的 upstream
块,它定义了我们的 Concourse web 进程如何接受连接。 持续集成服务器接受端口 8080 上的连接。
接下来,通过查找带有字符串 listen 443
的块,找到负责提供 SSL 内容的服务器块。 再次检查该块中定义的 server_name
是否与您的域名匹配(或者如果您在使用 [X186X 搜索时没有找到任何与您的域名匹配的结果,则设置为 server_name _;
])。
在这个服务器块内部,我们需要调整 location /
块,以便 Nginx 将所有请求(未在其他地方明确定义)传递给 Concourse 服务器。 为此,我们将包含来自外部文件的参数,设置一些附加参数,并在将请求传递给我们之前定义的 upstream
之前定义必要的代理标头。
将 location /
块中定义的 try_files
指令替换为以下示例中的行。 完成后,完成的文件应如下所示:
/etc/nginx/sites-enabled/default
upstream concourse { server 127.0.0.1:8080; } server { listen 80 default_server; listen [::]:80 default_server; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name example.com; location / { include proxy_params; proxy_http_version 1.1; proxy_read_timeout 90; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://concourse; } location ~ /.well-known { allow all; } }
完成编辑后,保存并关闭文件。
测试并激活新配置
在使用新配置之前,让 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
如果您看到错误消息而不是上述成功消息,请返回并检查您编辑的文件是否存在错误,然后再继续。
要实现新配置,请重启 Nginx:
sudo systemctl restart nginx
Nginx 现在配置为将您的域名请求转发到 Concourse 服务器。
配置 Concourse 以绑定到本地环回接口
现在 Nginx 已设置为将流量转发到 Concourse 服务器,我们应该限制 Concourse 从哪里接受连接。 目前,Concourse 将在所有接口上接受到端口 8080 的连接,因此用户可以通过直接与集成服务器连接来绕过 SSL 加密。
我们可以通过更改 Concourse Web 配置来修改此行为。 在文本编辑器中打开我们在 /etc/concourse/web_environment
处创建的 web
进程的配置文件:
sudo nano /etc/concourse/web_environment
找到 CONCOURSE_EXTERNAL_URL
参数并更改它以反映用户访问 Concourse Web 界面时应使用的 URL。 这包括由 https://
指定的协议,后跟我们的域名。
然后,将一个名为 CONCOURSE_BIND_IP
的新环境变量设置为 127.0.0.1
。 默认情况下,Concourse 侦听所有接口,但此设置告诉 Concourse 仅绑定到本地接口。 远程连接必须通过 Nginx 代理,它可以强制 SSL:
/etc/concourse/web_environment
. . . CONCOURSE_EXTERNAL_URL=https://example.com CONCOURSE_BIND_IP=127.0.0.1
完成后保存并关闭文件。
重新启动 Concourse web
进程以开始使用新设置:
sudo systemctl restart concourse-web
通过键入以下命令检查 Concourse web
接口是否仅侦听本地环回接口:
sudo netstat -plunt | grep 8080
Outputtcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 20932/concourse
上面的输出表明 Concourse web
进程只监听本地接口。
我们现在可以修改防火墙设置以删除端口 8080 的例外,因为所有外部请求都将通过 Nginx 路由:
sudo ufw delete allow 8080
secondary_label Output] Rule deleted Rule deleted (v6)
现在,我们可以安全地登录 Web 界面了。
测试 Web 界面
在您选择的网络浏览器中,访问您的服务器的域名:
https://example.com
您应该能够访问初始的 Concourse CI 页面:
如果您查看浏览器的地址栏,将会有一些迹象表明您正在通过安全连接连接到集成服务器:
Nginx 保护与浏览器的连接并将请求传递给 Concourse。 现在我们可以安全地连接,可以安全地登录 Web 界面了。
点击右上角的【X20X】登录【X29X】链接,即可登录网页界面。 首先,您将被要求选择您的团队。 main 团队是管理组,默认情况下是唯一可用的选择:
在下一页上,您将被要求输入您的凭据。
输入您在 web_environment
文件中配置的凭据后,您将登录并返回默认占位符界面:
使用 fly
将管道配置提交到服务器后,此屏幕将替换为可以监视管道活动的界面。
结论
在本指南中,我们将 Nginx 配置为 Concourse CI 服务器的安全反向代理。 Nginx 接受来自客户端的安全连接并将请求转发到 Concourse 服务器。 Concourse 绑定到本地环回接口,因此远程客户端无法直接连接。
现在您可以安全地联系 Concourse 服务器,您可以使用 fly
工具和 Web 界面开始构建和管理管道。 您可以按照我们的下一个指南学习 如何开发和实施持续集成管道 为您的项目设置自动测试流程。 您可能还想查看 Concourse 文档 中的 “hello world”示例。