みなさんお久しぶりです。やきうです。
近頃は研修最後のプログラムであるショッピングサイトづくりに時間を取られており、うちでなかなかプログラムをする時間を取れませんでした。
そんな中でも通勤時間などを利用して参考書を読むなりしてRailsの学習を進めていました。今日は参考書で吸収した知識をコードに起こして確認していました。その最中にこんなエラーに遭遇したので、対処法を復習がてらまとめます。エラー内容はこんな感じです。
【エラー内容】
Puma starting in single mode...
* Version 3.11.4 (ruby 2.4.1-p111), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:8080
Exiting
/usr/local/rvm/gems/ruby-2.4.1/gems/puma-3.11.4/lib/puma/binder.rb:270:in `initialize': Address already in use - bind(2) for "127.0.0.1" port 8080 (Errno::EADDRINUSE)
読んでみると同じサーバー上で他のポートが起動しているから、別のポートを起動しようとしたときに「他のサーバーが動いてるから起動できないよ〜」というエラー。
【改善策】
まず、起動しているサーバーのポート番号を調べる。上のエラー表示から、起動中のポート番号は8080だとわかるので、
sudo lsof -i:8080
をターミナルで実行する。結果は以下にの通り。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
このポートを一旦閉じるには、PIDにある番号を「kill」というコマンドとともにターミナルで入力するだけ。上の例の場合だと、
Kill 6820
である。
そして再度、rails server を実行するとサーバーが起動してくれる。
ちなみに、ポート番号を指定して起動する場合は、
rails server -p 指定したいポート番号
で起動してくれる。
【疑問点】
ただ、一つ疑問が残っていまして…
私のRailsの実行環境はcloud9なのですが、configフォルダ下のPuma.rbでは
port ENV.fetch("PORT") { 3000 }
となっているのに、cloud9で起動するとき、ポート番号を3000に指定して起動するとうまくいかず、8080で指定すると起動できるのがなぜかわかりません。
例えばSpring環境の場合、application.propertiesでポート番号を指定し、その指定した番号でlocalhostに接続することになります。
Railsの場合はそれは関係ないのですかね?
わかるかたおられましたら、ここでのコメントかtwitterにて回答してくださると嬉しいです。