Setup Rails on unicorn on nginx on AWS EC2 linux

  • 0
    いいね
  • 0
    コメント

    How to install Unicorn

    1.Modify Gemfile contents

    $ sudo vim ~/(sampleapp)/Gemfile
    

    Add gem 'unicorn'

    2. Install unicorn at the Gemfile's directory

    $ bundle install

    3. Check installation of unicorn

    $ bundle show unicorn
    /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/unicorn-5.3.0
    

    4. Make "unicorn.rb" on /(sampleAppDirectory)/config and write following contents

    unicorn.rb
      worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
      timeout 15
      preload_app true
    
      listen '/home/ec2-user/testApp/tmp/unicorn.sock' #{Railsアプリケーションのあるディレクトリ}/tmp/unicorn.sock
      pid    '/home/ec2-user/testApp/tmp/unicorn.pid' #{Railsアプリケーションのあるディレクトリ}/tmp/unicorn.pid
    
      before_fork do |server, worker|
        Signal.trap 'TERM' do
          puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
          Process.kill 'QUIT', Process.pid
        end
    
        defined?(ActiveRecord::Base) and
          ActiveRecord::Base.connection.disconnect!
      end
    
      after_fork do |server, worker|
        Signal.trap 'TERM' do
          puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
        end
    
        defined?(ActiveRecord::Base) and
          ActiveRecord::Base.establish_connection
      end
    
      stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
      stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
    

    5. Execute following code and create rake file at your app directory

    $ rails g task unicorn 
    Running via Spring preloader in process 13140
          create  lib/tasks/unicorn.rake
    

    6. Start unicorn and check unicorn starting

    $ bundle exec unicorn_rails -c config/unicorn.rb 
    
    

    *↑production環境かdeployment環境は選べる。Unicorn commands一覧参照

    $ ps -ef | grep unicorn
    ec2-user 12631 11576  0 08:09 pts/1    00:00:00 vim unicorn.rb
    ec2-user 13547 13151  0 08:37 pts/5    00:00:01 unicorn master -c config/unicorn.rb                                                                                            
    ec2-user 13582 13547  0 08:37 pts/5    00:00:00 unicorn worker[0] -c config/unicorn.rb                                                                                         
    ec2-user 13584 13547  0 08:37 pts/5    00:00:00 unicorn worker[1] -c config/unicorn.rb                                                                                         
    ec2-user 13587 13547  0 08:37 pts/5    00:00:00 unicorn worker[2] -c config/unicorn.rb                                                                                         
    ec2-user 14665 13960  0 08:51 pts/3    00:00:00 grep --color=auto unicorn
    

    Modify the setting of Nginx

    1. Modify nginx.conf to rails.cof

    nginx/1.10.2時点ではnginx.conf($ nginx -tでconfigファイルを確認できる)。nginx.confに以下のように書き換える。

    nginx.conf
    # For mor# e information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user ec2-user;
    worker_processes 1;
    
    events {
        worker_connections 1024;
    }
    
    http {
    #    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                     '$status $body_bytes_sent "$http_referer" '
    #                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    #   access_log  /home/ec2-user/testApp/access.log  main;
    
    #    sendfile            on;
    #    tcp_nopush          on;
    #    tcp_nodelay         on;
    #    keepalive_timeout   65;
    #    types_hash_max_size 2048;
    
    #    include             /etc/nginx/mime.types;
    #    default_type        application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
    #   include /etc/nginx/conf.d/*.conf;
    
    #   index   index.html index.htm;
    
        upstream unicorn {
          server  unix:/home/ec2-user/testApp/tmp/unicorn.sock; #/home/{ユーザ名}/{Railsアプリケーション>名}/tmp/unicorn.sock
        }
    
        server {
            listen       xx; #HTTP = 80
            server_name  xxx.xxx.xxx.xxx; #Your server ip-address or domain name
    
            access_log  /var/log/access.log;
            error_log   /var/log/error.log;
    
            root    /home/ec2-user/testApp/public; #/home/{ユーザ名}/{Railsアプリケーション名}/public
    #       index   index.html;
            client_max_body_size 4G; #100m;
            error_page  404              /404.html;
            error_page  500 502 503 504  /500.html;
            try_files   $uri/index.html $uri @unicorn;
    
            location @unicorn {
                    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;
                    }
    
            }
    

    2. Reload nginx

    $ sudo service nginx restart
    

    3. Access your server address!!!

    ここからはunicornのnginxに対するpermission deniedが出た時の処理

    2017/04/23 06:45:40 [crit] 29912#0: *1 open()
    "/var/lib/nginx/tmp/proxy/1/00/0000000001" failed (13: Permission
    denied) while reading upstream, client: (clientserver), server:
    (my-server), request: "GET / HTTP/1.1", upstream:
    "http://unix:/pathTo/tmp/unicorn.sock:/", host:
    "(my-server)"
    

    上記エラーではnginx, tmpにおけるアクセス権限がnginxのみしかないので、アクセス権を解放する(下記アクセスは777としているが修正する必要あり)

    $ sudo chmod 777 nginx
    $ sudo chmod 777 tmp