【Python】http serverの使い方を初心者向けにわかりやすく解説

はじめに

PythonでWebサーバーを立ち上げたいけれど、そもそも何をどうすればいいのかわからないという方は多いのではないでしょうか。

そんな方に向けて、Python http server の基本的な使い方をわかりやすく解説していきます。

特に初心者の方は、まずどこから手をつければよいのかわかりにくいかもしれませんね。

このモジュールを使うと、普段は難しそうに感じるWebサーバーの起動がとても簡単になります。

ローカルでテスト用サーバーを立てたい場合や、軽量のファイル配布が必要なときに重宝するはずです。

本記事では、単純なサーバーの起動方法から少しだけ応用的な話題まで、実務で使えるヒントを交えつつ詳しく説明します。

最後まで読めば、サーバーを起動する仕組みや基本的なコード例が理解できるようになると思います。

この記事を読むとわかること

  • Python http serverを使ってWebサーバーを起動する手順
  • コマンドでサーバーを立ち上げる方法や、コードを使う方法の違い
  • 開発や実務での活用シーンとセキュリティに関する注意点
  • ログの扱い方や各種設定方法の概要
  • ファイル配布や動的処理などの応用的なトピック

Python http serverとは何か

Pythonには、Webサーバー機能を手軽に試せるhttp.serverモジュールがあります。

このモジュールは、Pythonインストール後に追加の設定をせずともすぐに使えるのが特徴です。

たとえば、Webアプリケーションのフロントエンド部分だけを素早く確認したい場合などに活用できます。

実務では、ローカルでの動作確認や、同じネットワーク内のチームメンバーとの素早いファイル共有に役立ちます。

また、シンプルにHTTPプロトコルの仕組みを学習したいときにも重宝します。

これは本格的なプロダクション向けサーバーというよりは、軽いテストやローカル開発を前提としたものと考えたほうが良いでしょう。

なぜ本格的な運用には向かないのか

http.serverは、あらかじめ用意された簡単な機能しか提供していません。

暗号化通信(HTTPS)を標準で行う仕組みはなく、アクセス制限や詳細なログ出力といった高度な設定は行いにくいです。

大規模なトラフィックが集まる場所で運用すると、パフォーマンス面やセキュリティ面で問題が生じやすいでしょう。

しかし、規模の小さいテスト環境であれば十分に使える機能がそろっています。

実務で使う場面例

  • HTMLやJavaScriptを局所的にテストする際、ローカル環境でサーバーを簡単に立てたいとき
  • 社内ネットワークで静的ファイルを一時的に共有する際など、簡単に使えるファイル配布サーバーが欲しい場合
  • Mock (モック) サーバー的に使ってHTTPのやり取りを確認したい場合

多くの開発者が、最初の学習段階やちょっとした検証時にこの機能をよく活用しているようです。

Python http serverの基本的な使い方

ここからは、Python http serverを実際に起動する最もシンプルな方法を見ていきましょう。

大きく分けると2つのやり方があります。

1つはコマンドラインからモジュールを呼び出す方法、もう1つはPythonコード上でサーバーを立ち上げる方法です。

コマンドから起動する方法

Pythonがインストールされている環境で、以下のように入力するだけでWebサーバーが動き始めます。

python -m http.server 8000

コマンドを実行すると、ポート番号8000番でHTTPサーバーが起動します。

ポート番号の指定を省略すると、デフォルトのポート番号が8000になることが多いです。

他のポート番号にしたい場合は、自由に指定可能です。

もしPythonのバージョンによってモジュールの名前が異なる場合は、SimpleHTTPServerといった名称を使うケースもあります。

しかし、現在は http.server が一般的な呼び出しになっていると言えます。

実務での利用シーン:ローカル開発

前述のように、HTMLやJavaScriptの動作確認では、ローカルファイルの読み込みだけでは対応しきれない機能(Ajaxなど)があります。

そんなとき、このコマンドを実行するだけで簡単にサーバー上にファイルを配置できるのです。

同じフォルダにあるファイルがすべてWeb経由で取得できるため、ブラウザで http://localhost:8000 にアクセスするだけで動作確認が完結します。

他のポートとの競合を避ける方法

もし8000番ポートがすでに他のアプリケーションで使われていたら、異なるポート番号を指定しましょう。

python -m http.server 9000

このように指定すれば、9000番でサーバーが起動します。

ごくシンプルな指定ですが、これで競合を避けることができます。

コードから起動する方法

Pythonスクリプト内で http.server を使ってサーバーを起動するやり方もあります。

この方法は、ログの出力内容をカスタマイズしたり、独自のリクエスト処理を挟んだりするのに向いています。

以下は、とても基本的な実装例です。

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print(f"Port {PORT} でサーバーを起動しました。")
    httpd.serve_forever()

このコードを server.py のような名前で保存してから実行すると、同じようにWebブラウザでアクセスできます。

独自にクラスを拡張する例

さらに独自の機能を追加したい場合は、SimpleHTTPRequestHandler を継承したクラスを作る方法があります。

下記のサンプルでは、ログの出力方法を変更してみます。

import http.server
import socketserver

