分类
文章

使用ssh隧道保护通信三层rails应用程序

介绍

Web应用程序通常由三个不同的层构成:

  • 第一层是presentation layer ,即用户看到的内容。
  • 接下来是application layer ,它提供application layer业务逻辑
  • 最后, data layer存储应用程序所需的数据。

Ruby on Rails应用程序中,它宽松地映射到表示层的Web服务器,应用程序层的Rails服务器和数据层的数据库。在此设置中,应用程序层与数据层通信以检索该应用程序的数据,然后通过表示层将其显示给用户。

尽管可以将所有这些应用程序安装在单个服务器上,但将每个层放置在其自己的服务器上可以更轻松地扩展应用程序。例如,如果要使Rails服务器成为瓶颈,则可以添加更多应用程序服务器,而不会影响其他两层。

在本教程中,您将通过在三台单独的服务器上安装一套独特的软件,将每台服务器及其组件配置为可以相互通信和运行,并使用SSH隧道保护它们之间的连接,来在三层配置中部署Rails应用程序。对于软件堆栈,您将使用Nginx作为表示层上的Web服务器,使用Puma作为应用程序层上的Rails应用程序服务器,并使用PostgreSQL作为数据层上的数据库。

先决条件

为了完成本教程,您将需要启动三个Ubuntu 16.04服务器。将这些命名为web-serverapp-serverdatabase-server ,并且每个都应启用”专用网络”。

这三台服务器中的每台服务器都应具有一个具有sudo特权的非root用户,以及一个配置为允许SSH连接的防火墙(您可以使用《 初始服务器安装指南》进行配置)。在本教程的上下文中,每台服务器上的sudo用户名为sammy

此外,三台服务器中的每台服务器都有自己独特的配置要求:

  • web-server :

  • app-server :

    • 使用官方PPA安装Node.js,如如何在Ubuntu 16.04上安装Node.js所述 。一些Rails功能(例如Asset Pipeline)取决于JavaScript运行时,Node.js提供了此功能。
    • 安装Ruby on Rails框架。为此,请遵循有关如何在Ubuntu 16.04上使用rbenv安装Ruby on Rails的指南 。在学习本教程时,请确保安装最新版本的Ruby,在撰写本文时,该版本为Ruby 2.5.1。
    • 如我们的教程的第一部分所示如何安装PostgreSQL, 如何在Ubuntu 14.04上的Ruby on Rails应用程序中使用PostgreSQL 。本节还介绍了如何安装libpq-dev ,这是此三层设置所需的另一个软件包。
    • 使用Puma部署Rails应用程序。如果您没有自己的应用程序要部署,请遵循我们的如何通过Puma和Nginx部署Rails应用程序的指南来部署示例应用程序。请注意,在此先决条件的”安装rbenv-vars插件”部分中,必须设置数据库用户和密码,以反映在database-server上安装PostgreSQL时使用的值。另外,您必须允许防火墙通过端口3000 ,以使”创建生产数据库”部分起作用。最后,您不需要完成本必备教程的最后两个步骤,即”创建Puma Upstart脚本”和”安装并配置Nginx”。
  • database-server :

    • 安装和配置PostgreSQL数据库软件。请遵循我们的有关如何在Ubuntu 16.04上安装和使用PostgreSQL的指南,以获取有关如何执行此操作的说明。当您遵循此先决条件教程时,请为具有superuser权限的Rails应用程序创建一个PostgreSQL角色,以及一个与PostgreSQL角色同名的数据库。在本教程中,PostgreSQL角色和数据库都称为sammy
    • 为新创建的PostgreSQL角色设置密码。跳过Puma教程的” 创建生产数据库用户 “部分中的第一个命令(您也用于设置app-server ),然后按照该部分中的其余命令更改数据库用户的密码。请注意,PostgreSQL角色的名称和您为database-server设置的密码应与在app-server的PostgreSQL安装上设置的名称和密码相同。

