如何在多个 Droplet 上扩展 Ruby on Rails 应用程序(第 1 部分)

介绍


恭喜好!您的网站正在获得吸引力,您正在快速成长。Ruby是您所选择的编程语言和Rails? _您的框架。_现在您正在收获您的努力的益处,并通过您的奇妙的应用程序分享您快乐的客户的喜悦。

然而,你正开始担心面对一个新的挑战:容纳你的越来越多的客人(即扩展)。

尽管有争议,即使你正在运行一个非常繁忙的网站(由Ruby和Rails驱动),你可以继续以及时的方式为客户提供服务。

在这篇DigitalOcean文章中,我们将看到如何简单地横向扩展Ruby on Rails应用程序,将其负载分配到运行在Unicorn上的多个机器上,所有这些都仔细设置在运行Nginx HTTP服务器的主负载平衡器后面,任务是欢迎和处理接收请求并平衡负载。

本教程涵盖将您的应用程序分发到多个服务器上。然而,为了完全部署您的应用程序,您需要将其设置为数据库。本系列的下一篇文章涵盖将您的服务器连接到 MySQLPostgreSQL数据库。

词典


1、可扩展的应用部署


  1. Unicorn 应用服务器
  2. Nginx HTTP 服务器 / 反向代理 / 负载平衡器
  3. 我们的部署准备过程
  4. 最终架构

2、准备服务器和操作系统


3、设置应用服务器


  1. 设置 Ruby 环境
  2. 设置 Rails
  3. 安装 Unicorn
  4. 创建 Sample Rails 应用
  5. 配置 Unicorn
  6. 运行 Unicorn
  7. 查找服务器的 IP 地址来配置 Nginx

将 Nginx 设置为反向代理和负载平衡器

  1. 设置 Nginx
  2. 配置 Nginx

可扩展的应用部署


部署应用程序,或在网上发布它们,在技术上可能意味着不同的事情,而这个过程本身可以发生在不同的层次上。

为了有一个可扩展的架构,我们将部署结构分为两个主要元素:

  • 应用服务器(Unicorn/Rails) *面向前的 HTTP 服务器 / 负载平衡器 (Nginx)

我们对 Unicorn 应用程序服务器的偏好主要原因是其先进的功能和易于实现的方式 - 以及维护。

越来越受欢迎的 Nginx HTTP 服务器和反向代理将是我们的负载平衡器,负责在基于 Unicorn 的应用服务器中分配负载。

因此,我们将分别覆盖两个不同的领域。

  1. 准备(并部署)运行 Unicorn 的 Rails 应用服务器
  2. 准备一个基于 Nginx 的面向、负荷均衡的反向代理,以便在 Unicorn(s)中分配负荷。

与以前的手册和文章类似,我们将继续使用CentOS操作系统的最新版本,其设计选择与我们的简单性和稳定性目标完美一致。

** 注意:** 当您通过这篇文章时,您将看到其他人讨论某些主题的链接,如果您想更多地了解它们,请考虑检查它们。

Unicorn 应用服务器


Unicorn 是一个出色的应用程序服务器,包含 Rails 应用程序来处理接入请求,这些应用程序服务器只会处理需要处理的请求,然后通过面向前的 Nginx 服务器进行过滤和预处理,作为负载平衡器。

作为一个非常成熟的Web应用程序服务器,Unicorn绝对具有完整的功能,它通过设计拒绝尝试做任何事情,只处理Web应用程序需要做的事情,并将其余的责任分配给操作系统(即操纵流程)。

Unicorn 的 master 流程生成 workers 以服务请求. 该流程还监控工作者,以防止记忆和处理相关的惊人问题。

** 注意:** 要了解不同的 Ruby Web 应用程序服务器,并了解 Rack 是什么,请参阅我们的文章 对比 Ruby Web 应用程序的 (Rack) Web 服务器

Nginx HTTP 服务器 / 反向代理 / 负荷平衡器


Nginx HTTP服务器,是从头到尾设计的,作为一个多用途,面向前面的Web服务器。它能够服务静态文件(如图像,文本文件等)非常好,平衡连接,并处理某些利用尝试。

我们的部署准备过程


从下面的部分开始,我们将执行以下程序来准备我们的分布式、负载均衡的应用部署设置。

  • 更新操作系统 [*]
  • 获取部署所需的基本工具 [*]
  • 安装 Ruby, Rails 和库
  • 安装应用程序(即 Unicorn)和 HTTP 服务器 (Nginx)
  • 配置 Nginx 来分发 TCP 上的负载

** 注: ** 列表中的标记项目是需要在所有提供的服务器上执行的程序,不论其被指定为应用程序服务器或负载平衡器的角色如何。

最终建筑


下面是一個例子,我們的最終架構將如何分配負載到滴滴和水平擴展。

