介绍
恭喜你。 您的网站正在获得牵引力,您正在快速增长。 Ruby是选择和Rails的编程语言? 你去到框架。现在你收获你的努力所带来的好处和分享快乐的客户感谢的喜悦,你的精彩应用。
然而,你开始担心面临一个新的挑战:适应你越来越多的客人(即缩放)。
尽管在这个问题上存在争议,即使您运行的是一个非常繁忙的网站(由Ruby和Rails提供支持),您仍然可以继续及时为您的客户提供服务。 实现这一点的关键是通过扩展您的应用程序,或者在其他方面,将其负载分布在多个Droplet,以处理这个精确的任务,没有别的。
在这篇DigitalOcean文章中,我们将看到如何简单地横向扩展Ruby on Rails应用程序,将其负载分布在运行于Unicorn上的多个机器上,所有这些机器都仔细地设置在运行Nginx HTTP服务器的主负载平衡器后面,负责欢迎和处理传入请求并平衡负载。
本教程包括将您的应用分发到多个服务器。 但是,为了完全部署您的应用程序,您需要使用数据库进行设置。 在这些系列的下一篇文章涵盖连接服务器到MySQL的或PostgreSQL的数据库。
词汇表
可扩展应用部署
- Unicorn应用服务器
- Nginx HTTP服务器/反向代理/负载平衡器
- 我们的部署准备流程
- 最终建筑
2.准备服务器和操作系统
3.设置应用程序服务器
- 设置Ruby环境
- 设置Rails
- 安装Unicorn
- 创建示例Rails应用程序
- 配置Unicorn
- 运行Unicorn
- 查找服务器的IP地址以配置Nginx
4.设置Nginx作为反向代理和负载平衡器
- 设置Nginx
- 配置Nginx
可扩展应用程序部署
部署应用程序,或在网上发布他们,可以在技术上意味着不同的东西,这个过程本身可以在不同层面进行。 以前,我们已经介绍了使用不同服务器(即Unicorn和Passenger)部署Rails应用程序的多种方式,甚至了解如何使用不同的工具(例如Capistrano和Mina)自动化过程。
为了有一个[简单]可扩展的架构,我们将我们的部署结构分为两个主要元素:
应用服务器(Unicorn / Rails)
面向前端的HTTP服务器/负载均衡器(Nginx)
我们偏爱Unicorn应用服务器的主要原因是它的高级功能和它可以被实现和维护的简单方式。
不断增长的Nginx HTTP服务器和反向代理将是我们的负载平衡器,负责跨基于Unicorn的应用服务器分发负载。
因此,我们将分别涵盖两个不同的领域。
准备(和部署)运行Unicorn的Rails应用程序服务器。
准备一个基于Nginx的前端负载平衡反向代理,以分配跨越Unicorn的负载。
类似于我们以前的手册和文章,我们将继续使用最新版本的CentOS操作系统的设计选择,这完全符合我们的简单性和稳定性的目标。
注意:当你通过这篇文章让你的方式,你会看到其他人在其深度进一步讨论某些科目的链接。 如果你想了解更多关于他们,考虑检查他们。
Unicorn应用服务器
Unicorn是一个非凡的应用服务器,包含Rails应用程序来处理传入的请求。 这些应用程序服务器只会处理需要处理的请求,在由前端Nginx服务器(作为负载平衡器)进行过滤和预处理后。
作为一个非常成熟的Web应用程序服务器,Unicorn是绝对全功能的。 它通过设计拒绝做所有事情,只处理Web应用程序需要做的事情,并将其余的责任委托给操作系统(即杂耍过程)。
Unicorn的主进程生成工服务请求。 这个过程还监视工作者,以防止记忆和进程相关的错误问题。 这对系统管理员来说意味着它会杀死一个进程,例如,它最终花费太多时间来完成任务,或者在内存问题发生的情况下。
注意:要了解不同Ruby Web的应用程序服务器和了解什么是机架 ,看看我们的文章(机架式)网络服务器的Ruby Web应用程序的比较 。
Nginx HTTP服务器/反向代理/负载平衡器
Nginx HTTP服务器,从根本上设计作为一个多用途,面向前的Web服务器。 它能够非常好地提供静态文件(例如图像,文本文件等),平衡连接和处理某些漏洞尝试。 它将作为所有请求的第一个入口点,它将分发它们,以便处理运行Unicorn的Web应用程序服务器。
我们的部署准备流程
从以下部分开始,我们将执行以下过程来准备我们的分布式负载平衡应用程序部署设置。
更新操作系统[*]
获取部署所需的基本工具[*]
安装Ruby,Rails和库
安装应用程序(即Unicorn)和HTTP服务器(Nginx)
配置Nginx在TCP上分配负载
注:名单上的标记项是将需要所有配置的服务器上执行,而不管其指定的角色,作为一个应用程序服务器或负载均衡程序。
最终建筑
下面是我们的最终架构将水平分布负载和水平扩展的示例。
Client Request ----> Nginx (Reverse-Proxy / Load-Balancer)
|
/|\
| | `-> App. Server I. 10.128.xxx.yy1:8080 # Our example
| `--> App. Server II. 10.128.xxx.yy2:8080
`----> ..
准备服务器和操作系统
我们将开始创建我们的设置,准备将运行Unicorn或Nginx的所有服务器。
为了安装Ruby和其他必要的应用程序(例如我们的服务器),我们需要首先准备最小运输的CentOSDroplet,并为其配备一些我们需要的开发工具。
运行以下命令以更新基于CentOS的Droplet的默认工具:
yum -y update
通过执行以下命令安装包含多个开发工具的应用程序包:
yum groupinstall -y 'development tools'
一些我们需要在本教程(如libyaml-DEVEL,nginx的等)的包不属于官方的CentOS存储库中找到。 为了简化事情,而不是对付手动安装它们,我们将添加EPEL软件仓库为YUM软件包管理器使用。
# Enable EPEL Repository
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
# Update everything, once more.
yum -y update
最后,我们需要得到curl-devel
和其他一些工具和库本教程(如Rails需要的sqlite-DEVEL)。
要安装它们,请运行以下命令:
yum install -y curl-devel nano sqlite-devel libyaml-devel
设置应用程序服务器
在这一步中,我们将准备将在Unicorn应用程序服务器上运行Rails的服务器。
让我们开始准备Ruby和Rails。
设置Ruby环境
注:本部分我们专门文章内容摘要如何安装Ruby 2.1.0在CentOS 6.5 。
注意:您将需要从以前的部分进行说明,与下面一起来,所有的应用程序服务器上。 在最低限度,你需要一台应用服务器来部署应用程序。 为了平衡载荷,提供更多的Droplet并重复这些步骤。
我们将要使用Ruby版本管理器 (RVM),下载并安装一个Ruby解释器。
运行以下两个命令来安装RVM并为Ruby创建一个系统环境:
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
最后,要在我们的系统上完成Ruby安装,让我们让RVM下载并安装Ruby版本2.1.0:
rvm reload
rvm install 2.1.0
设置Rails
由于滑轨首先需要一个JavaScript解释工作,我们还需要建立Node.js
。 为此,我们将使用默认的系统包管理器YUM。
运行以下命令以下载和安装nodejs
使用yum:
yum install -y nodejs
执行以下命令下载和安装rails
使用Gem:
gem install bundler rails
安装Unicorn
有几种方法可以轻松下载Unicorn。 因为它是一个与应用程序相关的依赖,所以最合乎逻辑的方法是使用RubyGems。
运行以下命令以下载和安装使用Unicorngem
:
gem install unicorn
注意:我们将看到如何使用该工具将在下一节工作。
创建示例Rails应用程序
注:在本例中的工作,现在我们要创建一个基本的Rails应用程序。 为了运行您的应用程序,您需要上传您的应用程序源。
###上传您的源代码
对于实际部署,您当然希望将您的代码库上传到服务器。 为此,您可以使用SFTP或图形工具(如FileZilla)安全地传输和管理远程文件。 同样,您可以使用Git和中央存储库(如Github)下载和设置您的代码。
- 要了解与SFTP工作,请查看文章: 如何使用SFTP 。
- 要了解FileZilla中,请查看文章的主题: 如何使用FileZilla中 。
让我们开始在我们的主目录中创建一个非常基本的Rails应用程序,与Unicorn一起服务。
执行以下命令来获得Rails创建一个名为my_app应用新的应用程序:
# Create a sample Rails application
cd /var
mkdir www
cd www
rails new my_app
# Enter the application directory
cd my_app
# Create a sample resource
rails generate scaffold Task title:string note:text
# Create a sample database
RAILS_ENV=development rake db:migrate
RAILS_ENV=production rake db:migrate
# Create a directory to hold the PID files
mkdir pids
要测试您的应用程序的设置是否正确,一切工作正常,进入应用程序目录,然后运行一个简单的服务器rails s
:
# Enter the application directory
cd /var/www/my_app
# Run a simple server
rails s
# You should now be able to access it by
# visiting: http://[your droplet's IP]:3000/tasks
# In order to terminate the server process,
# Press CTRL+C
配置Unicorn
Unicorn可以配置多种方式。 对于本教程,重点介绍关键元素,我们将从头创建一个文件,在启动应用程序服务器守护进程时由Unicorn使用。
打开一个空白unicorn.rb
文件,将里面保存config/
目录下的nano
文本编辑器:
nano config/unicorn.rb
放置下面的代码块,根据需要修改它:
# Set the working application directory
# working_directory "/path/to/your/app"
working_directory "/var/www/my_app"
# Unicorn PID file location
# pid "/path/to/pids/unicorn.pid"
pid "/var/www/my_app/pids/unicorn.pid"
# Path to logs
# stderr_path "/path/to/log/unicorn.log"
# stdout_path "/path/to/log/unicorn.log"
stderr_path "/var/www/my_app/log/unicorn.log"
stdout_path "/var/www/my_app/log/unicorn.log"
# Number of processes
# Rule of thumb: 2x per CPU core available
# worker_processes 4
worker_processes 2
# Time-out
timeout 30
按CTRL + X并用Y确认保存并退出。
注意:要简单地测试与Unicorn您的应用程序,可以运行unicorn_rails
应用程序目录中。
注意:要了解更多有关麒麟配置,看看其官方文档页面在这里 。
运行Unicorn
我们准备使用Unicorn运行我们的应用程序。
运行以下使用我们的配置文件(启动Unicorn守护进程方式config/unicorn.rb
):
unicorn_rails -c config/unicorn.rb -D
查找服务器的IP地址以配置Nginx
让我们找到我们的虚拟服务器的专用网/私网IP地址。
运行以下命令查看服务器的私有IP地址:
ifconfig
样品输出:
eth0 Link encap:Ethernet HWaddr 04:01:10:4B:B8:01
inet addr:107.170.13.134 Bcast:107.170.13.255 Mask:255.255.255.0
inet6 addr: fe80::601:10ff:fe4b:b801/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:164298 errors:0 dropped:0 overruns:0 frame:0
TX packets:46316 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:230223345 (219.5 MiB) TX bytes:4969058 (4.7 MiB)
eth1 Link encap:Ethernet HWaddr 04:01:10:4B:B8:02
inet addr:10.128.241.135 Bcast:10.128.255.255 Mask:255.255.0.0
inet6 addr: fe80::601:10ff:fe4b:b802/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:120 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6810 (6.6 KiB) TX bytes:874 (874.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
的信息的第二位在这里,从eth1
并用持续的inet adde:
揭示分配给我们的服务器,这是私有 IP地址10.128.241.135
在我们的情况。
我们将使用这个IP地址让Nginx与我们的应用服务器通信。
注意这个地址并继续下一步设置和配置Nginx。
注意:要了解更多有关专用网络上DigitalOcean,看看如何设置和使用DigitalOcean专用网络教程社区文章部分。
设置Nginx作为反向代理和负载平衡器
在本节中,我们将在前端服务器上工作,并设置Nginx来欢迎传入的请求并平衡应用程序服务器之间的负载。
设置Nginx
既然我们已经启用了EPEL软件库,可以Nginx的使用yum就搞定了。
运行以下命令,使用yum下载并安装Nginx:
yum install -y nginx
配置Nginx
无需安装Nginx的之后,下一步正在与它的配置文件, nginx.conf
,位于/etc/nginx
默认。
执行下面的命令来启动编辑使用这个文件nano
文本编辑器:
nano /etc/nginx/nginx.conf
向下滚动文件下面并注释掉以下行:
# Before:
include /etc/nginx/conf.d/*.conf;
# After:
# include /etc/nginx/conf.d/*.conf;
内部http {
节点,添加以下的配置,修改,以适合自己的设置:
# Set your server
# server_name www.example.com;
upstream unicorn_servers {
# Add a list of your application servers
# Each server defined on its own line
# Example:
# server IP.ADDR:PORT fail_timeout=0;
server 10.128.241.135:8080 fail_timeout=0;
# server 10.128.241.136:8080 fail_timeout=0;
# server 10.128.241.137:8080 fail_timeout=0;
}
server {
# Port to listen on
listen 80;
location / {
# Set proxy headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://unicorn_servers;
}
}
按CTRL + X并用Y确认保存并退出。
要开始,请使用以下命令运行Nginx守护程序:
service nginx start
修改配置文件后,可以使用以下命令重新启动服务器:
service nginx restart
注意:要了解进一步的配置和设置提供静态文件的指令,检查出的Unicorn官方nginx.conf例子 。