第1步-为SSH隧道创建用户

SSH tunnels是加密连接,可以将数据从一台服务器上的端口发送到另一台服务器上的端口,从而使第二台服务器上的侦听程序看起来像在第一台服务器上运行。拥有专用于SSH隧道的用户有助于提高设置的安全性:如果入侵者可以访问其中一台服务器上的sammy用户,则他们将无法访问三层设置中的其他服务器。同样,如果入侵者要获得对tunnel用户的访问权限,他们将既不能编辑Rails应用程序目录中的文件,也不能使用sudo命令。

在每台服务器上,创建一个名为tunnel的附加用户。tunnel用户的唯一功能是创建SSH隧道以促进服务器之间的通信,因此,与sammy不同,它不赋予tunnel sudo特权。此外, tunnel用户不应具有对Rails应用程序目录的写访问权。在每台服务器上运行以下命令以添加tunnel用户:

  • sudo adduser tunnel

web-server计算机上,切换到tunnel用户。

  • sudo su tunnel

作为tunnel用户,生成SSH密钥对:

  • ssh-keygen

将密钥保存在默认位置,不要为密钥创建密码,因为这样做会在以后在服务器之间创建SSH隧道时使身份验证复杂化。

创建密钥对之后,请返回给sammy用户:

  • exit

现在切换到app-server并再次执行相同的命令:

  • sudo su tunnel
  • ssh-keygen
  • exit

现在,您已经配置了本教程其余部分所需的所有用户。净,您将为每个tunnel用户对/etc/hosts文件进行一些更改,以简化创建SSH隧道的过程。

第2步-配置主机文件

在本教程中,很多时候您必须在命令中引用app-serverdatabase-server的IP地址。您可以不必将app-serverdatabase-server的专用IP添加到每个服务器的/etc/hosts文件中,而不必每次都记住并键入这些IP地址。这将允许您在后续命令中使用其名称来代替其地址,并使设置SSH隧道的过程更加顺畅。

请注意,为了简化操作,本教程指示您将app-serverdatabase-server的专用IP地址都添加到三个服务器中每个服务器的/etc/hosts文件中。从技术上讲,没有必要将app-serverdatabase-server的专用IP地址添加到其自己的hosts文件中,但这不会引起任何问题。选择此处描述的方法只是为了提高速度和便利性。

首先,找到您的app-serverdatabase-server的专用IP地址。如果您使用的是DigitalOcean Droplet,请导航至”控制面板”,然后单击这些Droplet的名称。在其任何特定于Droplet的页面上,公共IP地址和私有IP地址都显示在页面顶部附近。

然后在每台服务器上,使用您喜欢的文本编辑器打开/etc/hosts文件,并添加以下行:

  • sudo nano /etc/hosts
/etc/hosts
. . .
app-server_private_ip app-server
database-server_private_ip database-server

通过将这些行添加到每台服务器上的此文件中,可以在通常要求您使用这些服务器的IP地址的命令中使用名称app-serverdatabase-server 。您将使用此功能来设置SSH密钥,以便每个tunnel用户都可以连接到其他服务器。

步骤3 —设置SSH登录

既然您在所有三台服务器上都有一个tunnel用户和一个更新的/etc/hosts文件,您就可以开始在它们之间创建SSH连接了。

在执行此步骤时,请像金字塔一样思考这三层,其中database-server位于底部, app-server位于中间, web-server位于顶部。app-server必须能够连接到database-server ,以便访问Rails应用程序所需的数据,并且web-server必须能够连接到app-server以便它可以呈现给用户。

因此,你只需要每增加tunnel用户的SSH公共密钥服务器”下”了,这意味着你必须添加web-server tunnel用户的公钥来对app-server和添加app-server tunnel用户的公钥database-server 。这将允许您在各层之间建立加密的SSH隧道,并防止网络上的任何窃听者读取在它们之间传递的流量。