class CustomHandler(http.server.SimpleHTTPRequestHandler):
    def log_message(self, format, *args):
        # ログ出力の形式をカスタマイズ
        print("Logging from CustomHandler:", format % args)

PORT = 8000

with socketserver.TCPServer(("", PORT), CustomHandler) as httpd:
    print(f"Port {PORT} でサーバーを起動しました。")
    httpd.serve_forever()

ここでは log_message メソッドをオーバーライドし、カスタムメッセージを加えています。

実務では、アクセスログを細かく解析する際に活用できますが、あくまで簡易サーバーなので過度な負荷には注意しましょう。

静的ファイルを配布する方法

Python http server は、基本的にサーバーを起動したディレクトリ配下にあるファイルをそのままWeb経由で返します。

つまり、HTMLファイルや画像、CSS、JavaScriptなどはフォルダに入れておくと、自動的に取得できるようになります。

実務でのファイル配布例

チームで作っている成果物(画像や資料など)を一時的に共有したい場面を考えてみてください。

ファイルサーバーを本格的に構築するほどではないが、メール添付では大変という場合がありますよね。

そんな場面で、Python http serverを使うとフォルダを共有し、そのURLを伝えるだけで同僚がブラウザからファイルをダウンロードできるわけです。

ただし社内LANや限られた環境内での利用が基本です。

外部へ公開するには別途セキュリティの設定などが必要になります。

ログの扱い方

簡易サーバーとはいえ、ログの扱いは大切です。

デフォルトでは、アクセスがあるたびにコンソールへ情報が表示されます。

ログ出力の例

SimpleHTTPRequestHandler は標準で以下のような形式のログをコンソールへ出力する場合があります。

127.0.0.1 - - [16/Feb/2025 10:15:32] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [16/Feb/2025 10:15:32] "GET /main.css HTTP/1.1" 200 -

ここにはアクセス元IPアドレスやリクエストの日時、取得したファイルのパス、HTTPステータスなどが含まれています。

もしこのログをファイルに出力したい場合は、先ほど紹介したクラス継承の方法を使って log_message を独自実装することでファイル書き込み処理を追加するとよいでしょう。

ログの活用メリット

  • アクセス状況の把握:いつ誰がどのファイルにアクセスしたのかを把握できる
  • デバッグ:開発中に起きたエラーの原因を調査するときに役立つ
  • パフォーマンスの簡易確認:特定のファイルにアクセスが集中している場合などを把握しやすくなる

こういった内容を簡単に見られるだけでも、単純にローカル開発で利用する上では重宝します。

セキュリティを意識する

シンプルとはいえWebサーバーである以上、セキュリティの観点は無視できません。

特に外部に公開するときは、注意が必要です。

公開するフォルダの情報漏洩リスク

Python http serverでは、起動したディレクトリ以下のファイルが基本的に閲覧可能となります。

フォルダの構成によっては、機密情報や設定ファイルなども参照されてしまう恐れがあります。

たとえば、データベース接続情報が書き込まれたファイルが同じフォルダに存在すると、第三者からアクセスされかねません。

アクセス制限が難しい

http.serverには認証機能やアクセス制御の仕組みがありません。

パスワード保護なども標準では提供されていないため、本格的な制御が必要な場面では不向きです。

インターネット上に公開する場合は、必ず防火壁やVPN、あるいは別の安全なサーバーを経由するなどの対策を検討しましょう。

HTTPS化されていない

http.serverはHTTP通信しか扱えません。

これは暗号化されない通信であることを意味します。

開発やテスト目的なら問題ないケースも多いですが、個人情報や重要データを扱う場合は絶対に避けるべきでしょう。

動的な処理はできる?

多くの人が誤解しがちな点として、http.server モジュール単独ではサーバーサイドの動的処理はほとんどできません。

あくまで静的ファイルを返す役割が中心です。

もしPythonで動的にレスポンスを生成したい場合は、BaseHTTPRequestHandlerCGIHTTPRequestHandler を利用したり、フレームワークを導入するなど、別の仕組みが必要になります。

ちょっとしたレスポンス変更例

カスタマイズの一例として、do_GET メソッドをオーバーライドすると、GETリクエストの処理を変えることができます。

import http.server
import socketserver

class CustomRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == "/hello":
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            self.wfile.write(b"Hello from Python http server!")
        else:
            super().do_GET()

PORT = 8000

with socketserver.TCPServer(("", PORT), CustomRequestHandler) as httpd:
    print(f"Port {PORT} でサーバーを起動しました。")
    httpd.serve_forever()

このコードでは、パスが /hello の場合にだけ独自のレスポンスを返し、それ以外の場合は通常の静的ファイル配信の動作を維持しています。

実務で開発の仕組み全体を作り込むには機能的に物足りませんが、単発のテストやモックAPI的な使い方には有効です。

実務で意識したいパフォーマンス

ローカル開発程度であればPython http server の性能は問題になりにくいでしょう。

ただし、頻繁にアクセスが来る環境や大容量ファイルを多数配布する場面では、ボトルネックになる可能性が高いです。

ファイルサイズや同時アクセスの影響

