Skip to content

Instantly share code, notes, and snippets.

@rummelonp
Last active June 11, 2016 14:33
Show Gist options
  • Save rummelonp/4109368 to your computer and use it in GitHub Desktop.
Save rummelonp/4109368 to your computer and use it in GitHub Desktop.
Nginx+Unicorn+Rails+Capistrano 用の設定の雛形
# -*- coding: utf-8 -*-
# deploy 時に自動で bundle install
require 'bundler/capistrano'
# deploy 時に自動で rake assets:precompile
load 'deploy/assets'
# アプリケーションの設定
set :application, 'app'
set :domain, 'app.com'
set :rails_env, 'production'
set :repository, 'file://.'
set :branch, 'production'
set :deploy_via, :copy
set :deploy_to, '/var/www/app'
set :use_sudo, false
server domain, :app, :web
# 再起動後に古い releases を cleanup
after 'deploy:restart', 'deploy:cleanup'
# Unicorn 用の設定
set :unicorn_config, "#{current_path}/config/unicorn.rb"
set :unicorn_bin, 'unicorn'
set :unicorn_pid, '/tmp/unicorn.app.pid'
# Unicorn 用のデーモン操作タスク
def remote_file_exists?(full_path)
capture("if [ -e #{full_path} ]; then echo 'true'; fi").strip == 'true'
end
def process_exists?(pid_file)
capture("ps -p `cat #{pid_file}`; true").strip.split("\n").size == 2
end
namespace :deploy do
desc 'Start Unicorn'
task :start, roles: :app, except: {no_release: true} do
if remote_file_exists? unicorn_pid
if process_exists? unicorn_pid
logger.important 'Unicorn is already running!', 'Unicorn'
next
else
run "rm #{unicorn_pid}"
end
end
logger.important 'Starting Unicorn...', 'Unicorn'
run "cd #{current_path} && bundle exec unicorn -c #{unicorn_config} -E #{rails_env} -D"
end
desc 'Stop Unicorn'
task :stop, :roles => :app, :except => {:no_release => true} do
if remote_file_exists? unicorn_pid
if process_exists? unicorn_pid
logger.important 'Stopping Unicorn...', 'Unicorn'
run "kill -s QUIT `cat #{unicorn_pid}`"
else
run "rm #{unicorn_pid}"
logger.important 'Unicorn is not running.', 'Unicorn'
end
else
logger.important 'No PIDs found. Check if unicorn is running.', 'Unicorn'
end
end
desc 'Reload Unicorn'
task :reload, :roles => :app, :except => {:no_release => true} do
if remote_file_exists? unicorn_pid
logger.important 'Reloading Unicorn...', 'Unicorn'
run "kill -s HUP `cat #{unicorn_pid}`"
else
logger.important 'No PIDs found. Starting Unicorn...', 'Unicorn'
run "cd #{current_path} && bundle exec unicorn -c #{unicorn_config} -E #{rails_env} -D"
end
end
desc 'Restart Unicorn'
task :restart, :roles => :app, :except => {:no_release => true} do
stop
start
end
end
upstream unicorn.app.com {
server unix:/tmp/unicorn.app.sock;
}
server {
listen 80;
server_name app.com;
root /var/www/app/current/public;
access_log /var/log/nginx/app.access.log;
error_log /var/log/nginx/app.error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://unicorn.app.com;
}
location = /favicon.ico {
}
location = /robots.txt {
}
location ~ ^/(assets|images|javascripts|stylesheets|system)/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
}
# -*- coding: utf-8 -*-
worker_processes 3
listen '/tmp/unicorn.app.sock'
pid '/tmp/unicorn.app.pid'
stderr_path 'log/unicorn.log'
stdout_path 'log/unicorn.log'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment