介绍
恭喜好!您的网站正在获得吸引力,您正在快速成长。Ruby是您所选择的编程语言和Rails? _您的框架。_现在您正在收获您的努力的益处,并通过您的奇妙的应用程序分享您快乐的客户的喜悦。
然而,你正开始担心面对一个新的挑战:容纳你的越来越多的客人(即扩展)。
尽管有争议,即使你正在运行一个非常繁忙的网站(由Ruby和Rails驱动),你可以继续以及时的方式为客户提供服务。
在这篇DigitalOcean文章中,我们将看到如何简单地横向扩展Ruby on Rails应用程序,将其负载分配到运行在Unicorn上的多个机器上,所有这些都仔细设置在运行Nginx HTTP服务器的主负载平衡器后面,任务是欢迎和处理接收请求并平衡负载。
本教程涵盖将您的应用程序分发到多个服务器上。然而,为了完全部署您的应用程序,您需要将其设置为数据库。本系列的下一篇文章涵盖将您的服务器连接到 MySQL或 PostgreSQL数据库。
词典
1、可扩展的应用部署
- Unicorn 应用服务器
- Nginx HTTP 服务器 / 反向代理 / 负载平衡器
- 我们的部署准备过程
- 最终架构
2、准备服务器和操作系统
3、设置应用服务器
- 设置 Ruby 环境
- 设置 Rails
- 安装 Unicorn
- 创建 Sample Rails 应用
- 配置 Unicorn
- 运行 Unicorn
- 查找服务器的 IP 地址来配置 Nginx
将 Nginx 设置为反向代理和负载平衡器
- 设置 Nginx
- 配置 Nginx
可扩展的应用部署
部署应用程序,或在网上发布它们,在技术上可能意味着不同的事情,而这个过程本身可以发生在不同的层次上。
为了有一个可扩展的架构,我们将部署结构分为两个主要元素:
- 应用服务器(Unicorn/Rails) *面向前的 HTTP 服务器 / 负载平衡器 (Nginx)
我们对 Unicorn 应用程序服务器的偏好主要原因是其先进的功能和易于实现的方式 - 以及维护。
越来越受欢迎的 Nginx HTTP 服务器和反向代理将是我们的负载平衡器,负责在基于 Unicorn 的应用服务器中分配负载。
因此,我们将分别覆盖两个不同的领域。
- 准备(并部署)运行 Unicorn 的 Rails 应用服务器
- 准备一个基于 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,安全地传输和管理远程文件。
- 要了解如何使用 SFTP,请参阅文章: 如何使用 SFTP。
要了解有关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 示例。