nginx + puma + supervisord でRailsを動かす

puma_nginx.001

久しぶりにnginxのインストール作業からやったんですが、CentOS7初めて触りました。
色んなコマンドが変わりまくってて、ツラい。。
それと同時に、プロセス常駐化に際しても初めて supervisord を使いました。
最初、何がなんだか分から無さ過ぎてハマったので、エントリです。

pumaのconfig

productionの設定は以下の様にしました。

application_path = File.expand_path('../../..', __FILE__).to_s
directory application_path
bind "unix://#{application_path}/tmp/sockets/puma.socket"
threads_count = ENV.fetch('RAILS_MAX_THREADS') { 5 }.to_i
threads threads_count, threads_count
environment ENV.fetch('RAILS_ENV') { 'production' }

今回は、nginxが80ないし443で受けるのでpuma自身はsokectの設定のみ。
listenポート等は未記入。
ちな、RIALS_ROOT/tmp/sockets というディレクトリはもともと存在しなかった系のディレクトリなので、このパスにするなら作っておかないとErrorで起動してくれない。

あと、ネットで適当に拾ってきたconfを真似して、 daemonize true とかにしておいたら、 supervisord のプロセス化とかぶって、FATALのログがでるの出て全然supervisordが上手くstartできなく1発ハマり。 puma側ではdaemonizeしないようにするという事を学ぶ。
また、 application_path が、今回は config/puma/ 配下に設置したので、一階層下げる事を忘れてたという事で鬼ハマりして
どっちの事象も天下無双で有名な @5t111111 さんに助けていただく。
(若杉先生に相談したら一瞬で指摘してくださり、改めて神なのかな?って思う。)

supervisord のconf

$ sudo vi /etc/supervisord.d/my_app.ini

で、今回動かしたいRailsプロセス用の設定ファイルを作成。

my_appの部分は何でもOKと思われ

中身は以下

[program:my_app]
command=/home/app_user/.rbenv/shims/bundle exec puma -C config/puma/production.rb
user=app_user
environment=RAILS_ENV="production",DATABASE_PASSWORD="xxxxxxx",SECRET_KEY_BASE="xxxxxx"
directory=/home/app_user/my_app
process_name=%(program_name)s
;autorestart=true
stdout_logfile=/var/log/supervisor/supervisord.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=5
stdout_capture_maxbytes=1MB
redirect_stderr=true ; エラー出力を標準出力にリダイレクト

当初、サーバ環境変数を userで指定しているユーザの bash_profile等に書いてみたが、読み込まれないのかしらんが「そんな環境変数ないって怒られた」 
で、システム共通にしないとダメなのか? と思って /etc/profile等に書いてもみたが、それもダメだった。
(この辺り、Linux力が無いことが問われており もっと勉強を・・というより一層AWS等のプラットフォームに移行してぇなと怠惰な気持ちが芽生えるのであった。)

最終的に、 supervisord のiniに ”environment” という設定が書けるらしかったので、ここに必要な環境変数を書いた。
まぁこれはGithubに突っ込まないヤツだから、いいのかも。みんなはサーバ環境変数どうやって管理してるんだろう・・ 教えてー!

なお、更にいろいろと設定はできる様子なので備忘録
https://www.snip2code.com/Snippet/1086869/supervisord-puma-config-example

この時点で、nginxは起動していないが
supervisordで起動し、プロセスがいることを確認

$ sudo supervisorctl restart my_app
$ ps aux | grep puma
app_user+ 21140 0.3 0.9 945792 77224 ? Sl 12:22 0:02 puma 3.4.0 (unix:///home/app_user/my_app/tmp/sockets/puma.socket) [my_app]

おぉ、ちゃんとpumaプロセスが起動されておる・・

nginx のconf

最後にnginxのconf設定は /etc/nginx/conf.d/default.conf にて
ちなみに、これはSSLの設定かなりガチガチにした版です。
OWASP ZAPかけた際に出てきたリスクほとんど潰すとこうなった。

upstream my_app {
    server unix:/home/app_user/my_app/tmp/sockets/puma.socket;
}

server {
    listen 80;
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 default ssl;
    ssl on;
    ssl_certificate /home/app_user/server.csr;
    ssl_certificate_key /home/app_user/server.key;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';
    ssl_prefer_server_ciphers on;
    server_name my_app.jp;
    root /home/app_user/my_app/public;

    location / {
        try_files $uri $uri/index.html $uri.html @my_app;
    }
 
    location @my_app {
        proxy_read_timeout 300;
        proxy_redirect off;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://my_app;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

httpでアクセスしてきた輩を全てhttpsに振りなおしている

また、443の部分で proxy_set_header X-Forwarded-Proto $scheme; を最初書いていなかったら、Railsのrenderメソッドが全てhttp://~~ になってしまった。
なので全てnginxの404で弾かれてしまっていたので追加する事をメモしておく。

終わり。

2016-08-16 | Posted in RailsNo Comments » 


関連記事

Comment





Comment



*