要开始此过程,请将位于/home/tunnel/.ssh/id_rsa.pubweb-server上的tunnel用户的公钥复制到app-server上的/home/tunnel/.ssh/authorized_keys文件中。

web-server ,使用以下命令在终端中显示tunnel用户的公钥:

  • sudo cat /home/tunnel/.ssh/id_rsa.pub

选择文本输出并将其复制到系统的剪贴板中。

在单独的终端会话中通过SSH进入app-server ,然后切换到隧道用户:

  • sudo su tunnel

将系统剪贴板中的密钥添加到app-server上的authorized_keys文件中。您可以使用以下命令一步来执行此操作。切记用系统剪贴板中的公钥替换tunnel_ssh_publickey_copied_from_web_server :

  • echo "tunnel_ssh_publickey_copied_from_web-server" >> /home/tunnel/.ssh/authorized_keys

之后,修改对authorized_keys文件的权限,以防止未经授权的访问:

  • chmod 600 /home/tunnel/.ssh/authorized_keys

然后返回给sammy用户:

  • exit

接下来,在app-server上显示tunnel用户的公钥(位于/home/tunnel/.ssh/id_rsa.pub ),并将其粘贴到database-server上的/home/tunnel/.ssh/authorized_keys文件中:

  • sudo cat /home/tunnel/.ssh/id_rsa.pub
  • sudo su tunnel

因为您没有在database-server上生成SSH密钥对,所以必须创建/home/tunnel/.ssh文件夹并调整其权限:

  • mkdir /home/tunnel/.ssh
  • chmod 700 /home/tunnel/.ssh

然后,将app-server的公钥添加到authorized_keys文件中,并调整其权限:

  • echo "tunnel_ssh_publickey_copied_from_app-server" >> /home/tunnel/.ssh/authorized_keys
  • chmod 600 /home/tunnel/.ssh/authorized_keys

然后返回给sammy用户:

  • exit

接下来,通过使用SSH作为tunnel用户从web-server连接到app-server来测试第一个连接:

  • sudo su tunnel
  • ssh tunnel@app-server

首次从web-server连接到app-server ,您将看到一条消息,要求您确认所连接的计算机可以信任。输入”是”以接受app-server的真实性:

OutputThe authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

您将从app-server看到欢迎横幅,命令提示符将显示您已登录到app-server 。这确认从web-serverapp-server的SSH连接正常运行。

从SSH连接退出到app-server ,然后从tunnel用户退出以返回到web-serversammy用户:

  • exit
  • exit

接下来,按照以下相同步骤测试从app-serverdatabase-server的SSH连接:

  • sudo su tunnel
  • ssh tunnel@database-server

也接受database-server的真实性。当您从database-server看到欢迎标语和命令提示符时,您将知道从app-serverdatabase-server的SSH连接正在按预期方式工作。

从SSH连接到database-server退出,然后从tunnel用户退出:

  • exit
  • exit

您在该步骤中设置的SSH连接构成了SSH隧道的基础,该SSH隧道将在三个服务器层之间实现安全通信。但是,按照目前的形式,这些连接容易崩溃,因此它们的可靠性不尽如人意。但是,通过安装一些其他软件并配置隧道以使其充当服务,您可以缓解这些漏洞。

步骤4 —设置到数据库服务器的持久SSH隧道

在最后一步中,您从本地服务器访问远程服务器上的命令提示符。SSH隧道通过将流量从本地主机上的端口传输到远程主机上的端口,使您可以做更多的事情。在这里,您将使用SSH隧道来加密您的app-serverdatabase-server之间的连接。

如果遵循了本教程的所有先决条件,那么您将在app-serverdatabase-server上都安装了PostgreSQL。为防止端口号冲突,必须在这些服务器之间配置SSH隧道,以将连接从app-server端口5433转发到database-server端口5432 。稍后,您将重新配置Rails应用程序(托管在您的app-server )以使用在database-server上运行的PostgreSQL实例。

