如何在CentOS 6.5上使用Unicorn和Nginx部署Rails应用程序

介绍

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

在这篇教程中,我们将介绍如何组装多层部署安装来托管基于Rails的Ruby Web应用程序。对于这种安排,我们将使用在Nginx后台运行的功能强大,灵活且非常成功的Unicorn应用服务器。虽然我们将在单个服务器上构建此结构以用于演示目的,但您可以轻松地使用水平和垂直的方式传播内容并扩展!

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

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

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

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

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

Unicorn 应用程序服务器(Application Server)

Unicorn是一个非常成熟的基于Ruby/Rack的Web应用程序的Web应用程序服务器。它功能齐全,但它在设计上试图做任何事情而否认它。Unicorn的负责人正在做Web应用服务器需要完成的工作并委派其他职责。

Unicorn的主进程根据您的要求生成workers以满足请求。此过程还监视workers,以防止记忆和处理相关的错误问题。这对系统管理员来说意味着,如果例如完成任务需要太多时间或发生内存问题,它将终止进程。

如上所述,Unicorn委派任务的一个领域是使用操作系统进行负载平衡。这允许请求不会堆积繁忙的workers。

Nginx HTTP Server作为前端反向代理运行

Nginx是一个性能非常高的Web服务器反向代理。它因其重量轻,易于使用和易于扩展(附加/插件)而受到欢迎。因为其架构,它能够处理大量请求(几乎无限制),这取决于您的应用程序或网站负载。

准备部署服务器

在本节中,我们将执行以下步骤:

  • 更新操作系统
  • 获取必要的基本部署工具
  • 安装Ruby,Rails和库
  • 安装应用程序(即Unicorn)和HTTP服务器(Nginx)

更新和准备操作系统

运行以下命令以更新CentOS 的默认工具:

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存储库中找到。为简化操作不需要手动安装,我们将为YUM软件包管理器添加EPEL软件存储库以供使用。

# 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

我们将使用Ruby Version Manager(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。

运行以下命令以下载和安装nodejs使用yum

yum install -y nodejs

执行以下命令以使用gem以下命令下载和安装rails

gem install bundler rails

安装Nginx

由于我们启用了EPEL存储库,因此可以使用yum获取Nginx。

运行以下命令以使用yum命令下载并安装Nginx :

yum install -y nginx

注意:我们将在以下部分中配置此工具。

安装Unicorn

有几种方法可以轻松下载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    

要测试您的应用程序是否设置正确并且一切正常,请输入app目录并运行一个带有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传输文件详情请访问腾讯云+社区

配置服务器

Unicorn

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确认。

管理服务器

完成两台服务器的配置后,我们就可以尝试上线。

让我们启动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

您现在可以通过转到服务器的IP地址(或与之关联的域名)来检查调配。

http://[Your droplet's IP addr]/tasks
# Listing tasks
# Title    Note 
# New Task

结论

本文主要介绍CentOS使用Unicorn和Nginx部署Rails应用程序,更多关于Rails的应用程序,欢迎访问腾讯云+社区学习更多知识。


参考文献:《How To Deploy Rails Apps Using Unicorn And Nginx on CentOS 6.5》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小狼的世界

Gearman的问题分析与深入研究

Gearman作为一个优秀的分布式解决方案,已经被众多的公司或者团队所采用,我在之前的一篇文章中也有过介绍。但是目前对于woker的执行状态和结果监控,特别是放...

1102
来自专栏FreeBuf

剪贴板劫持:复制粘贴中暗藏杀机

现在浏览器大多只允许开发者在一定条件下向用户剪贴板中添加内容。换句话说,剪贴板劫持只能是在浏览器事件中才能够触发。本文将详细的向各位讲述“剪贴板劫持”攻击如何诱...

2426
来自专栏九彩拼盘的叨叨叨

最近写的《后台管理系统的前端代码生成工具》介绍

《后台管理系统的前端代码生成工具》做的是生成项目 admin-template 的列表,新增,编辑,详情页的代码,如上图所示。通过点击“生成下载内容”,点相应的...

701
来自专栏java思维导图

架构师详解:Nginx 架构

原文链接:https://my.oschina.net/u/3770281/blog/1802493

1502
来自专栏帅小子的日常

redis集群的搭建

3775
来自专栏企鹅号快讯

C4D R14软件安装教程

C4D R14(64位)下载地址: 链接:https://pan.baidu.com/s/1slwUuo1 密码:k88e C4D R14(MAC)下载地址: ...

2107
来自专栏静晴轩

详解 Cookie 纪要

从事 Web 开发已有近17个月;在学以致用的工作学习里,对于不怎么使用的部分,多少有些雾里探花的窘迫感~差不多是了解一二,然而又非真切的明晰;这就使得再用的时...

3499
来自专栏Python

cookie详解

今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://mp.weixin.qq.com/s/NXrH7R8y2Dqxs9...

4233
来自专栏烂笔头

Python爬虫代理IP池

目录[-] 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速...

7776
来自专栏程序猿DD

微服务架构:Eureka参数配置项详解

来源:https://www.areatao.com/article/5b45718d7ab07c574d5888d0?from=timeline&isappi...

1583

扫码关注云+社区

领取腾讯云代金券