Django でウェブアプリの開発をしていて下記のようなエラーを経験したことのある方も多いのではないでしょうか?
Error: That port is already in use.
今回は、このエラーが発生する原因と、このエラーが発生した時の対処法について解説していきます。
ただ、このエラーが発生するケースで一番多いのは、Django 開発用ウェブサーバーを2重で起動してしまった場合になると思います。つまり、下記コマンドが既に実行中なのに、もう一度同じコマンドを実行してしまうと、このエラーが発生することになります。
% python manage.py runserver
この場合、既に実行中の上記コマンドを終了させてやれば本エラーは解決できることになります。
これでエラーが解消されれば、目的は達成できたことになると思うのでブラウザバックしていただいても問題ないですし、これでエラーが解消される理由を知りたい方や、そもそも開発用ウェブサーバーを起動していないのにエラーが発生する場合は、以降の解説も是非読んでいただければと思います。
エラーの原因
まず、このエラーは Django の開発用ウェブサーバーを起動しようとした時に発生するエラーとなります。開発用ウェブサーバーは下記の runserver
コマンドで起動しますので、要は、このエラーは下記の runserver
コマンド実行時に発生するエラーとなります。
% python manage.py runserver
そして、このエラーは、エラーの文言からも分かるように、そのポートが既に利用中であることが原因となります。
“そのポート” とは「Django 開発用ウェブサーバーが使用しようとしているポート」のことです。各ポートにはポート番号が振られており、Django 開発用ウェブサーバーが利用するポート番号は 8000
となります。つまり、このエラーが発生するのは、基本的に、Django 開発用ウェブサーバーが使用しようとしているポート(ポート番号 8000
のポート)が他のアプリやプログラムによって利用されていることが原因です。
簡単に説明すると、基本的に PC の中で複数のアプリやプログラムが同時に同じポートを利用することはできないようになっているため、既に他のアプリやプログラムがポート番号 8000
のポートを利用している場合、Django 開発用ウェブサーバーが起動して同じポートを利用しようとしたタイミングでエラーが発生することになります。そして、この際に発生するエラーが下記のエラーとなります。
Error: That port is already in use.
エラーの対処法
エラーの原因が「ポート番号 8000
のポートが他のプログラムやアプリに利用されていること」であるため、下記のいずれかを行うことで本エラーは解決することができます。安全なのは前者の方になるので、個人的におすすめなのは前者側になります。
- Django 開発用ウェブサーバーが使用するポートを
8000
から変更する - ポート
8000
を使用中のアプリやプログラム(プロセス)を終了させる
スポンサーリンク
使用するポートを変更する
まずは、前者の Django 開発用ウェブサーバーが使用するポートを変更する方法でエラーを解決する手順を説明していきます。
runserver
コマンド実行時にポート番号を指定する
前述の通り、Django 開発用ウェブサーバーは下記の runserver
コマンドによって起動されることになります。
% python manage.py runserver
この runserver
コマンドでは、下記のようにコマンドの最後にポート番号を記述するようにすることで、Django 開発用ウェブサーバーが使用するポート番号を変更することが可能です。
% python manage.py runserver ポート番号
例えば、下記のように runserver
コマンドを実行する際に 8080
を指定すれば、Django 開発用ウェブサーバーがポート番号 8080
のポートを使用するようになります。
% python manage.py runserver 8080
これにより、Django 開発用ウェブサーバーがポート番号 8000
のポートを使用しなくなるため、既にポート番号 8000
のポートを使用しているアプリやプログラムがいても Django 開発用ウェブサーバーが正常に起動するようになります。ただし、上記のコマンドで指定したポート番号を他のアプリやプログラムが使用している場合は同様の原因でエラーが発生しますので、その場合はさらに異なるポート番号を指定してやる必要があります。
この方法でよく指定するポート番号は 8080
や 8888
になるかなぁと思います。
また、この方法を利用し、異なるポート番号を利用するようにすることで、Django 開発用ウェブサーバーを同時に複数起動するようなことも可能となります。
ウェブブラウザが使用するポート番号を変更する
上記のように runserver
コマンドでポート番号を指定した場合には、ウェブブラウザに指定する URL も runserver
コマンドに指定したポート番号にしたがって変更する必要があるという点に注意してください。
Django で開発しているウェブアプリを動作させるために、Django 開発用ウェブサーバー起動後にウェブブラウザから下記の形式の URL を開くことになると思います。
http://127.0.0.1:8000/アプリ名/
もしくは下記の URL の形式になると思います。
http://localhost:8000/アプリ名/
いずれにしても、注目すべきは URL の中で指定されている 8000
という数字で、これはここまでの解説を読んでいただければ分かるように、この 8000
は Django 開発用ウェブサーバーがデフォルトで使用しているポート番号になります。
このポート番号を指定しているため、ウェブブラウザから Django 開発用ウェブサーバーにリクエストが送信されるようになり、リクエストを受け取った Django 開発用ウェブサーバーからウェブアプリが動作することになります。そして、ウェブアプリの動作結果に応じたレスポンスがウェブサーバーからウェブブラウザに返却され、ウェブブラウザにレスポンスに基づいたページが表示されます。
ですが、runserver
コマンド実行時に使用するポート番号を変更した場合、上記のように URL でポート番号 8000
を指定してしまうと、ポート番号 8000
を利用しているアプリやプログラムに対してリクエストが送信されることになります。リクエストの送信先が Django 開発用ウェブサーバーでないため、ウェブアプリの動作確認は行うことができませんし、ポート番号 8000
を利用しているプログラムによってはレスポンスが返却されないような場合もあり得ます。
そのため、Django 開発用ウェブサーバーが使用するポートのポート番号を変更した場合、URL に指定するポート番号もそれに合わせて変更する必要があります。例えば、runserver
コマンドでポート番号 8080
を指定したのであれば、ウェブブラウザから開く URL も下記のように変更する必要があります。
http://127.0.0.1:8080/アプリ名/ or http://localhost:8080/アプリ名/
このように、URL を変更してやれば、ウェブブラウザから指定されたポート番号のポートを使用しているアプリやプログラムにリクエストが送信されることになります。そして、そのポート番号のポートは Django 開発用ウェブサーバーが使用しているはずなので、つまりは Django 開発用ウェブサーバーにウェブブラウザからリクエストが送信され、ウェブアプリの動作結果がレスポンスとしてウェブブラウザに返却されることになります。
このように、Django 開発用ウェブサーバーの使用するポートのポート番号を変更した場合、ウェブブラウザからウェブアプリのページを表示するためにはウェブブラウザで開く URL も変更する必要がある点に注意が必要です。
VSCode からのデバッグ時にポート番号を変更する
さて、先ほどはコマンドで Django 開発用ウェブサーバーを起動する際にポート番号を指定する例を示しましたが、VSCode から Django 開発用ウェブサーバーを起動している方も多いと思います。
この場合でもポート番号の変更は可能で、具体的には launch.json
を下記のように記述することでポート番号を変更することができます。要は、"args"
に指定されている "runserver"
の後ろ側にカンマ ,
を追加し、さらにその後ろ側に使用したいポート番号を指定すれば良いだけです。下記は "8080"
を指定する例となります。
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python Django",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"args": [
"runserver",
"8080"
],
"django": true,
"justMyCode": true
}
]
}
ポート 8000
を使用中のプロセスを終了させる
続いて、もう一方の「ポート番号 8000
のポートを使用中のプロセスを終了させる方法」について解説していきます。プロセスとは、簡単に言えば起動中のプログラム・起動中のアプリを指す用語になります。
エラーが発生する原因が「ポート番号 8000
のポートが他のプロセスに利用されていること」であるため、そのプロセスを終了させてやれば、ポート番号 8000
のポートを利用しているプロセスが存在しなくなり、Django 開発用ウェブサーバーがポート番号 8000
のポートを利用できるようになります。そして、それによってエラーが解消されます。
この方法でエラーを解消するためには、まずはポート番号 8000
のポートを利用中のプロセスを特定し、そのプロセスを終了する手順を踏む必要があります。そして、その後に Django 開発用ウェブサーバーを起動します。
ここからは、私が Mac を利用しているため、特に Mac を利用している場合の手順について説明を行なっていきます
おそらく Linux でも同様の手順でエラーを解消することが可能です
Windows の場合は手順が異なるので注意が必要ですが、やるべきことは OS に関係なく同じですので、以降の解説も参考になると思います
ポート 8000
を使用中のプロセスを確認する
ということで、最初にポート番号 8000
のポートを使用しているプロセスを確認します。
まず、ターミナルアプリを開き、下記のように lsof
コマンドを実行します。そうすれば、コマンドの実行結果としてポート番号 8000
のポートを利用しているプロセスの情報が表示されます。
% lsof -i:8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Python 24178 daeu 4u IPv4 0x84f3bc71d4a7770f 0t0 TCP localhost:irdmi (LISTEN)
いろんな情報が表示されますが、ここでまず重要なのが PID になります。この PID
はプロセスの識別子であり、この識別子によってプロセスを特定することができます。プロセスを終了させる場合も、この識別子を利用することが多いです。
また、COMMAND
と USER
の列の情報も重要です。COMMAND
は、そのプロセスを起動する際に実行されたコマンドが表示されています。また、USER
にはプロセスを起動したユーザー名が表示されています。
特に USER
に自身のユーザー名が表示されており、COMMAND
に見覚えのあるコマンド&終了させても良いコマンドが表示されているのであれば、そのプロセスは基本的に終了させてやって問題ないと思います。
ポート 8000
を使用中のプロセスを終了させる
終了させても問題ない場合は、下記のように kill
コマンドによってプロセスを終了させてやれば良いです。kill
コマンドの引数には、lsof -i:8000
で出力されたプロセスの PID を指定します。
% kill 24178
再度、lsof -i:8000
を実行してプロセスが表示されなくなっていれば、プロセスの終了に成功しており、Django 開発用ウェブサーバーを起動できる準備が整ったことになります。
もし、プロセスが終了していないようであれば、kill
コマンドに -9
オプションを指定すれば、そのプロセスを強制的に終了させることができます。
% kill -9 24178
そして、ポート番号 8000
のポートを利用中のプロセスが終了すれば、Django 開発用ウェブサーバーがそのポートを利用できるようになるためエラーが解消されることになります。
ただ、前述でも述べましたが、このプロセスを終了させてエラーを解決する方法は手順が複雑な上、終了させてはいけないプロセスを終了させてしまう可能性もあるので、個人的には 使用するポートを変更する 方法の方がオススメです。ただ、プロセスの確認方法やプロセスの終了方法などは覚えておくと、今後これらの知識が役に立つ機会は多いと思いますので、ここで解説した内容も頭の片隅にでも留めておいていただければと思います。
また、ここで紹介したコマンドについては別ページで解説していますので、コマンドについて詳しく知りたい方は下記ページを参照していただければと思います。
【Mac】lsof コマンドでファイルやポートを使用しているプロセスを特定する 【Mac】プログラマー向けターミナルコマンド集まとめ
このページでは、Django を利用していて下記のエラーが発生する原因とその対処法について解説しました!
Error: That port is already in use.
結局のところ、このエラーが発生する原因は「ポート番号 8000
のポートが他のプロセス(起動中のプログラム・アプリ)に利用されていること」になります。既にポート番号 8000
のポートを利用しているプロセスが存在する状態で Django 開発用ウェブサーバーを起動すると、利用中のポートを Django 開発用ウェブサーバーも利用しようとし、その際にエラーが発生します。
なので、Django 開発用ウェブサーバーが利用するポートを変更する or ポート番号 8000
のポートを利用しているプロセスを終了させてから Django 開発用ウェブサーバーを起動すればエラーが解消されることになります。
このエラーは Django 開発用ウェブサーバーを起動する際に発生するものであり、Django 開発用ウェブサーバーが起動できないとウェブアプリの動作確認も行えません。ここで詰まると勿体無いので、ぜひ今回紹介した方法でエラーを解消し、ウェブアプリの開発を楽しんでいただければと思います!