如何在 CentOS 6.5 上使用 Unicorn 和 Nginx 部署 Rails 应用程序
状态:已弃用
本文涵盖不再受支持的 CentOS 版本。如果您当前正在运行运行 CentOS 6 的服务器,我们强烈建议您升级或迁移到受支持的 CentOS 版本。
原因:
请参阅:
介绍
当您部署基于 Rails 的 Web 应用程序时,设计简单的应用程序服务器可以让您在几分钟内启动并运行。但是,如果您希望更好地控制服务器设置或想尝试一些更灵活的新事物,使用一组分层组件可以帮助您实现您的目标——无论是面向未来的部署还是需要引入第三方元素,例如缓存服务器。
在这篇 DigitalOcean 文章中,我们将了解组装多层部署安装以托管基于 Rails 的 Ruby Web 应用程序。对于这种安排,我们将使用在 Nginx 后面运行的非常强大、灵活且非常成功的 Unicorn 应用程序服务器。尽管出于演示目的,我们将在单个服务器上构建此结构,但您可以轻松地使用多个 droplet 来传播内容并轻松扩展 - 无论是水平还是垂直!
词汇表
1. Web 应用程序部署、服务器及其角色
- 独角兽应用服务器
- 作为前端反向代理运行的 Nginx HTTP 服务器
2.准备部署服务器
- 更新和准备操作系统
- 设置 Ruby 环境和 Rails
- 安装 Nginx
- 安装独角兽
3. 为部署准备 Rails 应用程序
- 创建示例应用程序
- 上传您的源代码
4.配置服务器
- 独角兽
- Nginx
- 管理服务器
5. 延伸阅读
Web 应用程序部署、服务器及其角色
在部署 Web 应用程序时,通常涉及大量应用程序,这些应用程序分层设置并相互协作。这种真实世界的部署设置与使用单一开发服务器有很大不同,后者旨在仅用于测试目的,因为由于缺乏功能和特性,它们无法在实际网站流量的负载下工作。
谈到功能,应该注意的是,有一些流行的服务器可供选择,每个服务器都提供不同的功能:一些侧重于简单性,一些侧重于速度,还有一些侧重于一切,可以配置选项以满足复杂的生产需求。
在本文中,我们选择的应用服务器是 Unicorn。 Unicorn 是一个出色的应用程序服务器,它包含您的 Rails 应用程序以处理传入的请求,最好是在将它们过滤并由前端 HTTP 服务器(例如 Nginx)发送之后。
另一方面,Nginx HTTP 服务器是从头开始设计的,可以充当多用途、面向前端的 Web 服务器。它能够非常好地为静态文件(例如图像、文本文件等)提供服务,平衡连接,并处理某些漏洞利用尝试。它充当所有请求的第一个入口点,并将它们传递给 Unicorn,供 Web 应用程序处理并返回响应。
注意:要了解不同的 Ruby Web 应用程序服务器并了解“Rack”是什么,请查看我们的文章 A Comparison of (Rack) Web Servers for Ruby Web Applications。
独角兽应用服务器
Unicorn 是一个非常成熟的 Web 应用服务器,适用于基于 Ruby/Rack 的 Web 应用程序。它功能齐全,但它拒绝通过设计来尝试做所有事情。 Unicorn 的负责人负责做 Web 应用程序服务器需要做的事情,并委派其余的职责。
Unicorn 的 master 进程会根据您的要求生成 workers 来满足请求。此过程还监视工作人员,以防止内存和进程相关的惊人问题。这对系统管理员来说意味着它会终止一个进程,例如,如果完成任务花费太多时间或出现内存问题。
如上所述,Unicorn 委托任务的领域之一是使用操作系统进行负载平衡。这使得请求不会堆积起来以对抗产生的繁忙工作人员。
作为前端反向代理运行的 Nginx HTTP 服务器
Nginx 是一个非常高性能的网络服务器/(反向)代理。由于重量轻、相对易于使用和易于扩展(使用附加组件/插件),它已经流行起来。得益于其架构,它能够处理大量 请求(实际上是无限的),根据您的应用程序或网站负载,使用其他一些较旧的替代方案可能真的很难处理这些请求。
请记住:“处理”连接在技术上意味着不丢弃它们并且能够用某些东西为它们提供服务。您仍然需要您的应用程序和数据库正常运行才能让 Nginx 提供服务不是错误消息的客户端响应。
要了解有关 Nginx 的更多信息,您可以访问位于 nginx.com 的官方网站。
准备部署服务器
在本节中,我们将执行以下步骤:
- 更新操作系统
- 获取部署所需的基本工具
- 安装 Ruby、Rails 和库
- 安装应用程序(即 Unicorn)和 HTTP 服务器(Nginx)
更新和准备操作系统
为了安装 Ruby 和其他必要的应用程序(例如我们的服务器),我们需要首先准备最低限度的 CentOS droplet,并为其配备一些在此过程中需要的开发工具。
运行以下命令更新 CentOS VPS 的默认工具:
yum -y update
# This command will update all the base applications
# that come with CentOS by default. Which are mostly
# reserved for use by the operating system.
通过执行以下命令安装包含开发工具的包:
yum groupinstall -y 'development tools'
# With more recent versions of CentOS, such as 6.5 in our case,
# you can simply run:
# yum groupinstall -y development
# instead.
# This bundle of applications contains various tools
# Such as: gcc, make, automake, binutils, git etc.
我们在本教程中需要的一些软件包(例如 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
设置 Ruby 环境和 Rails
注意:本节是我们的专题文章如何在 CentOS 6.5 上安装 Ruby 2.1.0 的摘要。
我们将使用 Ruby 版本管理器 (RVM) 下载并安装 Ruby 解释器。
运行以下两条命令安装RVM并为Ruby创建系统环境:
gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
\curl -sSL https://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。
运行以下命令使用 yum
下载并安装 nodejs
:
yum install -y nodejs
执行以下命令以使用 gem
下载并安装 rails
:
gem install bundler rails
安装 Nginx
由于我们启用了 EPEL 存储库,因此可以使用 yum 获取 Nginx。
运行以下命令以使用 yum
下载并安装 Nginx:
yum install -y nginx
注意:我们将在以下部分中配置此工具。
安装独角兽
有几种方法可以轻松下载 Unicorn。由于它是应用程序相关的依赖项,因此最合乎逻辑的方法是使用 RubyGems。
运行以下命令使用 gem
下载并安装 Unicorn:
gem install unicorn
注意:我们将在下一节中了解如何使用此工具。
准备 Rails 应用程序以进行部署
注意:在本节中,我们将使用一个非常简单的 Ruby On Rails 应用程序作为示例。对于您的应用程序的实际部署,您应该上传您的代码库并确保安装其所有依赖项(即 bundle
)。
创建示例应用程序
让我们开始在我们的主目录中创建一个非常基本的 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
上传您的源代码
对于实际部署,您当然希望将您的代码库上传到服务器。为此,您可以使用 SFTP 或图形工具(例如 FileZilla)来安全地传输和管理远程文件。同样,您可以使用 Git 和中央存储库(如 Github)来下载和设置您的代码。
- 要了解如何使用 SFTP,请查看文章:如何使用 SFTP。
- 要了解 FileZilla,请查看有关该主题的文章:如何使用 FileZilla。
配置服务器
独角兽
Unicorn 可以通过多种方式配置。对于本教程,我们将重点关注关键元素,我们将从头开始创建一个文件,Unicorn 在启动应用程序服务器守护进程时将使用该文件。
打开一个空白的 unicorn.rb
文件,该文件将保存在 config/
目录中:
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"
# Unicorn socket
listen "/tmp/unicorn.[app name].sock"
listen "/tmp/unicorn.myapp.sock"
# Number of processes
# worker_processes 4
worker_processes 2
# Time-out
timeout 30
按 CTRL+X
并用 Y
确认保存并退出。
注意:要使用 Unicorn 简单地测试您的应用程序,您可以在应用程序目录中运行 unicorn_rails
。
Nginx
接下来,我们需要告诉 Nginx 如何与 Unicorn 对话。为此,在这个级别编辑默认配置文件就足够了:default.conf
并保留 nginx.conf
所提供的——它已经设置为包含默认配置配置。
nano /etc/nginx/conf.d/default.conf
用下面的内容替换文件内容,再次修改必要的位以满足您的需要:
upstream app {
# Path to Unicorn SOCK file, as defined previously
server unix:/tmp/unicorn.myapp.sock fail_timeout=0;
}
server {
listen 80;
server_name localhost;
# Application root, as defined previously
root /root/my_app/public;
try_files $uri/index.html $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
按 CTRL+X 并按 Y 确认保存并退出。
注意:要了解有关 Nginx 的更多信息,请参阅如何在 VPS 上配置 Nginx Web 服务器。
管理服务器
两台服务器配置完成后,就可以上线了!
让我们启动 Unicorn 并使用配置文件将其作为守护进程运行:
# Make sure that you are inside the application directory
# i.e. /my_app
unicorn_rails -c config/unicorn.rb -D
# You can set the environment by chaining -E flag
# i.e. unicorn_rails .. .. .. -E [env. name]
接下来,我们准备重新加载并重启 Nginx:
service nginx restart
就是这样!您现在可以通过转到您的 Droplet 的 IP 地址(或与其关联的域名)来检查您的部署。
http://[Your droplet's IP addr]/tasks
# Listing tasks
# Title Note
# New Task
延伸阅读
防火墙:
使用 IP 表设置防火墙
保护 SSH:
如何在 Ubuntu 上使用 fail2ban 保护 SSH
创建警报:
如何在 CentOS VPS 上发送电子邮件警报以进行系统监控
每天监控和观察服务器访问日志:
如何安装和使用 Logwatch 日志分析器和报告器
优化独角兽工人:
如何在 Ruby on Rails 应用程序中优化 Unicorn Worker