介绍
网页应用程序通常是用三个不同的层架构的:
- 第一层是 presentation layer,这是用户看到的。 _) * 接下来是 application layer,它提供了应用程序的 业务逻辑 。
在 Ruby on Rails 应用程序中,该应用程序可以轻松地地将其地图到演示层的 Web 服务器、应用程序层的 Rails 服务器和数据层的数据库中。
虽然可以在一个服务器上安装所有这些应用程序是可能的,但将每个层放到自己的服务器上可以使应用程序更容易扩展,例如,如果 Rails 服务器成为一个瓶颈,你可以添加更多的应用程序服务器,而不会影响其他两个层。
在本教程中,您将通过在三个单独的服务器上安装一组独特的软件来部署一个 Rails 应用程序,配置每个服务器及其组件以便相互通信和工作,并通过 SSH 隧道确保它们之间的连接。
前提条件
要完成本教程,你需要旋转三个Ubuntu 16.04服务器. 命名这些 web-server, app-server和 database-server,每一个都应该有私人网络启用。
三个服务器中的每一个都应该有一个非 root 用户,具有sudo
特权,以及配置的防火墙,允许SSH ocnnections(您可以使用我们的 初始服务器设置指南进行配置)。
此外,三台服务器中每台都有自己的独特配置要求:
- 联合国 在web-server:
-安装并配置Nginx网络服务器. 要做到这一点,请遵循我们关于[如何在Ubuntu 16.04上安装 Nginx (https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-16-04)的教程。 () (
)* 在app-server:
-使用官方的PPA安装节点.js,如[How To Institut node.js on Ubuntu 16.04] (https://andsky.com/tech/tutorials/how-to-install-node-js-on-ubuntu-16-04#how-to-install-using-a-ppa)所解释. 少数铁路功能,如资产管道,依赖于JavaScript runtime和Node.js提供此功能.
-在铁路上安装Ruby框架. 为此,请遵循我们的指南
如何在铁路上安装Ruby,在Ubuntu 16.04上安装rbenv
(https://andsky.com/tech/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-ubuntu-16-04)。 当您遵循此教程时, 请确定安装最新版本的 Ruby, 在本文撰写时为 Ruby 2.5.1. ()
- 安装 PostgreSQL, 如我们教程的第一部分所显示 [How to use PostgreSQL with your Ruby on Rails application on Ubuntu 14.04] (https://andsky.com/tech/tutorials/how-to-use-postgresql-with-your-ruby-on-rails-application-on-ubuntu-14-04#install-postgresql). 本节还描述了如何安装"libpq-dev",这是这个三级设置需要的另一个软件包.
- 使用Puma部署一个铁路应用程序. 如果您没有自己的应用软件来部署,请遵循我们的指南
如何与美洲豹和Nginx一起部署铁路应用软件
(https://andsky.com/tech/tutorials/how-to-deploy-a-rails-app-with-puma-and-nginx-on-ubuntu-14-04)来部署一个应用样本。 请注意,在此先决条件的"Install rbenv-vars插件"部分,您必须设置数据库用户和密码,以反映您在 ** 数据库-服务器上安装 PostgreSQL 时所使用的值**. 另外,您必须允许3000
端口通过您的防火墙,用于创建生产数据库
部分的工作。 最后,您不需要完成这个先决条件的教程的最后两个步骤,即"创建美洲狮启动脚本"和"安装并配置Nginx"(_). ( )* 在 ** database-server ** - 安装并配置 PostgreSQL 数据库软件. 遵循我们关于 Ubuntu 16.04 上[如何安装和使用 PostgreSQL] (https://andsky.com/tech/tutorials/how-to-install-and-use-postgresql-on-ubuntu-16-04) 的指南,以了解如何做到这一点。 在遵循此先决条件时, 请为您的 Rails 应用程序创建 PostgreSQL 角色, 并带有
超级用户
权限, 以及 PostgreSQL 角色的同名数据库 。 在整个教程中,PostgreSQL的角色和数据库都被称为Sammy. - 为新创建的PostgreSQL角色设置密码. 跳过"[创造出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出 请注意, PostgreSQL 角色的名称和您为 ** 数据库-服务器** 设置的密码应当与您为 ** 应用程序-服务器** 的 PostgreSQL 安装设置的密码相同. (_) (英语)
步骤 1 — 创建 SSH 隧道的用户
_SSH隧道是加密连接,可以将数据从一个服务器上的一个端口发送到另一个服务器上的一个端口,这使它看起来像第二个服务器上的一个听力程序在第一个运行。 拥有一个专用用户的SSH隧道有助于提高您的设置的安全性:如果入侵者获得访问您的服务器中的一个 sammy用户,他们将无法访问其他服务器在三层设置。
在每个服务器上,创建一个名为 tunnel 的额外用户。 tunnel 用户的唯一功能是创建 SSH 隧道以方便服务器之间的通信,所以,与 sammy 不同,不要赋予 tunnel sudo
特权。
1sudo adduser tunnel
在 web-server 机器上,切换到 tunnel 用户。
1[environment second]
2sudo su tunnel
作为 tunnel 用户,生成一个 SSH 密钥对:
1[environment second]
2ssh-keygen
将密钥保存到默认位置,不要为密钥创建密码,因为这样做可能会在您在服务器之间创建 SSH 隧道时更为复杂。
创建密钥对后,返回 sammy用户:
1[environment second]
2exit
现在切换到 app-server,然后再次执行相同的命令:
1[environment third]
2sudo su tunnel
3ssh-keygen
4exit
您现在已经配置了您将需要的所有用户,其余的教程. 网络,您将对每个 tunnel用户的 /etc/hosts
文件进行一些更改,以简化创建 SSH 隧道的过程。
步骤 2 – 配置主机文件
在本教程中,你必须在一个命令中参考应用程序服务器或数据库服务器的IP地址很多次,而不是每次记住并输入这些IP地址,你可以将应用程序服务器和数据库服务器的私人IP添加到每个服务器的/etc/hosts
文件中。
请注意,为了让事情变得简单,本教程指示您将 app-server和 database-server的私人 IP 地址添加到三台服务器上的 /etc/hosts
文件中,虽然在技术上不需要将 app-server或 database-server的私人 IP 地址添加到自己的 hosts
文件中,但这样做不会导致任何问题。
首先,找到您的应用程序服务器和数据库服务器的私人IP地址。如果您正在使用DigitalOcean Droplets,请导航到您的控制面板,然后点击这些 Droplets的名称。
然后在每个服务器上,使用您最喜欢的文本编辑器打开/etc/hosts
文件,并附上以下行:
1sudo nano /etc/hosts
1[label /etc/hosts]
2. . .
3app-server_private_ip app-server
4database-server_private_ip database-server
通过在每个服务器上将这些行添加到此文件中,您可以在命令中使用 app-server和 database-server的名称,这些命令通常会要求您使用这些服务器的IP地址。
步骤 3 – 设置 SSH 登录
现在,您在三个服务器上都有一个 tunnel 用户和一个更新的 `/etc/hosts’ 文件,您已经准备好开始在它们之间创建 SSH 连接。
当你通过这个步骤时,想象三个层像一个金字塔,底部是数据库服务器,中间是应用程序服务器,顶部是 Web 服务器。
因此,您只需要将每个隧道用户的SSH公共密钥添加到服务器下面
,这意味着您必须将网页服务器用户的公共密钥添加到应用服务器中,并将应用服务器用户的公共密钥添加到数据库服务器中。
要开始此过程,请将 tunnel用户的公共密钥复制到位于 /home/tunnel/.ssh/id_rsa.pub
位置的 **web 服务器上的 /home/tunnel/.ssh/authorized_keys
文件中。
在 web-server上,以以下命令在终端中显示 tunnel用户的公共密钥:
1[environment second]
2sudo cat /home/tunnel/.ssh/id_rsa.pub
选择文本输出,并将其复制到系统的剪辑板。
SSH 在单独的终端会话中进入 app-server,然后切换到隧道用户:
1[environment third]
2sudo su tunnel
将系统剪辑板中的密钥附加到 app-server上的autorized_keys
文件中. 您可以使用以下命令在一个步骤内这样做。
1[environment third]
2echo "tunnel_ssh_publickey_copied_from_web-server" >> /home/tunnel/.ssh/authorized_keys
之后,更改autorized_keys
文件的权限,以防止未经授权的访问:
1[environment third]
2chmod 600 /home/tunnel/.ssh/authorized_keys
然后回到 sammy用户:
1[environment third]
2exit
接下来,在应用服务器上显示 tunnel用户的公共密钥 - 位于 /home/tunnel/.ssh/id_rsa.pub
- 并将其粘贴到数据库服务器上的 /home/tunnel/.ssh/authorized_keys
文件中:
1[environment third]
2sudo cat /home/tunnel/.ssh/id_rsa.pub
1[environment fourth]
2sudo su tunnel
由于您没有在数据库服务器上生成一个 SSH 密钥对,您需要创建 `/home/tunnel/.ssh' 文件夹并调整其权限:
1[environment fourth]
2mkdir /home/tunnel/.ssh
3chmod 700 /home/tunnel/.ssh
然后将 app-server的公共密钥添加到autorized_keys
文件中,并调整其权限:
1[environment fourth]
2echo "tunnel_ssh_publickey_copied_from_app-server" >> /home/tunnel/.ssh/authorized_keys
3chmod 600 /home/tunnel/.ssh/authorized_keys
然后回到 sammy用户:
1[environment fourth]
2exit
接下来,使用 SSH 测试第一个连接,以从您的 web-server作为 tunnel用户连接到 app-server:
1[environment second]
2sudo su tunnel
1[environment second]
2ssh tunnel@app-server
当您第一次从 web 服务器连接到 app 服务器时,会看到一个消息,要求您确认您正在连接的机器可以信任。
1[secondary_label Output]
2[environment second]
3The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
4ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
5Are you sure you want to continue connecting (yes/no)? yes
您将看到来自 app-server的欢迎标签,命令提示将显示您已登录到 app-server. 这确认了 web-server到 app-server的SSH连接正常运作。
退出 SSH 连接到 app-server,然后退出 tunnel用户返回您的 web-server的 sammy用户:
1[environment second]
2exit
3exit
接下来,按照这些步骤来测试从 app-server到 database-server的 SSH连接:
1[environment third]
2sudo su tunnel
1[environment third]
2ssh tunnel@database-server
当您看到来自数据库服务器的欢迎栏和命令提示时,您将知道从应用程序服务器到数据库服务器的SSH连接按预期运行。
退出 SSH 连接到 数据库服务器,然后退出 隧道 用户:
1[environment third]
2exit
3exit
您在步骤中设置的 SSH 连接构成了 SSH 隧道的基础,这些隧道将允许您在三层服务器之间进行安全的通信,但在当前的形式中,这些连接容易发生故障,因此它们并不像可能那样可靠。
步骤 4 — 将永久性 SSH 隧道设置到数据库服务器
在最后一步中,您从本地服务器访问了远程服务器上的命令提示。SSH隧道允许您通过将从本地主机上的端口的流量隧道到远程服务器上的端口来做更多的事情。
如果您遵循本教程的所有前提,您将安装PostgreSQL在 app-server和 database-server上。为了防止端口号的碰撞,您必须配置这些服务器之间的SSH隧道,以便将连接从 app-server的端口 5433
转移到 database-server上的端口 `5432。
从 app-server上的 sammy用户开始,切换到您在步骤 1 中创建的 tunnel用户。
1[environment third]
2sudo su tunnel
使用以下旗帜和选项运行ssh
命令,在 app-server和 database-server之间创建隧道:
1[environment third]
2ssh -f -N -L 5433:localhost:5432 tunnel@database-server
-f
选项将 `ssh' 发送到背景中. 这允许您在现有提示中运行新命令,而隧道仍在作为背景流程运行.-N
选项告诉 `ssh' 不要执行远程命令. 此处仅用于转发端口-L
选项随后是配置值5433:localhost:5432
。 这指定了从本地端口5433
( app-server)的流量被转发到远程服务器上的 localhost的端口5432
( database-server)。 请注意,这里的 localhost来自远程服务器的视角- 命令
建立 SSH 隧道后,返回 sammy 用户:
1[environment third]
2exit
此时,隧道正在运行,但没有任何观察它,以确保它站起来. 如果过程崩溃,隧道将崩溃,Rails应用程序将不再能够与其数据库进行通信,您将开始看到错误。
因为连接是在后台,你将不得不找到它的进程ID来杀死它. 因为每个隧道是由 tunnel用户创建的,你可以通过列出当前的进程和过滤输出的关键字tunnel
来找到它的进程ID:
1[environment third]
2ps axu | grep tunnel
这将返回类似于下面的输出:
1[secondary_label Output]
2[environment third]
3tunnel 21814 0.0 0.1 44920 692 ? Ss 14:12 0:00 ssh -f -N -L 5433:localhost:5432 tunnel@database-server
4sammy 21816 0.0 0.2 12916 1092 pts/0 S+ 14:12 0:00 grep --color=auto tunnel
停止进程,运行杀死
命令,然后是其进程 ID:
1[environment third]
2sudo kill 21814
要在应用程序服务器和数据库之间保持持久的 SSH 连接,请安装autossh
。autossh
是一个启动并监控 SSH 连接的程序,并在连接死亡或停止流量时重新启动:
1[environment third]
2sudo apt-get install autossh
[systemd
是Ubuntu上的默认 init system(https://andsky.com/tech/tutorials/understanding-systemd-units-and-unit-files),意思是它在系统启动后管理流程. 您可以使用 systemd
创建一个服务,在服务器重新启动时将管理并自动启动您的 SSH 隧道。 要做到这一点,在 /lib/systemd/system/
目录中创建一个名为 db-tunnel.service
的文件,这是存储 systemd
单元文件的位置标准:
1[environment third]
2sudo nano /lib/systemd/system/db-tunnel.service
将以下内容添加到新文件中,以配置systemd
来管理的服务:
1[label /lib/systemd/system/db-tunnel.service]
2
3[Unit]
4Wants=network-online.target
5After=network-online.target
6
7[Service]
8User=tunnel
9WorkingDirectory=/home/tunnel
10ExecStart=/bin/bash -lc 'autossh -N -L 5433:localhost:5432 tunnel@database-server'
11Restart=always
12StandardInput=null
13StandardOutput=syslog
14StandardError=syslog
15SyslogIdentifier=%n
16KillMode=process
17
18[Install]
19WantedBy=multi-user.target
这里的关键行是ExecStart
。这指定了指令的完整路径和它需要执行的参数,以便开始流程。
保存并关闭文件,然后重新加载systemd
配置以确保它收集新服务文件:
1[environment third]
2sudo systemctl daemon-reload
启用db-tunnel
服务,以便在服务器启动时自动启动到数据库服务器的隧道:
1[environment third]
2sudo systemctl enable db-tunnel.service
然后,开始服务:
1[environment third]
2sudo systemctl start db-tunnel.service
再次运行以下命令,检查隧道是否已打开:
1[environment third]
2ps axu | grep tunnel
在输出中,你会看到这一次有更多的流程正在运行,因为autossh
现在正在监控隧道:
1[secondary_label Output]
2[environment third]
3tunnel 25925 0.0 0.1 4376 704 ? Ss 14:45 0:00 /usr/lib/autossh/autossh -N -L 5432:localhost:5432 tunnel@database-server
4tunnel 25939 0.2 1.0 44920 5332 ? S 14:45 0:00 /usr/bin/ssh -L 61371:127.0.0.1:61371 -R 61371:127.0.0.1:61372 -N -L 5432:localhost:5432 tunnel@database-server
5sammy 25941 0.0 0.2 12916 1020 pts/0 S+ 14:45 0:00 grep --color=auto tunnel
现在隧道已启动并运行,您可以使用psql
测试与数据库服务器的连接,以确保它正常工作。
启动psql
客户端并告诉它连接到localhost
。您还必须指定端口5433
,通过SSH隧道连接到数据库服务器**上的PostgreSQL实例。
1[environment third]
2psql -hlocalhost -p5433 sammy
如果您看到如下输出,则数据库连接已设置正确:
1[secondary_label Output]
2[environment third]
3psql (9.5.10)
4SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
5Type "help" for help.
6
7sammy=#
要关闭 PostgreSQL 提示,请键入 \q
,然后按ENTER
。
最后,你有一个持久的,可靠的SSH隧道,它会加密你的应用服务器和数据库服务器之间的流量,该隧道的安全功能是关键,因为在这个隧道上,你的应用程序服务器上的Rails应用程序将与你的数据库服务器上的PostgreSQL实例进行通信。
步骤 5 — 配置铁路以使用远程数据库
现在已经设置了从 app-server到 database-server的隧道,您可以使用它作为您的 Rails 应用程序通过隧道连接到 database-server上的 PostgreSQL 实例的安全渠道。
打开应用程序的数据库配置文件:
1[environment third]
2nano /home/sammy/appname/config/database.yml
更新生产
部分,以便将端口号指定为环境变量。
1[label /home/sammy/appname/config/database.yml]
2. . .
3production:
4 <<: *default
5 host: localhost
6 adapter: postgresql
7 encoding: utf8
8 database: appname_production
9 pool: 5
10 username: <%= ENV['APPNAME_DATABASE_USER'] %>
11 password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>
12 port: <%= ENV['APPNAME_DATABASE_PORT'] %>
保存并关闭此文件,然后在应用程序目录中打开 .rbenv-vars
文件并编辑环境变量:
1[environment third]
2nano /home/sammy/appname/.rbenv-vars
如果您在数据库服务器上为 PostgreSQL 角色设置了不同的名称和密码,请现在更换它们(在下面的示例中,PostgreSQL 角色被命名为 sammy)。
1[label /home/sammy/appname/.rbenv-vars]
2
3SECRET_KEY_BASE=secret_key_base
4APPNAME_DATABASE_USER=sammy
5APPNAME_DATABASE_PASSWORD=database_password
6APPNAME_DATABASE_PORT=5433
保存并关闭此文件完成后。
由于您现在正在使用数据库服务器上的 PostgreSQL 实例,而不是您部署 Rails 应用程序的应用程序服务器上的实例,您将不得不重新设置数据库。
在 app-server上,导航到您的应用程序目录并运行rake
命令来设置数据库:
<$>[注] 注: 此命令不会将任何数据从现有数据库迁移到新数据库。
1[environment third]
2cd /home/sammy/appname
3rake db:setup
一旦此命令完成,您的 Rails 应用程序将开始通过加密的 SSH 隧道与数据库服务器上的 PostgreSQL 实例进行通信。
步骤 6 – 配置和启动 Puma
类似于您在步骤 4 中设置db-tunnel
服务的方式,您将配置systemd
以运行 Puma(您在 app-server上安装的服务器软件作为先决条件的一部分)作为服务。
在 /lib/systemd/system/
目录中创建一个名为 puma.service
的新文件:
1[environment third]
2sudo nano /lib/systemd/system/puma.service
请确保在用户
、WorkingDirectory
和ExecStart
指令中更新突出的值,以反映您自己的配置:
1[label /lib/systemd/system/puma.service]
2
3[Unit]
4Description=Puma HTTP Server
5After=network.target
6
7[Service]
8# Foreground process (do not use --daemon in ExecStart or config.rb)
9Type=simple
10
11# Preferably configure a non-privileged user
12User=sammy
13
14# The path to the puma application root
15# Also replace the "<WD>" place holders below with this path.
16WorkingDirectory=/home/sammy/appname
17
18# Helpful for debugging socket activation, etc.
19# Environment=PUMA_DEBUG=1
20
21Environment=RAILS_ENV=production
22
23# The command to start Puma.
24ExecStart=/home/sammy/.rbenv/bin/rbenv exec bundle exec puma -b tcp://127.0.0.1:9292
25
26Restart=always
27
28[Install]
29WantedBy=multi-user.target
然后重新加载systemd
,启用Puma服务,并启动Puma:
1[environment third]
2sudo systemctl daemon-reload
3sudo systemctl enable puma.service
4sudo systemctl start puma.service
此后,通过检查服务的状态来确认Puma正在运行:
1[environment third]
2sudo systemctl status puma.service
如果运行,您将看到类似于此的输出:
1[secondary_label Output]
2[environment third]
3puma.service - Puma HTTP Server
4 Loaded: loaded (/lib/systemd/system/puma.service; enabled; vendor preset: enabled)
5 Active: active (running) since Tue 2017-12-26 05:35:50 UTC; 1s ago
6 Main PID: 15051 (bundle)
7 Tasks: 2
8 Memory: 31.4M
9 CPU: 1.685s
10 CGroup: /system.slice/puma.service
11 └─15051 puma 3.11.0 (tcp://127.0.0.1:9292) [appname]
12
13Dec 26 05:35:50 app systemd[1]: Stopped Puma HTTP Server.
14Dec 26 05:35:50 app systemd[1]: Started Puma HTTP Server.
15Dec 26 05:35:51 app rbenv[15051]: Puma starting in single mode...
16Dec 26 05:35:51 app rbenv[15051]: * Version 3.11.0 (ruby 2.4.3-p205), codename: Love Song
17Dec 26 05:35:51 app rbenv[15051]: * Min threads: 5, max threads: 5
18Dec 26 05:35:51 app rbenv[15051]: * Environment: production
接下来,使用‘curl’来访问和打印网页的内容,以便您可以检查它是否正在被正确地服务。以下命令告诉‘curl’访问您刚刚在 app-server上启动的Puma服务器在端口 9292
:
1[environment third]
2curl localhost:9292/tasks
如果您看到以下类似的代码,则证实Puma和数据库连接都正常工作:
1[secondary_label Output]
2[environment third]
3...
4
5<h1>Tasks</h1>
6
7<table>
8 <thead>
9 <tr>
10 <th>Title</th>
11 <th>Note</th>
12 <th colspan="3"></th>
13 </tr>
14 </thead>
15
16 <tbody>
17 </tbody>
18</table>
19
20...
一旦您可以确认您的 Rails 应用程序是由 Puma 提供的,并且已正确配置为在 database-server上使用远程 PostgreSQL 实例,您可以继续在 web-server和 app-server之间设置 SSH 隧道。
步骤 7 — 设置并坚持 SSH 隧道到应用服务器
现在 app 服务器已启动并运行,您可以将其连接到 web 服务器。类似于您在步骤 4 中所经历的过程,您将通过设置另一个 SSH 隧道来完成此操作。
首先,在 web-server上安装autossh
:
1[environment second]
2sudo apt-get install autossh
在 /lib/systemd/system/
目录中创建一个名为 app-tunnel.service
的新文件:
1[environment second]
2sudo nano /lib/systemd/system/app-tunnel.service
再次,关键行是以ExecStart
开头的关键行,在这里,该行将网页服务器上的端口9292
转移到Puma正在收听的应用服务器上的端口9292
:
1[label /lib/systemd/system/app-tunnel.service]
2
3[Unit]
4StopWhenUnneeded=true
5Wants=network-online.target
6After=network-online.target
7
8[Service]
9User=tunnel
10WorkingDirectory=/home/tunnel
11ExecStart=/bin/bash -lc 'autossh -N -L 9292:localhost:9292 tunnel@app-server'
12Restart=always
13StandardInput=null
14StandardOutput=syslog
15StandardError=syslog
16SyslogIdentifier=%n
17KillMode=process
18
19[Install]
20WantedBy=multi-user.target
<$>[注]
**注:**在ExecStart
行中的端口号与上一步对 Puma 配置的端口号相同。
重新加载systemd
,以便读取新服务文件,然后启用并启动app-tunnel
服务:
1[environment second]
2sudo systemctl daemon-reload
3sudo systemctl enable app-tunnel.service
4sudo systemctl start app-tunnel.service
检查隧道是否已登陆:
1[environment second]
2ps axu | grep tunnel
你应该看到一些类似于下面的输出:
1[secondary_label Output]
2[environment second]
3tunnel 19469 0.0 0.1 4376 752 ? Ss 05:45 0:00 /usr/lib/autossh/autossh -N -L 9292:localhost:9292 tunnel@app-server
4tunnel 19482 0.5 1.1 44920 5568 ? S 05:45 0:00 /usr/bin/ssh -L 54907:127.0.0.1:54907 -R 54907:127.0.0.1:54908 -N -L 9292:localhost:9292 tunnel@app-server
5sammy 19484 0.0 0.1 12916 932 pts/0 S+ 05:45 0:00 grep --color=auto tunnel
此过滤流程列表显示autossh
正在运行,并启动了另一个ssh
流程,在 web-server和 app-server之间创建了实际加密隧道。
您的第二条隧道现在已经启动并加密您的 web-server和 app-server之间的通信,您只需要为实现并运行您的三层 Rails 应用程序配置 Nginx 来向 Puma 传输请求。
步骤 8 – 配置 Nginx
在此时,所有所需的SSH连接和隧道已经设置,您的三个服务器层的每一个都可以彼此通信。 这个拼图的最后一部分是为您配置 Nginx 发送请求到Puma,使设置完全功能。
在 web-server上,创建一个新的 Nginx 配置文件在 /etc/nginx/sites-available/appname
:
1[environment second]
2sudo nano /etc/nginx/sites-available/appname
此 Nginx 配置文件类似于您在 如何使用 Puma 和 Nginx 部署 Rails 应用程序上的指导下使用的配置文件。主要区别在于上游应用程序的位置;而不是使用本地接口文件,此配置指向 Nginx 到 SSH 隧道上听到端口 9292
:
1[label /etc/nginx/sites-available/appname]
2upstream app {
3 server 127.0.0.1:9292;
4}
5
6server {
7 listen 80;
8 server_name localhost;
9
10 root /home/sammy/appname/public;
11
12 try_files $uri/index.html $uri @app;
13
14 location @app {
15 proxy_pass http://app;
16 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
17 proxy_set_header Host $http_host;
18 proxy_redirect off;
19 }
20
21 error_page 500 502 503 504 /500.html;
22 client_max_body_size 4G;
23 keepalive_timeout 10;
24}
保存并关闭此文件,然后启用网站并激活更改。
首先,删除默认网站:
1[environment second]
2sudo rm /etc/nginx/sites-enabled/default
更改到 Nginx sites-enabled
目录:
1[environment second]
2cd /etc/nginx/sites-enabled
在网站启用
目录中创建一个 _symbolic 链接到您刚刚在网站可用
目录中创建的文件:
1[environment second]
2sudo ln -s /etc/nginx/sites-available/appname appname
测试您的 Nginx 配置以检测语法错误:
1[environment second]
2sudo nginx -t
如果报告了任何错误,请返回并检查您的文件,然后继续。
当你准备好时,重新启动 Nginx,以便读取你的新配置:
1[environment second]
2sudo systemctl restart nginx
如果你在前提条件中遵循了Puma教程,你会在 app-server上安装 Nginx 和 PostgreSQL. 两者都被在其他两个服务器上运行的单独实例所取代,所以这些程序是多余的。
1[environment third]
2sudo apt remove nginx
3sudo apt remove postgresql
删除这些包后,请确保更新防火墙规则,以防止任何不必要的流量访问这些端口。
您的 Rails 应用程序现在正在生产中. 在 Web 浏览器中访问您的 web 服务器的公共 IP 以查看它在行动:
1http://web-server_public_IP/tasks
结论
通过遵循本教程,您已经在三层架构上部署了 Rails 应用程序,并通过加密的 SSH 隧道保护了从 web 服务器到 app 服务器的连接,并从 app 服务器到 database 服务器。
通过在单独的服务器上配置应用程序的各个组件,您可以根据您的网站接收的流量选择每个服务器的最佳规格。 这样做的第一步是监控服务器所消耗的资源。 请参阅 我们关于 CPU 监控的指南 有关如何监控服务器的 CPU 使用的说明。 如果您看到某一层的 CPU 或内存使用量非常高,您可以单独调整服务器的尺寸。 有关选择服务器尺寸的更多建议,请参阅我们的指南。
作为下一步的立即步骤,您还应该通过在web服务器上安装SSL证书来确保用户的连接到web服务器**。 查看 Nginx Let's Encrypt 教程以获取说明。