状态:已弃用
本文介绍了不再受支持的 CentOS 版本。 如果您目前正在运行运行 CentOS 6 的服务器,我们强烈建议您升级或迁移到受支持的 CentOS 版本。
原因:CentOS 6 已于 2020 年 11 月 30 日结束生命周期 (EOL) ,不再接收安全补丁或更新。 因此,不再维护本指南。
请参阅:本指南可能仍可用作参考,但可能不适用于其他 CentOS 版本。 如果可用,我们强烈建议使用为您正在使用的 CentOS 版本编写的指南。
介绍
当您部署基于 Rails 的 Web 应用程序时,设计简单的应用程序服务器可以让您在几分钟内启动并运行。 但是,如果您希望对服务器设置有更多控制权,或者想尝试更灵活的新事物,则使用分层组件集可以帮助您实现目标——无论是面向未来的部署还是需要引入第三方元素,例如缓存服务器。
在这篇 DigitalOcean 文章中,我们将了解如何组装一个多层部署安装来托管基于 Rails 的 Ruby Web 应用程序。 对于这种安排,我们将使用运行在 Nginx 后面的功能强大、灵活且极其成功的 Unicorn 应用服务器。 尽管出于演示目的,我们将在单个服务器上构建此结构,但您可以轻松地使用多个液滴来传播事物并轻松扩展 - 水平和垂直!
词汇表
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 应用程序服务器并了解“机架”是什么,请查看我们的文章 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 等中央存储库来下载和设置您的代码。
- 要了解如何使用 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
延伸阅读
防火墙:
保护 SSH:
如何在 Ubuntu 上使用 fail2ban 保护 SSH 如何在 CentOS 6 上使用 fail2ban 保护 SSH
创建警报:
如何在 CentOS VPS 上发送电子邮件警报以进行系统监控
每天监控和观察服务器访问日志: