読者です 読者をやめる 読者になる 読者になる

放浪エンジニアのLog

少しハッピーになれる開発

Rails5 + nginx + pumaの起動問題

rails ruby nginx puma IPv4 IPv6

Rails5 + nginx + puma でアプリケーションを起動した際に、なぜか[502 Bad Gateway] になった(nginx から puma へ繋がらなかった)時のお話です。

環境

Ruby Version 2.3.3
・Rails5
・nginx/1.10.2
・Puma Version 3.7.0

nginxの設定

特段特別な設定はしておらず、見たまんまです。

server {  
  listen 80;  
  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_redirect off;                              
    proxy_pass http://127.0.0.1:3000;   
  }  
}  
  
server {   
  listen 443;   
    ssl on;   
    ssl_certificate      server.crt;   
    ssl_certificate_key  server.key;  
    location / {    
      proxy_set_header Host $http_host;   
      proxy_set_header X-Real-IP $remote_addr;    
      proxy_set_header X-Forwarded-Proto https;    
      proxy_set_header X-Forwarded-Host $host;  
      proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;  
      proxy_redirect off;  
      proxy_pass http://127.0.0.1:3000;  
    }  
  }

起動と事象

とりあえず Rails serverの起動をしてみる

$ rails s

f:id:kno75:20170206165445p:plain

こちらは特に問題なく起動するが、localhost へアクセスしてみると 502 Bad Gatewayになる….?

f:id:kno75:20170206165739p:plain

アクセスした際のログを見てみると railsのログには何も表示されず、nginx のログにはerrorが出ている。。。

nginxのログ

2017/02/06 17:00:53 [error] 23763#0: *282 kevent() reported that connect() failed (61: Connection refused) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:3000/", host: "localhost"

そんなわけで、nginx → puma がダメっぽいことが判明!

そこからは色々とはまり、、、、、

結局の原因

結論は puma が port 3000 を IPv6でLISTENしていたことが原因でした。
rails server を起動させ port 3000 を確認したところ、なんとIPv6になっているではないですか….orz

$ lsof -n -P -i | grep 3000
ruby      26568 xxxxxxxx   16u  IPv6 0xdddee1ecd054f49f      0t0  TCP *:3000 (LISTEN)

これは気づかなかった、、、一体誰がIPv6になっていると予測ができるだろうか…
この解決としては、 rails server 起動時に以下のコマンドで指定解決します。

$ rails s -b 0.0.0.0      

再度、port 3000 の確認をしてみると

$ lsof -n -P -i | grep 3000
ruby      26568 xxxxxxxx   16u  IPv4 0xdddee1ecd054f49f      0t0  TCP *:3000 (LISTEN)

無事、IPv4になっている!

これでlocalhostに無事、アクセスできることを確認して完了です!!