app-server上的sammy用户开始,切换到您在步骤1中创建的tunnel用户:

  • sudo su tunnel

使用以下标志和选项运行ssh命令,以在app-serverdatabase-server之间创建隧道:

  • ssh -f -N -L 5433:localhost:5432 tunnel@database-server
  • -f选项将ssh发送到后台。这样,当隧道继续作为后台进程运行时,您可以在现有提示中运行新命令。
  • -N选项告诉ssh不要执行远程命令。在这里使用它是因为您只想转发端口。
  • -L选项后跟配置值5433:localhost:5432 。这指定将来自本地端( app-server )的端口5433流量转发到远程服务器( database-server )上的localhost的端口5432 。请注意,此处的localhost是从远程服务器的角度来看的。
  • 命令的最后一部分tunnel@database-server指定要连接的用户和远程服务器。

建立SSH隧道后,返回给sammy用户:

  • exit

此时,隧道正在运行,但是没有人在观察它以确保其停滞。如果进程崩溃,隧道将关闭,Rails应用程序将不再能够与其数据库通信,并且您将开始看到错误。

销毁您现在创建的隧道,因为我们将进行更可靠的设置。由于连接处于后台,因此您必须找到其进程ID才能将其杀死。因为每个隧道都是由tunnel用户创建的,所以您可以通过列出当前进程并过滤关键字” tunnel”的输出来找到其进程ID:

  • ps axu | grep tunnel

这将返回类似下面的输出:

Outputtunnel   21814  0.0  0.1  44920   692 ?        Ss   14:12   0:00 ssh -f -N -L 5433:localhost:5432 tunnel@database-server
sammy    21816  0.0  0.2  12916  1092 pts/0    S+   14:12   0:00 grep --color=auto tunnel

通过运行kill命令和其进程ID来停止该进程:

  • sudo kill 21814

要在应用程序服务器和数据库之间维持持久的SSH连接,请安装autosshautossh是一个程序,用于启动和监视SSH连接,并在连接终止或停止通过流量时重新启动它:

  • sudo apt-get install autossh

systemd是Ubuntu上的默认init system ,这意味着它在系统启动后管理进程。您可以使用systemd创建服务,该服务将在服务器重新启动时管理并自动启动SSH隧道。为此,请在/lib/systemd/system/目录中创建一个名为db-tunnel.service的文件,该目录是存储systemd单位文件的标准位置:

  • sudo nano /lib/systemd/system/db-tunnel.service

将以下内容添加到新文件中,以配置供systemd管理的服务:

/lib/systemd/system/db-tunnel.service

[Unit]
Wants=network-online.target
After=network-online.target
[Service]
User=tunnel
WorkingDirectory=/home/tunnel
ExecStart=/bin/bash -lc 'autossh -N -L 5433:localhost:5432 tunnel@database-server'
Restart=always
StandardInput=null
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=%n
KillMode=process
[Install]
WantedBy=multi-user.target

关键是ExecStart 。这指定了命令的完整路径以及启动该过程所需执行的参数。在这里,它将启动一个新的bash shell,然后运行autossh程序。

保存并关闭文件,然后重新加载systemd配置,以确保它获取了新的服务文件:

  • sudo systemctl daemon-reload

启用db-tunnel服务,以便在database-server启动时自动启动到database-server的隧道:

  • sudo systemctl enable db-tunnel.service

然后,启动服务:

  • sudo systemctl start db-tunnel.service

再次运行以下命令以检查隧道是否已启动:

  • ps axu | grep tunnel

在输出中,您将看到这次运行的进程更多,因为autossh现在正在监视隧道:

Outputtunnel   25925  0.0  0.1   4376   704 ?        Ss   14:45   0:00 /usr/lib/autossh/autossh -N -L 5432:localhost:5432 tunnel@database-server
tunnel   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
sammy    25941  0.0  0.2  12916  1020 pts/0    S+   14:45   0:00 grep --color=auto tunnel

