【Django】Error: That port is already in use. が発生した時の対処法

このページにはプロモーションが含まれています

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 開発用ウェブサーバーが使用するポートを変更する方法でエラーを解決する手順を説明していきます。

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 開発用ウェブサーバーが正常に起動するようになります。ただし、上記のコマンドで指定したポート番号を他のアプリやプログラムが使用している場合は同様の原因でエラーが発生しますので、その場合はさらに異なるポート番号を指定してやる必要があります。

この方法でよく指定するポート番号は 80808888 になるかなぁと思います。

また、この方法を利用し、異なるポート番号を利用するようにすることで、Django 開発用ウェブサーバーを同時に複数起動するようなことも可能となります。

ウェブブラウザが使用するポート番号を変更する

上記のように runserver コマンドでポート番号を指定した場合には、ウェブブラウザに指定する URL も runserver コマンドに指定したポート番号にしたがって変更する必要があるという点に注意してください。

Django で開発しているウェブアプリを動作させるために、Django 開発用ウェブサーバー起動後にウェブブラウザから下記の形式の URL を開くことになると思います。

http://127.0.0.1:8000/アプリ名/

もしくは下記の URL の形式になると思います。

http://localhost:8000/アプリ名/

いずれにしても、注目すべきは URL の中で指定されている 8000 という数字で、これはここまでの解説を読んでいただければ分かるように、この 8000 は Django 開発用ウェブサーバーがデフォルトで使用しているポート番号になります。

このポート番号を指定しているため、ウェブブラウザから Django 開発用ウェブサーバーにリクエストが送信されるようになり、リクエストを受け取った Django 開発用ウェブサーバーからウェブアプリが動作することになります。そして、ウェブアプリの動作結果に応じたレスポンスがウェブサーバーからウェブブラウザに返却され、ウェブブラウザにレスポンスに基づいたページが表示されます。

ウェブブラウザと開発用ウェブサーバーの間でポート8000が利用される様子

ですが、runserver コマンド実行時に使用するポート番号を変更した場合、上記のように URL でポート番号 8000 を指定してしまうと、ポート番号 8000 を利用しているアプリやプログラムに対してリクエストが送信されることになります。リクエストの送信先が Django 開発用ウェブサーバーでないため、ウェブアプリの動作確認は行うことができませんし、ポート番号 8000 を利用しているプログラムによってはレスポンスが返却されないような場合もあり得ます。

ウェブブラウザから他のプログラムにリクエストが送信されてしまう様子

そのため、Django 開発用ウェブサーバーが使用するポートのポート番号を変更した場合、URL に指定するポート番号もそれに合わせて変更する必要があります。例えば、runserver コマンドでポート番号 8080 を指定したのであれば、ウェブブラウザから開く URL も下記のように変更する必要があります。

http://127.0.0.1:8080/アプリ名/ or http://localhost:8080/アプリ名/

このように、URL を変更してやれば、ウェブブラウザから指定されたポート番号のポートを使用しているアプリやプログラムにリクエストが送信されることになります。そして、そのポート番号のポートは Django 開発用ウェブサーバーが使用しているはずなので、つまりは Django 開発用ウェブサーバーにウェブブラウザからリクエストが送信され、ウェブアプリの動作結果がレスポンスとしてウェブブラウザに返却されることになります。

ウェブブラウザと開発用ウェブサーバーの間でポート8080が利用される様子

このように、Django 開発用ウェブサーバーの使用するポートのポート番号を変更した場合、ウェブブラウザからウェブアプリのページを表示するためにはウェブブラウザで開く URL も変更する必要がある点に注意が必要です。

VSCode からのデバッグ時にポート番号を変更する

さて、先ほどはコマンドで Django 開発用ウェブサーバーを起動する際にポート番号を指定する例を示しましたが、VSCode から Django 開発用ウェブサーバーを起動している方も多いと思います。

この場合でもポート番号の変更は可能で、具体的には launch.json を下記のように記述することでポート番号を変更することができます。要は、"args" に指定されている "runserver" の後ろ側にカンマ , を追加し、さらにその後ろ側に使用したいポート番号を指定すれば良いだけです。下記は "8080" を指定する例となります。

