素人がNginxとUnicornつかってRailsを動かしたいと思った。


普通Vagrantでのこのようなことはしないと思うのですが、rails sしとけよと言われるのですが、
関係ないです。僕は勉強でVagrantの中で、Unicorn+NginxでRailsを動かせるようになっておきたいのです。
AWSへのデプロイを夢見ているのです。

Vagrantの中ではとりあえずUbuntuいれて、あとPostgreSQLもいれております。

参照:
1. 【荒すぎるメモ】PostgreSQLをVagrant,Ubuntu,Railsでつかってみる
2. VagrantでUbuntuにRails環境をつくる

さて、rails newするところから、localhost:3005とかでアクセスするところまでをやりたいと思います。

New

vagrant ssh
cd /vagrant
rails new study_nginx -d postgresql
cd study_nginx

Edit Gemfile

Gemfile
gem 'unicorn'
bundle update
bundle install

Edit database.yml

host: localhost
username: pguser
password: pguser_password

Check Webrick

bin/rake db:create
bin/rails s -b 0.0.0.0

Setting unicorn

touch config/unicorn.rb
unicorn.rb
@app_path = '/vagrant/study_nginx'
working_directory @app_path

worker_processes 2
preload_app true
timeout 30
listen "/tmp/unicorn.sock", :backlog => 64
pid "/var/www/study_nginx/shared/tmp/pids/unicorn.pid"

stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

before_fork do |server, worker|
  ENV['BUNDLE_GEMFILE'] = File.expand_path('Gemfile', ENV['RAILS_ROOT'])
end

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end

Start & kill unicorn

sudo mkdir -p /var/www/study_nginx/shared/tmp/pids
sudo chmod 777 /var/www/study_nginx/shared/tmp/pids
bundle exec unicorn_rails -c config/unicorn.rb -p 8080 -D
ps aux | grep unicorn
kill -9 {pid}

Setting nginx

touch /etc/nginx/conf.d/study_nginx.conf
study_nginx.conf
upstream unicorn_server {
    server unix:/tmp/unicorn.sock
    fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name localhost;

    keepalive_timeout 5;

    # Location of our static files
    root /vagrant/study_nginx/public;

    location ~ ^/assets/ {
        root /vagrant/study_nginx/shared/public;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://unicorn_server;
            break;
        }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /vagrant/study_nginx/public;
    }
}

Start nginx

sudo /etc/init.d/nginx start

以上です。

ファイル名「study_nginx.conf」とかはなんでも良いのですが、なんで何でも大丈夫かというと、
/etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf;

という記述があるからなんですね!

ちなみに、調子こいてファイル2つおいとくとsudo /etc/init.d/nginx startしても死ぬので気をつけてください。
ちなみに、死んだ場合はログファイルを見ましょう。
cd /var/log/nginx/
ここにいますから。