前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上使用Puma和Nginx部署Rails应用程序

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

原创
作者头像
宇cccc
修改2018-09-26 17:16:07
5.3K0
修改2018-09-26 17:16:07
举报

介绍

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

Puma是一个应用服务器,如Passenger或Unicorn,它使您的Rails应用程序能够同时处理请求。由于Puma不是为用户直接访问而设计的,因此我们将使用Nginx作为反向代理,以缓冲用户与Rails应用程序之间的请求和响应。

准备

本教程假定您将在部署应用程序的用户上安装了安装了以下软件的Ubuntu 14.04服务器:

  • 使用rbenv安装Ruby on Rails
  • PostgreSQL与Rails

我们假设您的用户名为deploy

你可能需要一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

自建服务器难免会遇到这样的问题,配置SSL很麻烦,虽然对一部分人来说这也是一种乐趣,但是如果您在生产环境使用,我还是建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。

创建Rails应用程序

理想情况下,您已经拥有了要部署的Rails应用程序。如果是这种情况,您可以跳过本节,并在跟随时进行适当的替换。如果没有,第一步是创建一个使用PostgreSQL作为其数据库的新Rails应用程序。

此命令将创建一个名为“appname”的新Rails应用程序,该应用程序将使用PostgreSQL作为数据库。随意替换突出显示的“appname”与其他东西:

代码语言:javascript
复制
rails new appname -d postgresql

然后切换到应用程序目录:

代码语言:javascript
复制
cd appname

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

创建生产数据库用户

为了简单起见,我们将生产数据库用户命名为与您的应用程序名称相同。例如,如果您的应用程序名为“appname”,则应创建一个PostgreSQL用户,如下所示:

代码语言:javascript
复制
sudo -u postgres createuser -s appname

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

代码语言:javascript
复制
sudo -u postgres psql

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

代码语言:javascript
复制
\password appname

输入所需的密码并确认。

使用以下命令退出PostgreSQL控制台:

代码语言:javascript
复制
\q

现在,我们已准备好使用正确的数据库连接信息配置您的应用程序。

配置数据库连接

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

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

代码语言:javascript
复制
vi config/database.yml

更新该production部分,使其看起来像这样:

代码语言:javascript
复制
production:
  <<: *default
  host: localhost
  adapter: postgresql
  encoding: utf8
  database: appname_production
  pool: 5
  username: <%= ENV['APPNAME_DATABASE_USER'] %>
  password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>

请注意,数据库用户名和密码配置为由环境变量读取, APPNAME_DATABASE_USERAPPNAME_DATABASE_PASSWORD。将生产密码和机密保存在应用程序代码库之外被认为是最佳实践,因为如果您使用的是分布式版本控制系统(如Git),它们很容易暴露出来。接下来我们将讨论如何使用环境变量设置数据库身份验证。

保存并退出。

安装rbenv-vars插件

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

要安装rbenv-vars插件,只需更改到.rbenv/plugins目录并从GitHub克隆它。例如,如果在主目录中安装了rbenv,请运行以下命令:

代码语言:javascript
复制
cd ~/.rbenv/plugins
git clone https://github.com/sstephenson/rbenv-vars.git

设置环境变量

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

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

代码语言:javascript
复制
cd ~/appname
rake secret

复制生成的密钥,然使用您喜欢的编辑器打开该后.rbenv-vars文件。我们将使用vi:

代码语言:javascript
复制
vi .rbenv-vars

您在此处设置的任何环境变量都可以由Rails应用程序读取。

首先,像这样设置SECRET_KEY_BASE变量(用你刚刚生成和复制的秘密替换“=”后的文本):

代码语言:javascript
复制
SECRET_KEY_BASE=your_generated_secret

接下来,像这样设置APPNAME_DATABASE_USER变量(用你的应用程序名称替换突出显示的“APPNAME”,用你的生产数据库用户名替换“appname”):

代码语言:javascript
复制
APPNAME_DATABASE_USER=appname

最后,像这样设置APPNAME_DATABASE_PASSWORD变量(用你的应用程序名称替换突出显示的“APPNAME”,用生产数据库用户密码替换“prod_db_pass”):

代码语言:javascript
复制
APPNAME_DATABASE_PASSWORD=prod_db_pass

保存并退出。

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

代码语言:javascript
复制
rbenv vars

如果您更改了密码或数据库密码,请更新您的.rbenv-vars文件。请小心保持此文件的私密性,并且不要将其包含在任何公共代码存储库中。

创建生产数据库

既然您的应用程序已配置为与PostgreSQL数据库通信,那么让我们创建生产数据库:

代码语言:javascript
复制
RAILS_ENV=production rake db:create

生成控制器

如果您跟随示例,我们将生成一个脚手架控制器,以便我们的应用程序可以查看:

代码语言:javascript
复制
rails generate scaffold Task title:string note:text

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

代码语言:javascript
复制
RAILS_ENV=production rake db:migrate