launch.json
{
    // 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を使用しているプロセスを終了させてからDjango開発用ウェブサーバーを起動する様子

エラーが発生する原因が「ポート番号 8000 のポートが他のプロセスに利用されていること」であるため、そのプロセスを終了させてやれば、ポート番号 8000 のポートを利用しているプロセスが存在しなくなり、Django 開発用ウェブサーバーがポート番号 8000 のポートを利用できるようになります。そして、それによってエラーが解消されます。

この方法でエラーを解消するためには、まずはポート番号 8000 のポートを利用中のプロセスを特定し、そのプロセスを終了する手順を踏む必要があります。そして、その後に Django 開発用ウェブサーバーを起動します。

MEMO

ここからは、私が 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 はプロセスの識別子であり、この識別子によってプロセスを特定することができます。プロセスを終了させる場合も、この識別子を利用することが多いです。

また、COMMANDUSER の列の情報も重要です。COMMAND は、そのプロセスを起動する際に実行されたコマンドが表示されています。また、USER にはプロセスを起動したユーザー名が表示されています。

特に USER に自身のユーザー名が表示されており、COMMAND に見覚えのあるコマンド&終了させても良いコマンドが表示されているのであれば、そのプロセスは基本的に終了させてやって問題ないと思います。

ポート 8000 を使用中のプロセスを終了させる

終了させても問題ない場合は、下記のように kill コマンドによってプロセスを終了させてやれば良いです。kill コマンドの引数には、lsof -i:8000 で出力されたプロセスの PID を指定します。

% kill 24178

再度、lsof -i:8000 を実行してプロセスが表示されなくなっていれば、プロセスの終了に成功しており、Django 開発用ウェブサーバーを起動できる準備が整ったことになります。

もし、プロセスが終了していないようであれば、kill コマンドに -9 オプションを指定すれば、そのプロセスを強制的に終了させることができます。

% kill -9 24178

そして、ポート番号 8000 のポートを利用中のプロセスが終了すれば、Django 開発用ウェブサーバーがそのポートを利用できるようになるためエラーが解消されることになります。

ただ、前述でも述べましたが、このプロセスを終了させてエラーを解決する方法は手順が複雑な上、終了させてはいけないプロセスを終了させてしまう可能性もあるので、個人的には 使用するポートを変更する 方法の方がオススメです。ただ、プロセスの確認方法やプロセスの終了方法などは覚えておくと、今後これらの知識が役に立つ機会は多いと思いますので、ここで解説した内容も頭の片隅にでも留めておいていただければと思います。

また、ここで紹介したコマンドについては別ページで解説していますので、コマンドについて詳しく知りたい方は下記ページを参照していただければと思います。

lsofコマンドの紹介ページアイキャッチ 【Mac】lsof コマンドでファイルやポートを使用しているプロセスを特定する プログラマー向けmacのコマンドの紹介ページアイキャッチ 【Mac】プログラマー向けターミナルコマンド集

まとめ

このページでは、Django を利用していて下記のエラーが発生する原因とその対処法について解説しました!

Error: That port is already in use. 

結局のところ、このエラーが発生する原因は「ポート番号 8000 のポートが他のプロセス(起動中のプログラム・アプリ)に利用されていること」になります。既にポート番号 8000 のポートを利用しているプロセスが存在する状態で Django 開発用ウェブサーバーを起動すると、利用中のポートを Django 開発用ウェブサーバーも利用しようとし、その際にエラーが発生します。

なので、Django 開発用ウェブサーバーが利用するポートを変更する or ポート番号 8000 のポートを利用しているプロセスを終了させてから Django 開発用ウェブサーバーを起動すればエラーが解消されることになります。

このエラーは Django 開発用ウェブサーバーを起動する際に発生するものであり、Django 開発用ウェブサーバーが起動できないとウェブアプリの動作確認も行えません。ここで詰まると勿体無いので、ぜひ今回紹介した方法でエラーを解消し、ウェブアプリの開発を楽しんでいただければと思います!

同じカテゴリのページ一覧を表示

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です