如何在 Ubuntu 14.04 上使用 Puma 和 Nginx 部署 Rails 应用程序

介绍

当你准备好部署你的Ruby on Rails应用程序时,有很多有效的设置要考虑。本教程将帮助你部署你的Ruby on Rails应用程序的生产环境,使用PostgreSQL作为数据库,在Ubuntu 14.04上使用Puma和Nginx。

Puma 是一个应用程序服务器, 如 [Passenger] (https://andsky.com/tech/tutorials/how-to-deploy-a-rails-app-with-passenger-and-nginx-on-ubuntu-14-04) 或 [Unicorn] (https://andsky.com/tech/tutorials/how-to-deploy-a-rails-app-with-unicorn-and-nginx-on-ubuntu-14-04), 它可以使您的 Rails 应用程序同时处理请求 。 由于"美洲豹"并非设计由用户直接访问,我们将用"Nginx"作为倒置代用符来缓冲用户与您Rails应用程序之间的请求和响应.

前提条件

本教程假设您有一个 Ubuntu 14.04 服务器,安装了以下软件,在将部署应用程序的用户:

如果您尚未安装此设置,请遵循上文链接的教程,我们将假设您的用户名为 deploy

此外,本教程不涵盖如何设置您的开发或测试环境. 如果您需要帮助,请遵循 [PostgreSQL with Rails 教程]中的示例(https://andsky.com/tech/tutorials/how-to-use-postgresql-with-your-ruby-on-rails-application-on-ubuntu-14-04)。

创建 Rails 应用程序

理想情况下,您已经拥有您想要部署的 Rails 应用程序。如果是这样的情况,您可以跳过本节,并在跟进过程中进行适当的替换。

此命令将创建一个新的 Rails 应用程序,名为appname,将使用 PostgreSQL 作为数据库。

1rails new appname -d postgresql

然后转到应用程序目录:

1cd appname

让我们花一点时间来创建PostgreSQL用户,该用户将被您的Rails应用程序的生产环境使用。

创建生产数据库用户

为了让事情简单,让我们将生产数据库用户命名为你的应用程序名称,例如,如果你的应用程序被称为appname,你应该创建一个 PostgreSQL 用户,如下:

1sudo -u postgres createuser -s appname

我们要设置数据库用户的密码,所以输入 PostgreSQL 控制台如下:

1sudo -u postgres psql

然后为数据库用户设置密码,appname在示例中,如下:

1\password appname

输入您想要的密码并确认它。

使用此命令退出 PostgreSQL 控制台:

1\q

现在,我们已经准备好将您的应用程序配置为适当的数据库连接信息。

配置数据库连接

确保您位于应用程序的根目录(cd ~/appname)。

在您最喜欢的文本编辑器中打开应用程序的数据库配置文件. 我们将使用 vi:

1vi config/database.yml

更新生产部分,以便它看起来像这样:

1production:
2  <<: *default
3  host: localhost
4  adapter: postgresql
5  encoding: utf8
6  database: appname_production
7  pool: 5
8  username: <%= ENV['APPNAME_DATABASE_USER'] %>
9  password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>

请注意,数据库用户名和密码被配置为可通过环境变量读取,即APPNAME_DATABASE_USERAPPNAME_DATABASE_PASSWORD。 将生产密码和密码保存在应用程序代码库之外的最佳做法,因为如果您使用Git等分布式版本控制系统,它们可以很容易被曝光。

保存和退出。

安装 rbenv-vars 插件

在部署生产 Rails 应用程序之前,您应该使用环境变量设置生产秘密密钥和数据库密码. 一个简单的方法来管理环境变量,我们可以在运行时将密码和秘密加载到我们的应用程序中,是使用 rbenv-vars 插件。

要安装 rbenv-vars 插件,只需转到 .rbenv/plugins 目录并从 GitHub 克隆它。

1cd ~/.rbenv/plugins
2git clone https://github.com/sstephenson/rbenv-vars.git

设置环境变量

现在安装了 rbenv-vars 插件,让我们设置所需的环境变量。

首先,生成秘密密钥,该密钥将用于验证已签名的cookie的完整性:

1cd ~/appname
2rake secret

复制生成的秘密密密钥,然后使用您最喜欢的编辑器打开 .rbenv-vars 文件。

1vi .rbenv-vars

您在这里设置的任何环境变量都可以通过您的 Rails 应用程序读取。

首先,将):

1SECRET_KEY_BASE=your_generated_secret

接下来,将):

1APPNAME_DATABASE_USER=appname

最后,将):

1APPNAME_DATABASE_PASSWORD=prod_db_pass

保存和退出。

您可以通过运行此命令查看哪些环境变量为您的应用程序设置了 rbenv-vars 插件:

1rbenv vars

