介绍
DigitalOcean的Ruby on Rails一键式应用程序提供了一种方便的方式让您的Rails应用程序在Ubuntu服务器上运行。 与Nginx,Unicorn和Postgres所有预装,一键式是托管您的应用程序的一个伟大的基础。 本教程将给你所有的细节,让你的项目离开地面。
包括组件
除了一个普通的Ubuntu 14.04 Droplet,Ruby on Rails一键式图像包括以下组件:
- Ruby2.2:Ruby语言的支持,安装了RVM
- 导轨4:Rails Web框架的Gem
- PostgreSQL的 :生产Rails应用程序部署中最常用的数据库服务器
- 麒麟 :Rails应用服务器
- nginx的 :其被配置为反向代理向Unicorn通用HTTP服务器
它也可以预先配置系统用户和数据库用户,无论是命名为轨道 ,这是用来部署应用程序。 为方便起见, git
软件包安装在图像上。
在短短的一点,我们就进入了组件的细节配置,这里的登录名和密码可以发现,以及如何启动应用程序。
创建你的Ruby on Rails Droplet
如果你还没有这样做,创建从DigitalOcean控制面板Droplet,然后选择on Rails的Ruby的14.04上的一键式应用程序镜像。 我们将指导您完成这些步骤。
注意:如果您已经创建与Ruby on Rails的一个Droplet的14.04图像,你应该跳过这一节。
首先,登录到DigitalOcean控制面板 。
然后点击创建按钮Droplet 。
在Droplet创建页面上,指定所需的主机名和大小。 对于不接收大量通信基本应用程序,1GB的Droplet要细:
选择您所需的地区:
现在,在选择图片部分,单击应用程序选项卡,然后选择on Rails的Ruby的14.04上的图像:
接下来,选择任何其他设置,如专用网络,IPv6或备份。
最后,选择哪个SSH密钥,如果有的话,你要使用访问该Droplet,然后点击Create按钮Droplet 。
你的Ruby on Rails Droplet将很快准备就绪。 有关创建Droplet的更多详细信息,请查看本教程: 如何创建自己的第DigitalOceanDroplet 。
如何访问您的Ruby on Rails Droplet
一旦你的Droplet创建,你可以通过两种方式访问它:
- 作为运行Rails应用程序的用户,通过在Web浏览器中访问Droplet的IP地址
- 作为服务器管理员,通过连接作为
root
通过SSH用户。 此方法将用于部署您的应用程序
您Droplet的公网IP地址,可以在中找到DigitalOcean控制面板 。
检查占位符Rails应用程序
一键式应用程序附带一个应该在默认情况下运行的占位符Rails应用程序。 要查看示例Rails应用程序是否正在运行,请在Web浏览器中访问Droplet的公共IP地址。
例如,假设你的Droplet的IP地址是111.111.111.111
。 在这种情况下,你会打开http:// 111.111.111.111
在Web浏览器来验证Rails的运行:
如果您看到示例Rails页面,则可以登录到服务器。
通过SSH访问Droplet
要部署自己的Rails应用程序,您需要连接到您的Droplet为root
通过SSH。 让我们现在做吧。
注意:如果你以前没有使用SSH或PuTTY,您可能要参考本教程的详细信息: 如何连接到你的SSHDroplet 。
在电脑上,打开一个终端并登录到您的Droplet作为root
通过SSH使用此命令(替换您Droplet的IP地址):
ssh root@droplet.ip.address
如果提示您输入密码,请输入在创建Droplet时通过电子邮件发送给您的密码。 或者,如果您使用SSH密钥设置Droplet,则密钥将用于身份验证。
登录名和密码
Ruby on Rails一键式应用程序预配置了以下内容:
- 系统用户名为轨 ,其中部署应用程序
- PostgreSQL数据库用户也称为轨道 ,其用于由应用程序连接到数据库
这两个登录的密码是随机生成的,并且可以在每天通过SSH登录服务器时显示的消息(MOTD)中找到。 MOTD应该看起来像这样:
-------------------------------------------------------------------------------------
Thank you for using DigitalOcean's Rails Application.
We have created a default Rails application that can be seen from http://111.111.11.111/
-------------------------------------------------------------------------------------
You can use the following SFTP credentials to upload your webpages (using FileZilla/WinSCP/Rsync):
* Host: 111.111.11.111
* User: rails
* Pass: PzAaUykNL4
-------------------------------------------------------------------------------------
You can use the following Postgres database credentials:
* User: rails
* Pass: temq0AtHj7
-------------------------------------------------------------------------------------
Nginx listens on public IP (111.111.11.111) port 80 and forwards requests to Unicorn on port 8080
Nginx access log is in /var/log/nginx/access.log and error log is in /var/log/nginx/error.log
Unicorn configuration files are in /etc/unicorn.conf and /etc/default/unicorn
Unicorn log is in /var/log/unicorn/unicorn.log
-------------------------------------------------------------------------------------
To get a list of available gems: gem list
To get a list of Rubies: rvm list
To get Gem environment: gem env
-------------------------------------------------------------------------------------
为了简化应用程序的部署,自动生成数据库密码也位于/etc/default/unicorn
文件,作为APP_DATABASE_PASSWORD
环境变量。
如何部署您的Rails应用程序
我们将引导您部署一个我们将从GitHub克隆的示例Rails应用程序。 如果你有自己的部署流程,随意阅读有关一键式应用程序的配置的详细信息,可在发现配置详细信息下面的应用程序部署的例子部分。
总而言之,我们将介绍以下步骤:
- Git克隆你的应用程序
- 配置数据库连接
- 更新您的Gemfile包括
unicorn
和pg
的Gem,并运行打捆 - 运行rake任务
- 配置Unicorn
- 配置Nginx
让我们开始吧。
Git克隆你的应用程序
我们假设你正在登录的root
用户。 我们将演示如何手动部署应用程序, sample_tasks
,从GitHub的信息库。
首先,让我们使用git来克隆要部署到轨用户的主目录下的应用程序。 如果您想部署自己的应用程序,请务必在此处替换您自己的存储库链接:
cd ~rails
git clone https://github.com/thisismitch/sample_tasks.git
这将克隆程序存储库到rails
主目录。 在我们的例子中,这意味着应用程序所在的目录中名为sample_tasks
。
配置数据库连接
现在我们准备配置您的应用程序连接到PostgreSQL数据库。 在这个例子中,我们将简单地复制数据库配置为rails_project
应用到我们的新的应用程序,然后修改它咯。
示例应用程序的复制database.yml
文件到您的应用程序的config
目录,像这样(这里替补多你的应用程序的路径):
cp ~rails/rails_project/config/database.yml ~rails/sample_tasks/config/
该文件中的配置,这将允许应用程序连接到提供PostgreSQL数据库,但是我们使用它之前应该改变数据库的名称。 在编辑器中打开文件(我们将使用nano
这里):
nano ~rails/sample_tasks/config/database.yml
查找“Rails 项目”的每个实例(有三个),并与您的名字替换它应用在我们的例子中,“样品的任务”。 如果您使用nano
,你可以查找和替换的应用程序名称是这样的:按Ctrl-W
然后Ctrl-R
输入“rails_project”,然后Enter
,然后在您的应用程序的名称类型,然后Enter
,然后打A
。
你已经更新了文件后, production
部分应该是这样的(与你的应用程序的名称,而不是强调“sample_tasks”):
production:
<<: *default
database: sample_tasks_production
username: rails
password: <%= ENV['APP_DATABASE_PASSWORD'] %>
保存并退出。 这是Ctrl-O
Enter
,然后Ctrl-X
如果你正在使用nano。
更新Gemfile
如果您的应用程序未配置为使用PostgreSQL和Unicorn,您应该将这些gem添加到Gemfile中。 在编辑器中打开的Gemfile(我们将使用nano
这里):
nano ~rails/sample_tasks/Gemfile
包括了pg
和unicorn
加入这些行Gem:
group :production do
gem 'unicorn'
gem 'pg'
end
记下指定的Ruby版本。
保存并退出。
注意:如果您的Gemfile指定版本的Ruby,它是从一个被安装在系统上的不同,你可以使用RVM安装。 例如,Gemfile示例指定了Ruby 2.0.0,因此我们可以这样安装:
rvm install 2.0.0
rvm use ruby-2.0.0-p643 --default
现在切换到应用程序的目录并运行bundler:
cd ~rails/sample_tasks && bundle install
运行Rake任务
我们已经准备好运行我们的rake
任务,但我们需要设置我们的PostgreSQL数据库用户的密码环境。 为了做到这一点,我们需要源/etc/default/unicorn
文件(这个细节,可以在发现配置详细信息部分)使用此命令:
. /etc/default/unicorn
现在运行你的rake任务。 在我们的示例中,我们将创建生产数据库,运行任何迁移,然后预编译我们的资产:
RAILS_ENV=production rake db:create
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake assets:precompile
在这一点上,你可能需要更改应用程序文件到导轨用户的所有权:
chown -R rails: /home/rails/sample_tasks
配置Unicorn
现在我们需要更新Unicorn配置文件以指向我们的应用程序的路径。 打开/etc/unicorn.conf
文件进行编辑:
nano /etc/unicorn.conf
查找指定行working_directory
,并取代其与应用程序的路径值。 您可以使用我们用于数据库配置文件的相同的查找和替换技巧。 完成后,该行应该看起来像这样(使用应用程序的实际路径):
working_directory "/home/rails/sample_tasks"
保存并退出。
接下来,编辑/etc/default/unicorn
文件:
nano /etc/default/unicorn
查找指定线路APP_ROOT
,并更新指向您的应用程序。 同样,这是一个问题,找到并替换“rails_project”与您的应用程序的名称。 完成后,该行应如下所示:
APP_ROOT=/home/rails/sample_tasks
应用程序已准备就绪。 重新启动Unicorn加载它:
service unicorn restart
我们的应用程序部署几乎完成。 我们只需要稍微重新配置Nginx。
更新Nginx配置
Nginx的,这是作为一个反向代理Unicorn,需要知道你的应用程序的路径public
目录。 使用此命令打开Nginx配置文件:
nano /etc/nginx/sites-enabled/rails
查找指定行root
,并改变它,所以它指向您的应用程序的public
目录。 同样,这是一个问题,用您的应用程序的名称替换“rails_project”。 完成后,该行应该看起来像这样:
root /home/rails/sample_tasks/public;
保存并退出。
现在重新加载Nginx以使更改生效:
service nginx reload
访问您的Rails应用程序
您现在应该能够在Web浏览器访问您的Droplet的公网IP地址来访问你的应用程序: http:// droplet.ip.address
。 如果按照这个例子正好,你会希望通过去`来访问它http:// droplet.ip.address /tasks
,因为它没有一个默认的索引页。
恭喜您部署了您的Ruby on Rails应用程序!
如果你想了解更多关于你的Droplet的设置,或进一步定制,强烈建议你阅读下一部分。
配置详细信息
Rails项目由Unicorn提供服务,它监听unix套接字,由Nginx反向代理,监听端口80。
Nginx
nginx的配置是位于/etc/nginx/sites-enabled/rails
。 该root
指令应设置为你的应用程序的目录。 您可以自定义它以添加SSL证书,并根据需要添加其他上游服务器:
upstream app_server {
server unix:/var/run/unicorn.sock fail_timeout=0;
}
server {
listen 80;
root /home/rails/rails_project/public;
server_name _;
index index.htm index.html;
location / {
try_files $uri/index.html $uri.html $uri @app;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
try_files $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_server;
}
}
一旦接收Nginx的端口80上的请求,它服务于静态内容,如图像,将请求转发给Unicorn,它监听在Unix套接字/var/run/unicorn.sock
。
Unicorn
Unicorn是用来为Ruby on Rails应用,并期待在指定的文件working_directory
,这是设置/home/rails/ rails_project
默认。 这应该更新到您的应用程序的路径。
我们增加了在最小的Unicorn配置/etc/unicorn.conf
它指定套接字的路径来听,多少工人产卵,以及在何处存储日志文件:
listen "unix:/var/run/unicorn.sock"
worker_processes 4
user "rails"
working_directory "/home/rails/rails_project"
pid "/var/run/unicorn.pid"
stderr_path "/var/log/unicorn/unicorn.log"
stdout_path "/var/log/unicorn/unicorn.log"
另一个重要的配置文件是/etc/default/unicorn
并指定配置文件的位置,更重要的是,Ruby,Gem,和守护进程的路径,以及随机产生的SECRET_KEY_BASE
和APP_DATABASE_PASSWORD
。 您将需要更新APP_ROOT
指定应用程序的路径:
# Change paramentres below to appropriate values and set CONFIGURED to yes.
CONFIGURED=yes
# Default timeout until child process is killed during server upgrade,
# it has *no* relation to option "timeout" in server's config.rb.
TIMEOUT=60
# Path to your web application, sh'ld be also set in server's config.rb,
# option "working_directory". Rack's config.ru is located here.
APP_ROOT=/home/rails/rails_project
# Server's config.rb, it's not a rack's config.ru
CONFIG_RB=/etc/unicorn.conf
# Where to store PID, sh'ld be also set in server's config.rb, option "pid".
PID=/var/run/unicorn.pid
RAILS_ENV="production"
UNICORN_OPTS="-D -c $CONFIG_RB -E $RAILS_ENV"
PATH=/usr/local/rvm/rubies/ruby-2.2.1/bin:/usr/local/sbin:/usr/bin:/bin:/sbin:/usr/local/rvm/bin:/usr/local/rvm/gems/ruby-2.2.1@global/bin:/usr/local/rvm/gems/ruby-2.2.1/bin/
export GEM_HOME=/usr/local/rvm/gems/ruby-2.2.1
export GEM_PATH=/usr/local/rvm/gems/ruby-2.2.1:/usr/local/rvm/gems/ruby-2.2.1@global
DAEMON=/usr/local/rvm/gems/ruby-2.2.1/bin/unicorn
# Generate by running `rake -f /home/rails/Rakefile secret`
export SECRET_KEY_BASE=e9a806f70df01968fdda069f009690b2a09a168e5b495aed217090a8cb5ef4b76f82d7efa430409c968996ffa43ef9393d4e1cdb82dc7549cc8fcd2beb0d0338
export APP_DATABASE_PASSWORD=temq0AtHj7
Ruby版本管理器
由于一些Rails应用程序可能需要不同的Ruby版本,我们使用Ruby版本管理器(rvm)来安装Ruby。
这允许您在服务器上安装多个Ruby版本,然后由不同的应用程序使用。
目前, Ruby版本2.2.1用作默认版本。
如果您的应用程序需要不同版本的Ruby,例如2.0.0,您可以使用RVM安装:
rvm install 2.0.0
要使用RVM修改默认Ruby版本,请使用:
rvm use ruby-2.0.0-p643 --default
您可以通过运行命令获取已知的Ruby版本的列表rvm list known
如果你想安装最新的Ruby当前可用:
rvm install ruby --latest
rvm use ruby --latest --default
如果你改变了Ruby版本,你也需要更新Unicorn在配置/etc/default/unicorn
和修改已安装的Ruby版本的路径。 了解Ruby在哪里:
Example terminal:root@rails:~# which ruby
/usr/local/rvm/rubies/ruby-2.0.0-p643/bin/ruby
root@rails-testing:~# rvm list
rvm rubies
=> ruby-2.0.0-p643 [ x86_64 ]
* ruby-2.2.1 [ x86_64 ]
# => - current
# =* - current && default
# * - default
root@rails:~# rvm use ruby-2.2.1 --default
Using /usr/local/rvm/gems/ruby-2.2.1
root@rails:~# rvm list
rvm rubies
ruby-2.0.0-p643 [ x86_64 ]
=* ruby-2.2.1 [ x86_64 ]
# => - current
# =* - current && default
# * - default
root@rails:~# which ruby
/usr/local/rvm/rubies/ruby-2.2.1/bin/ruby
root@rails:~# ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]
你还应该为新的Ruby安装安装Unicorn,Rails和Bundler gem:
gem install bundler rails unicorn
一旦你有你默认情况下,更改使用Ruby的位置/etc/default/unicorn
路径名,包括/usr/local/rvm/rubies
子文件夹, /usr/local/rvm/gems
子文件夹的新安装的版本,以及作为Unicorn的位置:
PATH=/usr/local/rvm/rubies/ruby-2.2.1/bin:/usr/local/sbin:/usr/bin:/bin:/sbin:/usr/local/rvm/bin:/usr/local/rvm/gems/ruby-2.2.1@global/bin:/usr/local/rvm/gems/ruby-2.2.1/bin/
export GEM_HOME=/usr/local/rvm/gems/ruby-2.2.1
export GEM_PATH=/usr/local/rvm/gems/ruby-2.2.1:/usr/local/rvm/gems/ruby-2.2.1@global
DAEMON=/usr/local/rvm/gems/ruby-2.2.1/bin/unicorn
您还需要安装您的应用程序需要在Gemfile中的任何其他gems:
cd /home/rails && bundle install
安装必要的Gem后,您应该使用以下命令重新启动Unicorn:
sudo service unicorn restart
检查日志文件中/var/log/unicorn/unicorn.log
,如果你看到任何Bundler::GemNotFound
错误,那么你就必须安装缺少的Gem。
使用以下命令连续监视日志输出:
tail -f /var/log/unicorn/unicorn.log
示例错误行如下所示:
Could not find i18n-0.6.1 in any of the sources (Bundler::GemNotFound)
对于这个特定的错误,你可能需要安装特定版本的i18n gem:
gem install i18n -v 0.6.1
如果您有错误,已经安装了更新的版本(例如i18n-0.9.0,只需卸载该gem并安装正确的一个:
gem uninstall i18n -v 0.9.0
gem install i18n -v 0.6.1
上传文件
我们建议您使用SFTP(安全FTP) ,SCP,或Rsync的上传您的文件,因为它们都使用加密的数据传输。
Windows用户可以使用WinSCP上传文件。 对于所有其他操作系统(包括Windows),可以使用FileZilla中和rsync。
对于经验丰富的开发人员,我们有一篇文章如何设置的Git
Rails应用程序的根应该在目录中/home/rails
,例如/home/rails/ rails_project
。 Nginx的和Unicorn将查找在公共页面/home/rails/ rails_project /public
,除非你重新配置它们,务必使用相应SFTP上传文件。
在当日消息提供您的SFTP凭证(凭证是不同的,每Droplet随机生成),并同时有/etc/motd.tail
为您的评论。
Postgres数据库凭据
一键安装包括一个Postgres数据库供您使用(凭证是不同的,并为每个Droplet随机生成)。
此应用程序映像的先前版本使用MySql作为其默认数据库。 如果您正在使用的版本,随机生成的MySQL root密码,可在发现/root/.my.cnf
对于数据库凭据rails
用户也保存在/etc/motd.tail
,并显示在今日消息如上所示。 他们还远销作为环境变量APP_DATABASE_PASSWORD
中/etc/default/unicorn
样品Rails项目是预装在其数据库配置(读取该/home/rails/config/database.yml
)使用:
<%= ENV['APP_DATABASE_PASSWORD'] %>
下一步
按照我们最初的服务器安装指南给
sudo
权限的用户,锁定root登录,并采取其他步骤,让您的VPS为生产做好准备。有关更高级的部署策略,考虑使用Capistrano的自动化工作流 。
并且一定要检查所有的附加Ruby on Rails的教程在网站上 。