介绍
当您准备好部署Ruby on Rails应用程序时,有许多有效的设置要考虑。 本教程将帮助您使用Puma和Nginx在Ubuntu 14.04上部署您的Ruby on Rails应用程序的生产环境,使用PostgreSQL作为数据库。
Puma是一个应用服务器,如Passenger或Unicorn ,使您的Rails应用程序可以并发处理的请求。 由于Puma不是设计为由用户直接访问,我们将使用Nginx作为反向代理,将缓冲用户和您的Rails应用程序之间的请求和响应。
先决条件
本教程假设您有一个Ubuntu 14.04服务器,安装了以下软件,将部署应用程序的用户:
如果您没有设置,请按照上面链接的教程。 我们假设你的用户称为部署 。
此外,本教程不介绍如何设置开发或测试环境。 如果您需要提供帮助的,请在该示例使用Rails教程PostgreSQL的 。
创建Rails应用程序
理想情况下,您已经有一个要部署的Rails应用程序。 如果是这种情况,您可以跳过此部分,并在跟随时进行适当的替换。 如果没有,第一步是创建一个使用PostgreSQL作为其数据库的新Rails应用程序。
此命令将创建一个名为“appname”的新Rails应用程序,它将使用PostgreSQL作为数据库。 随意替换突出显示的“appname”用别的东西:
rails new appname -d postgresql
然后切换到应用程序目录:
cd appname
让我们花一点时间来创建将由Rails应用程序的生产环境使用的PostgreSQL用户。
创建生产数据库用户
为了简单起见,让我们将生产数据库用户命名为应用程序名称。 例如,如果您的应用程序被称为“appname”,您应该创建一个PostgreSQL用户,如下所示:
sudo -u postgres createuser -s appname
我们要设置数据库用户的密码,因此输入PostgreSQL控制台如下:
sudo -u postgres psql
然后在示例中设置数据库用户的密码,“appname”,如下所示:
\password appname
输入所需的密码并确认。
使用以下命令退出PostgreSQL控制台:
\q
现在,我们准备好使用正确的数据库连接信息配置您的应用程序。
配置数据库连接
请确保你在你的应用程序的根目录( cd ~/ appname
)。
在您喜欢的文本编辑器中打开应用程序的数据库配置文件。 我们将使用vi:
vi config/database.yml
更新production
部分,所以它看起来是这样的:
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_USER
和APPNAME _DATABASE_PASSWORD
。 将生产密码和秘密保留在应用程序代码库之外是最佳做法,因为如果您使用的是分布式版本控制系统(如Git),它们可以轻松暴露出来。 我们将讨论如何使用环境变量设置数据库认证。
保存并退出。
安装rbenv-vars插件
在部署生产Rails应用程序之前,应该使用环境变量设置生产密钥和数据库密码。 一个简单的方法来管理环境变量,我们可以在运行时使用密码和秘密加载到我们的应用程序,是使用rbenv -瓦尔插件。
要安装rbenv -瓦尔插件,只需切换到.rbenv/plugins
目录,并从GitHub克隆。 例如,如果rbenv安装在您的主目录中,请运行以下命令:
cd ~/.rbenv/plugins
git clone https://github.com/sstephenson/rbenv-vars.git
设置环境变量
现在安装了rbenv-vars插件,让我们设置所需的环境变量。
首先,生成秘密密钥,将用于验证签名的cookie的完整性:
cd ~/appname
rake secret
复制生成的密钥,然后打开.rbenv-vars
用你喜欢的编辑器文件。 我们将使用vi:
vi .rbenv-vars
您在此设置的任何环境变量都可以由Rails应用程序读取。
首先,设置SECRET_KEY_BASE
这样的变量(替换您刚才生成和复制的秘密高亮文本):
SECRET_KEY_BASE=your_generated_secret
接下来,设置APPNAME _DATABASE_USER
这样的变量(与你的应用程序名称替换突出了“APPNAME”和“应用程序名称”与您的生产数据库的用户名):
APPNAME_DATABASE_USER=appname
最后,设置APPNAME _DATABASE_PASSWORD
这样的变量(与你的应用程序名称替换突出了“APPNAME”和“prod_db_pass”与您的生产数据库的用户密码):
APPNAME_DATABASE_PASSWORD=prod_db_pass
保存并退出。
您可以通过运行以下命令,使用rbenv-vars插件查看为应用程序设置的环境变量:
rbenv vars
如果你改变你的秘密,数据库密码,更新.rbenv-vars
文件。 请小心保持此文件为私有,并且不要包含任何公共代码存储库。
创建生产数据库
现在您的应用程序配置为与您的PostgreSQL数据库通信,让我们创建生产数据库:
RAILS_ENV=production rake db:create
生成控制器
如果你跟着这个例子,我们将生成一个scaffold控制器,所以我们的应用程序将有一些东西看看:
rails generate scaffold Task title:string note:text
现在运行此命令来更新生产数据库:
RAILS_ENV=production rake db:migrate
您还应预先编译资产:
RAILS_ENV=production rake assets:precompile
要测试应用程序是否工作,可以运行生产环境,并将其绑定到服务器的公共IP地址(替换服务器的公共IP地址):
RAILS_ENV=production rails server --binding=server_public_IP
现在,在网络浏览器中访问此网址:
http://server_public_IP:3000/tasks
如果它正常工作,你应该看到这个页面:
回到你的Rails的服务器,然后按Ctrl-c
停止应用程序。
安装Puma
现在我们准备安装Puma了。
一个简单的方法做,这是将它添加到您的应用程序Gemfile
。 在您喜欢的编辑器中打开Gemfile(确保您在应用程序的根目录中):
vi Gemfile
在文件的末尾,添加Puma gem这行:
gem 'puma'
保存并退出。
要安装Puma和任何显着的依赖关系,请运行Bundler:
bundle
Puma现在已安装,但我们需要配置它。
配置Puma
在配置Puma之前,您应该查找服务器具有的CPU核心数。 你可以很容易地用这个命令:
grep -c processor /proc/cpuinfo
现在,让我们添加Puma配置, config/puma.rb
。 在文本编辑器中打开文件:
vi config/puma.rb
将此配置复制并粘贴到文件中:
# 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的位置。 随意修改文件,或添加您需要的任何其他选项。
现在创建配置文件中引用的目录:
mkdir -p shared/pids shared/sockets shared/log
创建Puma Upstart脚本
让我们创建一个Upstart init脚本,以便我们可以轻松地启动和停止Puma,并确保它将在启动时启动。
从Puma GitHub存储库下载Jungle Upstart工具到您的主目录:
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部署用户:
vi puma.conf
寻找指定的两条线setuid
和setgid
,并与您的部署用户和组的名称替换“应用”。 例如,如果您的部署用户名为“deploy”,则行应如下所示:
setuid deploy
setgid deploy
保存并退出。
现在将脚本复制到Upstart服务目录:
sudo cp puma.conf puma-manager.conf /etc/init
在puma-manager.conf
脚本引用/etc/puma.conf
的,它应该管理的应用程序。 让我们现在创建和编辑该库存文件:
sudo vi /etc/puma.conf
在这个文件中的每一行应该是路径到您想要的应用程序puma-manager
来管理。 现在添加到应用程序的路径。 例如:
/home/deploy/appname
保存并退出。
现在您的应用程序配置为在引导时通过Upstart启动。 这意味着即使您的服务器重新启动后,您的应用程序也将启动。
手动启动Puma应用程序
要立即启动所有受管理的Puma应用程序,请运行以下命令:
sudo start puma-manager
您也可以通过启动一个单独的应用程序Pumapuma
Upstart脚本,如下所示:
sudo start puma app=/home/deploy/appname
您也可以使用stop
和restart
控制应用程序,就像这样:
sudo stop puma-manager
sudo restart puma-manager
现在,您的Rails应用程序的生产环境下Puma运行,它监听的shared/sockets/puma.sock
插座。 在您的应用程序可供外部用户访问之前,您必须设置Nginx反向代理。
安装和配置Nginx
使用apt-get安装Nginx:
sudo apt-get install nginx
现在使用文本编辑器打开默认服务器块:
sudo vi /etc/nginx/sites-available/default
使用以下代码块替换文件的内容。 请务必使用适当的用户名和应用程序名称(两个位置)替换突出显示的部分:
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以使更改生效:
sudo service nginx restart
现在您的Rails应用程序的生产环境可通过您的服务器的公共IP地址或FQDN访问。 要访问我们之前创建的任务控制器,请在Web浏览器中访问应用程序服务器:
http://server_public_IP/tasks
您应该看到您第一次测试应用程序时看到的页面,但现在它通过Nginx和Puma提供。
结论
恭喜! 您已经使用Nginx和Puma部署了您的Ruby on Rails应用程序的生产环境。
如果您正在寻找提高你的生产Rails应用程序的部署,你应该看看我们的教程系列如何使用Capistrano的来自动化部署 。 该系列基于CentOS,但它仍然有助于自动化您的部署。