如果你更改了你的秘密密码或数据库密码,请更新你的 `.dll 文件. 请小心保持这个文件私密,不要包括任何公共代码存储库。

创建生产数据库

现在您的应用程序已配置为与您的 PostgreSQL 数据库进行交谈,让我们创建生产数据库:

1RAILS_ENV=production rake db:create

创建控制器

如果您跟随示例,我们将生成一个支架控制器,所以我们的应用程序将有东西要看:

1rails generate scaffold Task title:string note:text

现在运行此命令来更新生产数据库:

1RAILS_ENV=production rake db:migrate

您还应该预编译资产:

1RAILS_ENV=production rake assets:precompile

要测试您的应用程序是否有效,您可以运行生产环境,并将其绑定到您的服务器的公共IP地址(取代您的服务器的公共IP地址):

1RAILS_ENV=production rails server --binding=server_public_IP

现在,请在 Web 浏览器中访问此 URL:

1http://server_public_IP:3000/tasks

如果它正常工作,你应该看到这个页面:

Tasks controller

回到您的 Rails 服务器,然后按Ctrl-c来停止应用程序。

安装puma

现在我们已经准备好安装Puma了。

一个简单的方法是将其添加到您的应用程序的):

1vi Gemfile

在文件的末尾,添加Puma宝石这个行:

1gem 'puma'

保存和退出。

要安装 Puma 和任何突出依赖,请运行 Bundler:

1bundle

Puma 已安装,但我们需要配置它。

配置 Puma

在配置 Puma 之前,您应该查看您的服务器有多少 CPU 核心,您可以轻松地使用以下命令:

1grep -c processor /proc/cpuinfo

现在,让我们将我们的 Puma 配置添加到 config/puma.rb. 在文本编辑器中打开文件:

1vi config/puma.rb

复制并粘贴此配置到文件中:

 1# Change to match your CPU core count
 2workers 2
 3
 4# Min and Max threads per worker
 5threads 1, 6
 6
 7app_dir = File.expand_path("../..", __FILE__)
 8shared_dir = "#{app_dir}/shared"
 9
10# Default to production
11rails_env = ENV['RAILS_ENV'] || "production"
12environment rails_env
13
14# Set up socket location
15bind "unix://#{shared_dir}/sockets/puma.sock"
16
17# Logging
18stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true
19
20# Set master PID and state locations
21pidfile "#{shared_dir}/pids/puma.pid"
22state_path "#{shared_dir}/pids/puma.state"
23activate_control_app
24
25on_worker_boot do
26  require "active_record"
27  ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
28  ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
29end

將「員工」的數量改為您的伺服器的CPU核心數量。

这将Puma配置为您的应用程序的位置,以及其插槽,日志和PID的位置. 您可以自由地修改文件或添加您需要的任何其他选项。

现在创建在配置文件中提到的目录:

1mkdir -p shared/pids shared/sockets shared/log

创建 Puma Upstart 脚本

让我们创建一个Upstart init脚本,以便我们可以轻松启动和停止Puma,并确保它在启动时启动。

从 Puma GitHub 存储库下载 Jungle Upstart 工具到您的主目录:

1cd ~
2wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
3wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf

现在打开所提供的 puma.conf 文件,这样我们就可以配置 Puma 部署用户:

1vi puma.conf

寻找指定setuidsetgid的两个行,并用部署用户和组的名称代替应用程序

1setuid deploy
2setgid deploy

保存和退出。

现在将脚本复制到Upstart服务目录:

1sudo cp puma.conf puma-manager.conf /etc/init

「puma-manager.conf」脚本引用了它应该管理的应用程序的 `/etc/puma.conf。

1sudo vi /etc/puma.conf

此檔案中的每行都應該是您希望「puma-manager」管理的應用程式的路徑。

1/home/deploy/appname

保存和退出。

现在您的应用程序已配置为在启动时启动,通过Upstart. 这意味着您的应用程序即使在您的服务器重新启动后也会启动。

手动启动 Puma 应用程序

要现在启动所有管理的 Puma 应用程序,请运行此命令:

1sudo start puma-manager

您还可以使用puma Upstart 脚本启动单个 Puma 应用程序,如下:

1sudo start puma app=/home/deploy/appname

您也可以使用停止重新启动来控制应用程序,如下:

1sudo stop puma-manager
2sudo restart puma-manager

现在,您的 Rails 应用程序的生产环境在 Puma 下运行,并且在 shared/sockets/puma.sock 接口上聆听。

安装和配置 Nginx

使用 apt-get 安装 Nginx:

1sudo apt-get install nginx

现在用文本编辑器打开默认服务器块:

1sudo vi /etc/nginx/sites-available/default

用下列代码块替换文件的内容. 请确保用相应的用户名和应用程序名称(两个位置)替换突出部分:

 1upstream app {
 2    # Path to Puma SOCK file, as defined previously
 3    server unix:/home/deploy/appname/shared/sockets/puma.sock fail_timeout=0;
 4}
 5
 6server {
 7    listen 80;
 8    server_name localhost;
 9
10    root /home/deploy/appname/public;
11
12    try_files $uri/index.html $uri @app;
13
14    location @app {
15        proxy_pass http://app;
16        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
17        proxy_set_header Host $http_host;
18        proxy_redirect off;
19    }
20
21    error_page 500 502 503 504 /500.html;
22    client_max_body_size 4G;
23    keepalive_timeout 10;
24}

这将 Nginx 配置为反向代理,以便HTTP请求通过Unix插件传送到Puma应用程序服务器。

重新启动 Nginx 以执行这些更改:

1sudo service nginx restart

现在,您的 Rails 应用程序的生产环境可以通过您的服务器的公共 IP 地址或 FQDN 访问。

1http://server_public_IP/tasks

您应该看到您第一次测试应用程序时看到的相同页面,但现在它正在通过 Nginx 和 Puma 提供服务。

结论

恭喜您!您已使用 Nginx 和 Puma 部署 Ruby on Rails 应用程序的生产环境。

如果你想改进你的生产 Rails 应用程序部署,你应该检查我们的教程系列在 如何使用 Capistrano 自动部署. 该系列是基于CentOS,但它仍然应该有助于自动化你的部署。

Published At
Categories with 技术
comments powered by Disqus