この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
ウェブサーバーが起動できない
ウェブサーバーを再起動しようとするときに、「Address already in use」のエラーが発生して、ウェブサーバーが再起動しないことがあります。原因に気づくのに少し手間取ったため対処法をメモします。
「Address already in use」の原因
原因は英文のとおり、既に該当の機能やポートが使用されているときに発生します。また設定の勘違いやミスによる同じ機能を持つ別パッケージが複数インストールされているときに発生します。
ウェブサーバーであれば、apache や nginx が正常に終了できずに幽霊のようにプロセスが残っているとき。またレアケースでは、apache が起動中に nginx を起動しようとしたりすると同じエラーが発生します。
下記は apache が起動中に nginx を起動しようとして強制的に「Address already in use」のエラーを出した実行サンプルです。
検証履歴
1 2 3 |
root@hostname:# service nginx restart Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. |
検証履歴のログ
1 2 3 4 5 6 7 8 9 10 11 |
2018/12/09 17:20:33 [emerg] 3112#3112: still could not bind() 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to 0.0.0.0:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to [::]:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to 0.0.0.0:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to [::]:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to 0.0.0.0:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to [::]:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to 0.0.0.0:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to [::]:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to 0.0.0.0:80 failed (98: Address already in use) 2018/12/09 17:21:32 [emerg] 3146#3146: bind() to [::]:80 failed (98: Address already in use) |
「Address already in use」の対処法
使用したいプロセスが残っているのが問題であるため、「ps aux」コマンドで実行中のプロセスを確認して、競合するプロセスを「kill」すれば問題は解決します。
※上記で記載した apache 起動中に nginx が起動できないときは、もちろんプロセスを kill するのではなく、apacheを stop して下さい(笑)
起動中のプロセスを探すコマンド
プロセスを強制終了するコマンド
さいごに
エラーログを読めば解決方法は思い至るのですが、案外ログを見ないエンジニアが多いです。うまく動かないときはログや履歴を確認すれば簡単に解決できることもあるので思い留めておいて頂ければ幸いです。