现在,隧道已启动并正在运行,您可以使用psql测试与database-server的连接,以确保其正常工作。

启动psql客户端,并告诉它连接到localhost 。您还必须指定端口5433以通过SSH隧道连接到database-server上的PostgreSQL实例。指定您先前创建的数据库名称,并在出现提示时键入您为数据库用户创建的密码:

  • psql -hlocalhost -p5433 sammy

如果看到类似以下输出的信息,则说明数据库连接已正确设置:

Outputpsql (9.5.10)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
sammy=#

要关闭PostgreSQL提示符,请键入q ,然后按ENTER

最后,您将拥有一个持久,可靠的SSH隧道,该隧道对您的app-serverdatabase-server之间的通信进行加密。隧道的安全功能是关键,因为app-server上的Rails应用将通过该隧道与database-server上的PostgreSQL实例进行通信。

步骤5 —配置Rails以使用远程数据库

现在已经建立了从app-serverdatabase-server的隧道,您可以将其用作Rails应用程序通过隧道连接到database-server上PostgreSQL实例的安全通道。

打开应用程序的数据库配置文件:

  • nano /home/sammy/appname/config/database.yml

更新production部分,以便将端口号指定为环境变量。现在看起来应该像这样:

/home/sammy/appname/config/database.yml
. . .
production:
  <<: *default
  host: localhost
  adapter: postgresql
  encoding: utf8
  database: appname_production
  pool: 5
  username: <%= ENV['APPNAME_DATABASE_USER'] %>
  password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>
  port: <%= ENV['APPNAME_DATABASE_PORT'] %>

保存并关闭此文件,然后在应用程序目录中打开.rbenv-vars文件并编辑环境变量:

  • nano /home/sammy/appname/.rbenv-vars

如果您在database-server上为PostgreSQL角色设置了其他名称和密码,请立即替换它们(在下面的示例中,PostgreSQL角色名为sammy )。另外,添加新行以指定数据库端口。进行这些更改之后,您的.rbenv-vars文件应如下所示:

/home/sammy/appname/.rbenv-vars

SECRET_KEY_BASE=secret_key_base
APPNAME_DATABASE_USER=sammy
APPNAME_DATABASE_PASSWORD=database_password
APPNAME_DATABASE_PORT=5433

完成后保存并关闭此文件。

因为您现在正在database-server上使用PostgreSQL实例,而不是在您部署Rails应用程序的app-server上使用PostgreSQL实例,所以您将不得不重新设置数据库。

app-server ,导航到您的应用程序目录,然后运行rake命令来设置数据库:

Note:此命令not将任何数据从现有数据库迁移到新数据库。如果您的数据库中已经有重要数据,则应备份它,然后再将其还原。

  • cd /home/sammy/appname
  • rake db:setup

该命令完成后,您的Rails应用将开始通过加密的SSH隧道与database-server上的PostgreSQL实例进行通信。接下来要做的是将Puma配置为systemd服务,以便于管理。

步骤6 —配置和启动Puma

与在步骤4中设置db-tunnel服务的方式类似,您将配置systemd以运行Puma(作为必备软件的一部分安装在app-server上的服务器软件)作为服务。将Puma作为服务运行可以使它在服务器启动时自动启动,或者在服务器崩溃时自动重新启动,从而使您的部署更强大。

/lib/systemd/system/目录中创建一个名为puma.service的新文件:

  • sudo nano /lib/systemd/system/puma.service

将以下内容(从Puma的systemd文档改编而成)添加到新文件中。确保更新UserWorkingDirectoryExecStart指令中突出显示的值以反映您自己的配置:

/lib/systemd/system/puma.service