您还应该预编译资产:

代码语言:javascript
复制
RAILS_ENV=production rake assets:precompile

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

代码语言:javascript
复制
RAILS_ENV=production rails server --binding=server_public_IP

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

代码语言:javascript
复制
http://server_public_IP:3000/tasks

如果它正常工作,您应该看到此页面:

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

安装Puma

现在我们准备安装Puma了。

一种简单的方法是将其添加到您的应用程序中的Gemfile。在您喜欢的编辑器中打开Gemfile(确保您在应用程序的根目录中):

代码语言:javascript
复制
vi Gemfile

在文件的末尾,使用以下行添加Puma gem:

代码语言:javascript
复制
gem 'puma'

保存并退出。

要安装Puma以及任何未完成的依赖项,请运行Bundler:

代码语言:javascript
复制
bundle

Puma现已安装,但我们需要对其进行配置。

配置Puma

在配置Puma之前,您应该查找服务器具有的CPU核心数。您可以使用此命令轻松完成此操作:

代码语言:javascript
复制
grep -c processor /proc/cpuinfo

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

代码语言:javascript
复制
vi config/puma.rb

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

代码语言:javascript
复制
# Change to match your CPU core count
workers 2
​
# Min and Max threads per worker
threads 1, 6
​
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
​
# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env
​
# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"
​
# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true
​
# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
activate_control_app
​
on_worker_boot do
  require "active_record"
  ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
  ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end

更改workers服务器的CPU核心数。

保存并退出。这会将Puma配置为应用程序的位置,以及其套接字,日志和PID的位置。随意修改文件,或添加您需要的任何其他选项。

现在创建配置文件中引用的目录:

代码语言:javascript
复制
mkdir -p shared/pids shared/sockets shared/log

创建Puma Upstart脚本

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

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

代码语言:javascript
复制
cd ~
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf

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

代码语言:javascript
复制
vi puma.conf

寻找指定的两行setuidsetgid,并与您的部署用户和组的名称替换“应用程序”。例如,如果您的部署用户名为“deploy”,则行应如下所示:

代码语言:javascript
复制
setuid deploy
setgid deploy

保存并退出。

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

代码语言:javascript
复制
sudo cp puma.conf puma-manager.conf /etc/init

puma-manager.conf脚本在它应该管理的应用程序引用了/etc/puma.conf。我们现在创建并编辑该库存文件:

代码语言:javascript
复制
sudo vi /etc/puma.conf

此文件中的每一行都应该是您要puma-manager管理的应用程序的路径。立即将路径添加到您的应用程序。例如:

代码语言:javascript
复制
/home/deploy/appname

保存并退出。

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

手动启动Puma应用程序

要立即启动所有托管Puma应用程序,请运行以下命令:

代码语言:javascript
复制
sudo start puma-manager

您也可以使用pumaUpstart脚本启动单个Puma应用程序,如下所示:

代码语言:javascript
复制
sudo start puma app=/home/deploy/appname

您也可以使用stoprestart控制应用程序,如下所示:

代码语言:javascript
复制
sudo stop puma-manager
sudo restart puma-manager

现在你的Rails应用程序的生产环境在Puma下运行,它正在监听shared/sockets/puma.sock套接字。在您的应用程序可供外部用户访问之前,您必须设置Nginx反向代理。

安装和配置Nginx

使用apt-get安装Nginx:

代码语言:javascript
复制
sudo apt-get install nginx

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

代码语言:javascript
复制
sudo vi /etc/nginx/sites-available/default

使用以下代码块替换文件的内容。请务必使用适当的用户名和应用程序名称(两个位置)替换突出显示的部分:

代码语言:javascript
复制
upstream app {
    # Path to Puma SOCK file, as defined previously
    server unix:/home/deploy/appname/shared/sockets/puma.sock fail_timeout=0;
}

server {
    listen 80;
    server_name localhost;

    root /home/deploy/appname/public;

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

保存并退出。这将Nginx配置为反向代理,因此HTTP请求通过Unix套接字转发到Puma应用程序服务器。您可以根据需要随意进行任何更改。

重新启动Nginx以使更改生效:

代码语言:javascript
复制
sudo service nginx restart

现在可以通过服务器的公共IP地址或FQDN访问Rails应用程序的生产环境。要访问我们之前创建的Tasks控制器,请在Web浏览器中访问您的应用程序服务器:

代码语言:javascript
复制
http://server_public_IP/tasks

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

结论

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

更多Ubuntu教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Deploy a Rails App with Puma and Nginx on Ubuntu 14.04》

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 创建Rails应用程序
  • 创建生产数据库用户
  • 配置数据库连接
  • 安装rbenv-vars插件
    • 设置环境变量
    • 创建生产数据库
      • 生成控制器
      • 安装Puma
      • 配置Puma
      • 创建Puma Upstart脚本
        • 手动启动Puma应用程序
        • 安装和配置Nginx
        • 结论
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档