多くのユーザーが同時にアクセスする状況を想定すると、シンプルな実装だけでは処理が追いつきません。

  • 大きいファイルを一度に配布しようとすると転送が遅くなる
  • 同時接続数の上限を超えると接続が切れる

こういったことが起こり得るので、必ず生産環境向けの専用Webサーバーを使うのが一般的です。

マルチスレッドやマルチプロセス対応

デフォルトの socketserver.TCPServer は単一スレッドで動作します。

並列で処理するには ThreadingTCPServerForkingTCPServer といった派生クラスを利用する必要があります。

import http.server
import socketserver

class ThreadingHTTPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

PORT = 8000

with ThreadingHTTPServer(("", PORT), http.server.SimpleHTTPRequestHandler) as httpd:
    print(f"Port {PORT} でスレッドサーバーを起動しました。")
    httpd.serve_forever()

上記のように書くと、一部の場面で同時アクセスに少しだけ対応しやすくなります。

しかし、この方法でも高負荷にはあまり向きません。

本格的に負荷をさばくなら、別の仕組みを導入することが望ましいです。

開発サイクルでの活用イメージ

Python http serverは、ソフトウェア開発の流れでたびたび出てくる「ちょっとしたファイル配布」や「ブラウザで確認したいページ表示」に最適です。

以下のようなステップで役立つことが多いです。

  1. デザインやUIを手軽にプレビュー:HTML/CSS/JSを編集したら、すぐブラウザでリロードして動作を確認
  2. ローカルで動くテスト環境として:他のアプリケーションからのリクエストを受け付ける最小限のサーバー
  3. ネットワーク越しにテスト:同じWi-Fiネットワーク上にある端末でURLを開けば、実機スマホやタブレットでも動作確認可能

こうした流れを素早く回せるので、試作やデバッグの効率が上がります。

実装時のよくある疑問

初心者の方がつまずきやすいポイントも整理しておきましょう。

ポートがすでに使用中

OSError: [Errno 98] Address already in use」というエラーが出たら、指定したポートが他のアプリケーションで使われている可能性があります。

ほかのポート番号を試すか、該当のプロセスを停止しましょう。

フォルダ移動したらファイルが読めない

http.serverは起動したディレクトリがルートディレクトリ扱いになります。

別のフォルダに移動すると、それまで配布できたファイルが見つからなくなります。

常に「どのフォルダでサーバーを起動しているか」を意識しておくことが大切です。

HTTPSのテストができない

暗号化通信はサポートしていないため、Python標準のhttp.serverでは対応できないと考えましょう。

どうしてもHTTPS通信をテストしたいときは、他の方法やツールを使う必要があります。

外部ライブラリとの違い

FlaskやDjangoなどのWebフレームワークも、内部的にはWebサーバー機能を備えています。

しかし、Python http server はそれらに比べて極めて機能が限定的です。

FlaskやDjangoとの使い分け

  • FlaskやDjangoはWebアプリケーションフレームワークであり、ルーティングやテンプレート、データベース連携などが揃っています。
  • http.serverは最低限の機能しかなく、設定ファイルも特にありません。

もし将来的に大規模なWebアプリを作る予定があるなら、フレームワークに移行するのが一般的といえそうです。

一方で、単なるローカル開発のテスト用や、ちょっとしたファイル配布だけであれば、http.serverだけで十分です。

実務で覚えておくと便利なTips

フォルダ別にサーバーを立ち上げる

開発が進むと、複数のプロジェクトで異なるディレクトリを使いたい場面が出てきますよね。

その場合は、フォルダごとにhttp.serverを起動すると同時開発がしやすくなります。

cd projectA
python -m http.server 8000

cd ../projectB
python -m http.server 8001

こうするとポート番号が異なる限り、複数のサーバーを同時に動かせます。

CORS(Cross-Origin Resource Sharing)エラーの回避

JavaScriptから別ドメインへアクセスするときにCORSエラーが発生しがちですが、ローカル環境であれば -m http.server コマンドだけで単純なテストを行う場合は問題になりにくいです。

もしCORSヘッダの制御が必要であれば、ハンドラーを拡張してレスポンスヘッダに Access-Control-Allow-Origin を付け加えるなどの実装が必要になります。

import http.server

class CORSRequestHandler(http.server.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header("Access-Control-Allow-Origin", "*")
        super().end_headers()

ただし、セキュリティ的なリスクもあるため、内容をよく理解した上で利用しましょう。

まとめ

ここまで、Python http server の概要と基本的な使い方について詳しく紹介してきました。

コマンドラインでの簡易サーバー起動や、コード上でのカスタマイズ方法、セキュリティ面での注意事項なども含めて見てきましたがいかがでしたか。

特にローカルでの開発やファイル配布にはかなり便利に使えます。

ただし、本格的な運用や高度な機能が必要な場合は、別のフレームワークやサーバーソリューションを検討するほうがよいでしょう。

初心者の方にとっては、まずこのhttp.serverを使って「Webサーバーを起動する」という基本の流れに慣れておくと、より複雑なフレームワークを学ぶ上でも助けになるのではないでしょうか。

皆さんが開発現場でスムーズに検証を進める一助となれば幸いです。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。