环境
ubuntu 12.04 rails 4.0 ruby 2.0 nginx 1.4.5 puma 2.7.1
部署步骤:
1、安装nginx
- 使用nginx.org的官方repo:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62
- 把下面一行添加到/etc/apt/sources.list中:
deb http://nginx.org/packages/ubuntu/ precise nginx
- 如果之前系统中安装过nginx,则先把它删除
sudo apt-get purge nginx*
- 安装nginx:
sudo apt-get update
sudo apt-get install nginx
- 安装成功后可以通过如下的命令验证:
nginx -v
result: nginx version: nginx/1.4.5
- 启nginx、停止nginx和重启nginx:
sudo service nginx start
sudo service nginx stop
sudo service nginx restart
2、配置nginx
- 删除默认的配置文件default.conf
sudo rm /etc/nginx/conf.d/default.conf
- 添加应用配置文件
upstream app-name {
server unix:///path/to/your/app/root/tmp/sockets/production.socket;
}
server {
listen 80;
server_name my_app_url.com; # change to match your URL
root /path/to/your/project/public; # I assume your app is located at that location
location / {
proxy_pass http://app-name; # match the name of upstream directive which is defined above
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* ^/assets/ {
# Per RFC2616 - 1 year maximum expiry
expires 1y;
add_header Cache-Control public;
# Some browsers still send conditional-GET requests if there's a
# Last-Modified header or an ETag header even if they haven't
# reached the expiry date sent in the Expires header.
add_header Last-Modified "";
add_header ETag "";
break;
}
}
- 重启nginx,使配置生效
3、用puma启动应用,前提是你可以通过rails s -e production把应用启动
- Gemfile中添加puma
gem 'puma'
这时,用rails s启动时,puma会替换WEBrick
- 配置应用的puma配置文件
#!/usr/bin/env puma
# start puma with:
# bundle exec puma -e production -C path/to/your/app/config/puma.rb
application_path = '/path/to/your/app'
railsenv = 'production'
directory application_path
environment railsenv
daemonize true
pidfile "#{application_path}/tmp/pids/puma-#{railsenv}.pid"
state_path "#{application_path}/tmp/pids/puma-#{railsenv}.state"
stdout_redirect
"#{application_path}/log/puma-#{railsenv}.stdout.log"
"#{application_path}/log/puma-#{railsenv}.stderr.log"
threads 0, 16
bind "unix://#{application_path}/tmp/sockets/#{railsenv}.socket"
- 在应用中添加/tmp/pids/和/tmp/sockets/两个文件夹,然后通过一下命令启动应用:
bundle exec puma -e production -C path/to/your/app/config/puma.rb
- 确定puma是否起来
ps aux | grep puma
login-name 4548 0.3 3.5 367436 63952 ? Sl 22:44 0:00 /home/albert/.rvm/gems/ruby-2.0.0-p353/bin/puma
如果没有这个puma的进程,说明puma没有启动,需要排查为什么没有启动,一般有可能是/tmp/pids/这个文件夹没有创建,导致pid文件没有生成
done
经过以上的配置,我们应该可以通过域名或ip访问到我们的应用,如果没有,请检查以下几项(不限于这些):
- bind在nginx中的配置和puma中的配置是否一致