介绍
当你准备好部署你的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_USER
和APPNAME_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
如果它正常工作,你应该看到这个页面:
回到您的 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
寻找指定setuid
和setgid
的两个行,并用部署用户和组的名称代替应用程序
。
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,但它仍然应该有助于自动化你的部署。