如何在CentOS6.5上使用Unicorn和Nginx部署Rails应用程序

来自菜鸟教程
跳转至:导航、​搜索

介绍


当您部署基于 Rails 的 Web 应用程序时,设计简单的应用程序服务器可以让您在几分钟内启动并运行。 但是,如果您希望对服务器设置有更多控制权,或者想尝试更灵活的新事物,则使用分层组件集可以帮助您实现目标——无论是面向未来的部署还是需要引入第三方元素,例如缓存服务器。

在这篇 DigitalOcean 文章中,我们将了解如何组装一个多层部署安装来托管基于 Rails 的 Ruby Web 应用程序。 对于这种安排,我们将使用运行在 Nginx 后面的功能强大、灵活且极其成功的 Unicorn 应用服务器。 尽管出于演示目的,我们将在单个服务器上构建此结构,但您可以轻松地使用多个液滴来传播事物并轻松扩展 - 水平和垂直!

词汇表


1. Web 应用程序部署、服务器及其角色


  1. 独角兽应用服务器
  2. 作为前端反向代理运行的 Nginx HTTP 服务器

2. 准备部署服务器


  1. 更新和准备操作系统
  2. 设置 Ruby 环境和 Rails
  3. 安装 Nginx
  4. 安装独角兽

3. 为部署准备 Rails 应用程序


  1. 创建示例应用程序
  2. 上传您的源代码

4. 配置服务器


  1. 独角兽
  2. Nginx
  3. 管理服务器

5. 延伸阅读


Web 应用程序部署、服务器及其角色


在部署 Web 应用程序时,通常会涉及大量应用程序,它们分层设置并相互协作。 这种现实世界的部署设置与使用单一开发服务器有很大不同,后者旨在仅用于测试目的,因为由于缺乏功能和特性,它们无法在实际网站流量的负载下工作。

谈到功能,应该注意的是,有一些流行的服务器可供选择,每种服务器都提供不同的功能:一些专注于简单性,一些速度,还有一些可以配置选项以满足复杂的生产需求。

在本文中,我们选择的应用服务器是 Unicorn。 Unicorn 是一个出色的应用服务器,它包含您的 Rails 应用程序来处理传入请求,最好是在将它们过滤并由前端 HTTP 服务器(如 Nginx)发送之后。

另一方面,Nginx HTTP 服务器从一开始就被设计成一个多用途、面向前端的 Web 服务器。 它能够提供静态文件(例如 图像,文本文件等)非常好,平衡连接,并处理某些漏洞尝试。 它充当所有请求的第一个入口点,并将它们传递给 Unicorn 以供 Web 应用程序处理并返回响应。

注意: 要了解不同的 Ruby Web 应用程序服务器并了解“机架”是什么,请查看我们的文章 Ruby Web 应用程序的(机架)Web 服务器比较

独角兽应用服务器


Unicorn 是一个非常成熟的基于 Ruby/Rack 的 Web 应用程序的 Web 应用程序服务器。 它功能齐全,但它通过设计拒绝尝试做所有事情。 Unicorn 的负责人正在做需要由 Web 应用程序服务器完成的事情并委派其余的职责。

Unicorn 的 master 进程根据您的要求生成 workers 来服务请求。 此过程还监视工作人员,以防止与内存和进程相关的惊人问题。 这对系统管理员来说意味着它会杀死一个进程,例如,如果完成一项任务需要太多时间或发生内存问题。

如上所述,Unicorn 委派任务的领域之一是使用操作系统进行负载平衡。 这允许请求 not 堆积起来对抗产生的繁忙工作人员。

作为前端反向代理运行的 Nginx HTTP 服务器


Nginx 是一个非常高性能的 Web 服务器/(反向)代理。 由于重量轻、相对容易使用和易于扩展(使用附加组件/插件),它已经流行起来。 由于其架构,它能够处理 很多 的请求(几乎无限制),这取决于您的应用程序或网站负载 - 使用其他一些较旧的替代方案可能真的很难解决。

记住:“处理”连接在技术上意味着不丢弃它们并且能够使用某物为它们服务。 您仍然需要您的应用程序和数据库运行良好才能让 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 官方存储库中是 not。 为了简化事情而不是手动安装它们,我们将添加 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 等中央存储库来下载和设置您的代码。

配置服务器


独角兽


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 6 上使用 fail2ban 保护 SSH

创建警报:


如何在 CentOS VPS 上发送电子邮件警报以进行系统监控

每天监控和观察服务器访问日志:


如何安装和使用 Logwatch 日志分析器和报告器

优化独角兽工人:


如何在 Ruby on Rails 应用程序中优化 Unicorn Workers

提交人: [[“%3Ca|https]] ://twitter.com/ostezer [[“%3C/a|”>操作系统]] 泰泽