1Client Request ----> Nginx (Reverse-Proxy / Load-Balancer)
2                        |
3                       /|\                           
4                      | | `-> App. Server I. 10.128.xxx.yy1:8080 # Our example
5                      |  `--> App. Server II. 10.128.xxx.yy2:8080
6                       `----> ..

准备服务器和操作系统


我们将开始创建我们的设置,准备所有将运行Unicorn或Nginx的服务器。

為了安裝 Ruby 和其他必要的應用程式(例如我們的伺服器),我們需要先準備最少發送的 CentOS 滴,並配備一些我們將需要的開發工具。

运行以下命令来更新您的 CentOS 基于 dropplet 的默认工具:

1yum -y update

通过执行以下命令安装包含多个开发工具的应用程序包:

1yum groupinstall -y 'development tools'

对于本教程,我们需要的一些包(如 libyaml-devel、nginx 等)在官方 CentOS 存储库中找不到。为了简化事情,而不是手动安装它们,我们将添加用于 YUM 包管理器的 EPEL 软件存储库。

1# Enable EPEL Repository
2sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
3
4# Update everything, once more.
5yum -y update

最后,我们需要为本教程获取curl-devel和其他几个工具和库(例如,Rails需要 sqlite-devel)。

为了安装它们,运行以下操作:

1yum install -y curl-devel nano sqlite-devel libyaml-devel

设置应用服务器


在此步骤中,我们将准备在 Unicorn 应用程序服务器上运行 Rails 的服务器。

**让我们从 Ruby 和 Rails 准备开始。

创建 Ruby 环境


**注:**本节是我们专门文章的摘要 如何在CentOS 6.5上安装Ruby 2.1.0

** 注意:** 您需要在所有应用程序服务器上执行上一节的指示,以及下列指示。 至少,您需要一个应用程序服务器来部署您的应用程序. 为了平衡负载,请提供更多滴滴并重复这些步骤。

我们将使用 _Ruby 版本管理器(RVM)来下载和安装 Ruby 解释器。

运行以下两个命令来安装 RVM 并为 Ruby 创建系统环境:

1curl -L get.rvm.io | bash -s stable
2source /etc/profile.d/rvm.sh

最后,为了在我们的系统上完成安装Ruby,让我们让RVM下载并安装Ruby版本 2.1.0:

1rvm reload
2rvm install 2.1.0

建立铁路


由于Rails首先需要一个JavaScript解释器来工作,我们还需要设置Node.js

运行以下操作以使用 yum 下载和安装nodejs:

1yum install -y nodejs

執行以下命令下載並安裝「rails」使用寶石:

1gem install bundler rails

安装独角兽


有几种方法可以轻松下载Unicorn,因为它是一种与应用程序相关的依赖,最合乎逻辑的方式是使用RubyGems。

运行以下操作来下载和安装 Unicorn 使用``:

1gem install unicorn

** 注意:** 我们将在下一节中看到如何使用此工具。

创建 Sample Rails 应用程序


** 注意:** 为了我们的示例工作,我们现在将创建一个基本的 Rails 应用程序。

上传您的源代码


对于实际的部署,你当然会想将你的代码库上传到服务器上。 为此,你可以使用SFTP或图形工具,如FileZilla,安全地传输和管理远程文件。

要了解有关FileZilla的信息,请参阅有关该主题的文章: 如何使用FileZilla

** 让我们从创建一个非常基本的 Rails 应用程序开始,在我们的家庭目录中使用 Unicorn。

运行以下命令来获取 Rails 以创建一个名为 my_app 的新应用程序:

 1# Create a sample Rails application
 2cd /var
 3mkdir www
 4cd www
 5rails new my_app
 6
 7# Enter the application directory
 8cd my_app
 9
10# Create a sample resource
11rails generate scaffold Task title:string note:text
12
13# Create a sample database
14RAILS_ENV=development rake db:migrate
15RAILS_ENV=production rake db:migrate
16
17# Create a directory to hold the PID files
18mkdir pids

要测试您的应用程序是否正确设置,并且一切正常运行,请输入应用程序目录并运行一个简单的服务器:

 1# Enter the application directory
 2cd /var/www/my_app
 3
 4# Run a simple server
 5rails s
 6
 7# You should now be able to access it by
 8# visiting: http://[your droplet's IP]:3000/tasks
 9
10# In order to terminate the server process,
11# Press CTRL+C

独角兽配置


在本教程中,专注于关键元素,我们将从头开始创建一个文件,该文件将由Unicorn在启动应用程序服务器戴蒙过程时使用。

打开一个空白的 unicorn.rb 文档,它将使用 nano 文本编辑器存储在 config/ 目录中:

1nano config/unicorn.rb

放下下面的代码块,根据需要修改它:

 1# Set the working application directory
 2# working_directory "/path/to/your/app"
 3working_directory "/var/www/my_app"
 4
 5# Unicorn PID file location
 6# pid "/path/to/pids/unicorn.pid"
 7pid "/var/www/my_app/pids/unicorn.pid"
 8
 9# Path to logs
10# stderr_path "/path/to/log/unicorn.log"
11# stdout_path "/path/to/log/unicorn.log"
12stderr_path "/var/www/my_app/log/unicorn.log"
13stdout_path "/var/www/my_app/log/unicorn.log"
14
15# Number of processes
16# Rule of thumb: 2x per CPU core available
17# worker_processes 4
18worker_processes 2
19
20# Time-out
21timeout 30

保存和退出,按 CTRL + X 并用 Y 确认。

** 注意:** 要简单地测试你的应用程序与 Unicorn,你可以运行unicorn_rails在应用程序目录中。

** 注意:** 若要了解有关配置 Unicorn 的更多信息,请查看其官方文档页面 这里

独角兽跑步


我们已经准备好使用Unicorn来运行我们的应用程序。

运行以下操作以使用我们的配置文件(config/unicorn.rb)在 daemon 模式中启动 Unicorn:

1unicorn_rails -c config/unicorn.rb -D

查找服务器的 IP 地址以配置 Nginx


让我们找到我们的虚拟服务器的 私人网络 / 私人 IP 地址。

运行以下操作来揭示服务器的私人 IP 地址:

1ifconfig

样品产量:

 1eth0 Link encap:Ethernet HWaddr 04:01:10:4B:B8:01  
 2          inet addr:107.170.13.134 Bcast:107.170.13.255 Mask:255.255.255.0
 3          inet6 addr: fe80::601:10ff:fe4b:b801/64 Scope:Link
 4          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 5          RX packets:164298 errors:0 dropped:0 overruns:0 frame:0
 6          TX packets:46316 errors:0 dropped:0 overruns:0 carrier:0
 7          collisions:0 txqueuelen:1000 
 8          RX bytes:230223345 (219.5 MiB)  TX bytes:4969058 (4.7 MiB)
 9
10eth1 Link encap:Ethernet HWaddr 04:01:10:4B:B8:02  
11          inet addr:10.128.241.135 Bcast:10.128.255.255 Mask:255.255.0.0
12          inet6 addr: fe80::601:10ff:fe4b:b802/64 Scope:Link
13          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
14          RX packets:120 errors:0 dropped:0 overruns:0 frame:0
15          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
16          collisions:0 txqueuelen:1000 
17          RX bytes:6810 (6.6 KiB)  TX bytes:874 (874.0 b)
18
19lo Link encap:Local Loopback  
20          inet addr:127.0.0.1 Mask:255.0.0.0
21          inet6 addr: ::1/128 Scope:Host
22          UP LOOPBACK RUNNING MTU:16436 Metric:1
23          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
24          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
25          collisions:0 txqueuelen:0 
26          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

这里的第二个信息,从eth1开始,继续inet adde:揭示了分配给我们的服务器的 private IP 地址,在我们的情况下是10.128.241.135

我们将使用此 IP 地址让 Nginx 与我们的应用服务器进行通信。

注意此地址,并继续到下一步设置和配置 Nginx。

** 注意:** 有关 DigitalOcean 上的私人网络的更多信息,请参阅 如何设置和使用 DigitalOcean 私人网络教程在社区文章部分。

将 Nginx 设置为反向代理和负载平衡器


在本节中,我们将对前置服务器进行工作,并设置 Nginx 来欢迎接收请求,并平衡应用程序服务器的负载。

设置 Nginx


由于我们已启用了 EPEL 存储,所以可以使用 yum 获取 Nginx。

运行以下操作来下载并使用 yum 安装 Nginx:

1yum install -y nginx

配置 Nginx


安装了 Nginx 后,下一步是使用其配置文件 nginx.conf,默认位置为 /etc/nginx

运行下面的命令以使用nano文本编辑器开始编辑此文件:

1nano /etc/nginx/nginx.conf

滚向下面的文件,并评论下面的行:

1# Before:
2include /etc/nginx/conf.d/*.conf;
3
4# After:
5# include /etc/nginx/conf.d/*.conf;

http { 节点内,添加以下配置,修改它们以适应您的设置:

 1# Set your server 
 2# server_name www.example.com;
 3
 4upstream unicorn_servers {
 5
 6    # Add a list of your application servers
 7    # Each server defined on its own line
 8    # Example:
 9    # server IP.ADDR:PORT fail_timeout=0;
10    server 10.128.241.135:8080 fail_timeout=0;
11
12    # server 10.128.241.136:8080 fail_timeout=0;
13    # server 10.128.241.137:8080 fail_timeout=0;
14
15}
16
17server {
18
19    # Port to listen on
20    listen 80;
21
22    location / {
23        # Set proxy headers        
24        proxy_set_header Host $host;
25        proxy_set_header X-Real-IP $remote_addr;
26        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
27
28        proxy_pass http://unicorn_servers;
29    }
30
31}

保存和退出,按 CTRL + X 并用 Y 确认。

要开始,请使用以下命令运行 Nginx 示威者:

1service nginx start

更改配置文件后,您可以通过以下方式重新启动服务器:

1service nginx restart

** 注意:** 若要了解更多配置和为服务静态文件设置指令,请参阅官方 Unicorn nginx.conf 示例

Submitted by: O.S. Tezer
Published At
Categories with 技术
comments powered by Disqus