[Unit]
Description=Puma HTTP Server
After=network.target
[Service]
# Foreground process (do not use --daemon in ExecStart or config.rb)
Type=simple
# Preferably configure a non-privileged user
User=sammy
# The path to the puma application root
# Also replace the "<WD>" place holders below with this path.
WorkingDirectory=/home/sammy/appname
# Helpful for debugging socket activation, etc.
# Environment=PUMA_DEBUG=1
Environment=RAILS_ENV=production
# The command to start Puma.
ExecStart=/home/sammy/.rbenv/bin/rbenv exec bundle exec puma -b tcp://127.0.0.1:9292
Restart=always
[Install]
WantedBy=multi-user.target

保存并关闭文件。然后重新加载systemd ,启用Puma服务,然后启动Puma:

  • sudo systemctl daemon-reload
  • sudo systemctl enable puma.service
  • sudo systemctl start puma.service

之后,通过检查服务状态来确认Puma正在运行:

  • sudo systemctl status puma.service

如果它正在运行,您将看到类似于以下的输出:

Outputpuma.service - Puma HTTP Server
   Loaded: loaded (/lib/systemd/system/puma.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-12-26 05:35:50 UTC; 1s ago
 Main PID: 15051 (bundle)
    Tasks: 2
   Memory: 31.4M
      CPU: 1.685s
   CGroup: /system.slice/puma.service
           └─15051 puma 3.11.0 (tcp://127.0.0.1:9292) [appname]
Dec 26 05:35:50 app systemd[1]: Stopped Puma HTTP Server.
Dec 26 05:35:50 app systemd[1]: Started Puma HTTP Server.
Dec 26 05:35:51 app rbenv[15051]: Puma starting in single mode...
Dec 26 05:35:51 app rbenv[15051]: * Version 3.11.0 (ruby 2.4.3-p205), codename: Love Song
Dec 26 05:35:51 app rbenv[15051]: * Min threads: 5, max threads: 5
Dec 26 05:35:51 app rbenv[15051]: * Environment: production

接下来,使用curl来访问和打印网页的内容,以便您可以检查网页是否正确提供。以下命令告诉curl访问您刚刚在端口9292上的app-server上启动的Puma服务器:

  • curl localhost:9292/tasks

如果您看到类似以下代码的内容,则表明Puma和数据库连接均正常工作:

Output...
<h1>Tasks</h1>
<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Note</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>
...

一旦确认您的Rails应用程序已由Puma提供服务并且已正确配置为使用database-server上的远程PostgreSQL实例,您就可以继续在web-serverapp-server之间建立SSH隧道。

第7步-设置并保留到App Server的SSH隧道

现在,该app-server已启动并正在运行,您可以将其连接到web-server 。与您在步骤4中执行的过程类似,您将通过设置另一个SSH隧道来完成此操作。该隧道将允许web-server上的Nginx通过加密连接安全地连接到app-server上的Puma。

首先在web-server上安装autossh :

  • sudo apt-get install autossh

/lib/systemd/system/目录中创建一个名为app-tunnel.service的新文件:

  • sudo nano /lib/systemd/system/app-tunnel.service

将以下内容添加到此文件。同样,关键是以ExecStart开头的ExecStart 。在这里,这条线向前端口9292上的web-server端口9292上的app-server ,其中彪马是听:

/lib/systemd/system/app-tunnel.service

[Unit]
StopWhenUnneeded=true
Wants=network-online.target
After=network-online.target
[Service]
User=tunnel
WorkingDirectory=/home/tunnel
ExecStart=/bin/bash -lc 'autossh -N -L 9292:localhost:9292 tunnel@app-server'
Restart=always
StandardInput=null
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=%n
KillMode=process
[Install]
WantedBy=multi-user.target

Note: ExecStart行中的端口号与上一步中为Puma配置的端口号相同。

重新加载systemd以便它读取新的服务文件,然后启用并启动app-tunnel服务:

  • sudo systemctl daemon-reload
  • sudo systemctl enable app-tunnel.service
  • sudo systemctl start app-tunnel.service

检查隧道是否打开:

  • ps axu | grep tunnel

您应该看到类似于以下输出的内容:

Outputtunnel   19469  0.0  0.1   4376   752 ?        Ss   05:45   0:00 /usr/lib/autossh/autossh -N -L 9292:localhost:9292 tunnel@app-server
tunnel   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
sammy    19484  0.0  0.1  12916   932 pts/0    S+   05:45   0:00 grep --color=auto tunnel

此经过筛选的过程清单显示autossh正在运行,并且它已经启动了另一个ssh过程,该过程在web-serverapp-server之间创建了实际的加密隧道。

现在,您的第二条隧道已启动,并且正在加密web-serverapp-server之间的通信。为了使三层Rails应用程序启动并运行,剩下要做的就是配置Nginx将请求传递给Puma。

步骤8 —配置Nginx

至此,所有必需的SSH连接和隧道均已建立,并且您的三个服务器层中的每个层都可以相互通信。这个难题的最后一部分是让您配置Nginx以将请求发送到Puma,以使设置完全起作用。

web-server ,在/etc/nginx/sites-available/ appname创建一个新的Nginx配置文件:

  • sudo nano /etc/nginx/sites-available/appname

将以下内容添加到文件中。此Nginx配置文件与您遵循我们的如何使用Puma和Nginx部署Rails应用程序的指南时使用的配置文件相似。主要区别在于上游应用程序的位置;此配置不是使用本地套接字文件,而是将Nginx指向侦听端口9292的SSH隧道:

/etc/nginx/sites-available/appname
upstream app {
    server 127.0.0.1:9292;
}
server {
    listen 80;
    server_name localhost;
    root /home/sammy/appname/public;
    try_files $uri/index.html $uri @app;
    location @app {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

保存并关闭此文件,然后启用站点并使更改生效。

首先,删除默认站点:

  • sudo rm /etc/nginx/sites-enabled/default

转到sites-enabled Nginx sites-enabled目录:

  • cd /etc/nginx/sites-enabled

sites-enabled目录中创建一个symbolic linksymbolic link您刚才在sites-available目录中创建的文件:

  • sudo ln -s /etc/nginx/sites-available/appname appname

测试您的Nginx配置是否存在语法错误:

  • sudo nginx -t

如果报告了任何错误,请返回并检查文件,然后继续。

准备就绪后,重新启动Nginx,以读取新配置:

  • sudo systemctl restart nginx

如果您按照先决条件中的Puma教程进行操作,则应已在app-server上安装了Nginx和PostgreSQL。两者都被在其他两台服务器上运行的单独实例替换,因此这些程序是多余的。因此,您应该从app-server删除以下软件包:

  • sudo apt remove nginx
  • sudo apt remove postgresql

删除这些软件包后,请确保更新防火墙规则,以防止任何有害的流量访问这些端口。

您的Rails应用现已投入生产。在网络浏览器中访问web-server的公共IP,以了解其作用:

http://web-server_public_IP/tasks

结论

通过遵循本教程,您已经在三层体系结构上部署了Rails应用程序,并使用加密的SSH隧道保护了从web-serverapp-server以及从app-serverdatabase-server连接。

通过将应用程序的各个组件放在不同的服务器上,您可以根据站点收到的流量为每个服务器选择最佳规格。这样做的第一步是监视服务器正在消耗的资源。有关如何监视服务器的CPU使用率的说明,请参见我们的CPU监视指南 。如果发现一层上的CPU或内存使用率很高,则可以单独调整该层上服务器的大小。有关选择服务器大小的更多建议,请参阅有关为您的应用程序选择正确的液滴的指南。

作为一个直接的下一个步骤,你也应该确保从用户的连接web-server通过安装在SSL证书web-server 。查看Nginx的”让我们加密”教程以获取指示。另外,如果您想了解有关使用SSH隧道的更多信息,请参阅本指南

发表评论

电子邮件地址不会被公开。 必填项已用*标注