閉じる

Pythonでローカルサーバー構築入門|http.serverで爆速起動ガイド

Pythonで手軽にローカルサーバーを立ててみたいと感じたことはありませんか。

実はPython標準ライブラリのhttp.serverを使えば、たった1行のコマンドで静的サイトの確認や簡易ファイル共有ができるローカルサーバーを立ち上げることができます。

本記事では、インストール不要・爆速起動をテーマに、Python初心者でも迷わず使えるローカルサーバー構築の基本から、実用的な活用例、注意点まで丁寧に解説します。

Pythonでローカルサーバーを立ち上げるメリット

ローカルサーバーとは何か

ローカルサーバーとは、自分のPCの中で動かすサーバーのことです。

ブラウザからhttp://localhost:8000などにアクセスすると、実際にはインターネット上のどこかではなく、自分のPC上で動いているサーバープログラムと通信しています。

普段、Webサイトを見るときは、どこかの会社やクラウドにあるWebサーバーと通信していますが、ローカルサーバーではその役割を自分のPCが担います。

これにより、次のような利点があります。

1つ目は、インターネットに接続していなくても開発や動作確認ができることです。

出先やオフライン環境でも、ローカルサーバーさえ動かせば、WebアプリやHTMLの表示確認ができます。

2つ目は、実際のHTTP通信に近い形で挙動を確認できることです。

単純にブラウザでローカルファイルを開くだけでは再現できない、相対パスの挙動やAjax通信なども、ローカルサーバー上なら本番環境にかなり近い状態でテストできます。

Pythonでローカルサーバーを使う用途

Pythonでローカルサーバーを立ち上げる主な用途は、以下のようなものです。

1つ目は、静的サイト(HTML/CSS/JavaScript)の動作確認です。

画像やCSS、JSを相対パスで読み込んでいると、ファイルを直接開く方式とHTTPサーバー経由では挙動が異なる場合があります。

例えば、Ajaxでfile://を扱えないケースなどです。

ローカルサーバーを使うことで、本番環境に近い形で確認できます。

2つ目は、APIモックサーバーとしての利用です。

バックエンドがまだ出来上がっていない段階でも、簡易的なレスポンスを返すサーバーをPythonで用意して、フロントエンドの開発やテストを進めることができます。

3つ目は、社内・チーム内での簡易ファイル共有です。

同じネットワーク内にいるメンバーに一時的にファイルを配るだけなら、専用のファイルサーバーを構築しなくても、Pythonのローカルサーバーで十分な場合があります。

ただし、この用途ではセキュリティ上の注意点もあるため、後半で詳しく解説します。

http.serverモジュールの基本

http.serverとは

Pythonのhttp.serverは、Python標準ライブラリに含まれる簡易HTTPサーバーモジュールです。

追加インストールは一切不要で、Pythonがインストールされていればすぐに使うことができます。

このモジュールは、主に次のような目的で設計されています。

  • 学習用やデモ用の簡易サーバー
  • ローカルでのファイル配信や動作確認
  • 開発時の一時的なテストサーバー

一方で、本格的なWebアプリケーションを大量のユーザーに提供するためのサーバーとしては設計されていません。

この点は後ほど本番運用に使わない理由として詳しく説明します。

http.serverでできること・できないこと

ここでhttp.serverの得意なことと不得意なことを整理しておきます。

まず、できることとして代表的なのは次の内容です。

1つ目は、ディレクトリ配下の静的ファイルの配信です。

HTML、CSS、JavaScript、画像、PDFなど、ファイルをそのままHTTPで返す用途に向いています。

2つ目は、シンプルなカスタムハンドラによるレスポンス制御です。

後述するように、クラスを継承して少しコードを書くことで、決まったJSONを返したり、簡単なAPIモックサーバーを作ったりできます。

3つ目は、ローカルネットワーク内での一時的な配布です。

LAN内に限定して短時間だけ公開する、といった用途には十分です。

一方、http.serverでできない、あるいは苦手とすることもはっきりしています。

  • ユーザー認証やアクセス制御などの高度なセキュリティ機能
  • HTTPS(SSL/TLS)による暗号化通信
  • 高負荷なアクセスや多数同時接続の安定処理
  • 複雑なルーティングやテンプレートエンジンとの連携
  • ログ管理やエラーハンドリングの高度なカスタマイズ

このような機能が必要になる場合は、FlaskやDjango、FastAPIのようなWebフレームワーク、あるいはnginxやApacheといった本格的なWebサーバーの利用を検討する必要があります。

http.serverでローカルサーバーを爆速起動

コマンド1行でHTTPサーバー起動

Python3がインストールされている環境であれば、カレントディレクトリをそのまま公開するHTTPサーバーを、次の1行だけで起動できます。

Shell
python -m http.server

このコマンドを実行すると、デフォルトではポート8000番でサーバーが立ち上がり、現在のディレクトリ配下のファイルがブラウザから閲覧可能になります。

ブラウザでhttp://localhost:8000にアクセスし、フォルダ一覧やHTMLファイルなどが見られれば成功です。

シンプルな動作の流れ

コマンドの動作を整理すると、内部では次のような処理が行われています。

  1. python -mでモジュールhttp.serverを「スクリプトとして」実行
  2. デフォルト設定(ポート8000、現在のディレクトリ)でHTTPサーバーを起動
  3. リクエストが来るごとにファイルを探して返す、またはディレクトリ一覧を返す

この一連の流れをすべて標準ライブラリが面倒を見てくれるため、ユーザー側はほとんど何も考えずにHTTPサーバーを立てられます。

ポート番号の指定と変更方法

デフォルトのポート番号8000は便利ですが、別のアプリケーションと競合したり、プロジェクトごとにポートを分けたい場合もあります。

そのときは、コマンドの末尾にポート番号を指定します。

Shell
python -m http.server 8080

この場合は、ポート8080番でサーバーが起動し、ブラウザからはhttp://localhost:8080でアクセスすることになります。

よく使われるポート番号としては、次のようなものがあります。

用途・イメージ例のポート番号
デフォルトの簡易サーバー8000
別プロジェクト用やAPIモック8080, 8001 など
Node.js系ツールとの並行利用3000, 5173 など

同じポート番号で同時に2つのサーバーを動かすことはできません

その場合は、ポート番号を変えて再度起動する必要があります。

特定ディレクトリを公開する方法

http.serverは、基本的にコマンドを実行したカレントディレクトリをルートとして公開します。

したがって、特定ディレクトリを公開したいときは、先にそのディレクトリに移動してからコマンドを実行します。

Shell
cd /path/to/your/project/dist
python -m http.server 8000

この例では、distディレクトリ配下のファイルだけが公開されます。

ブラウザのURLはhttp://localhost:8000のままですが、サーバー視点ではdistがドキュメントルートになっているイメージです。

もし、スクリプトから明示的にディレクトリを指定したい場合は、Pythonコード内でディレクトリを変更してからサーバーを起動する方法もあります。

次のセクションで、スクリプトとしての使い方を紹介します。

バージョン別のhttp.serverの使い方

Python3系でのhttp.server起動方法

Python3では、http.serverモジュールが標準で用意されており、先ほどのようにpython -mで実行する方法が最も手軽です。

さらに一歩踏み込んで、Pythonスクリプトとして起動する例を見てみましょう。

Python
#!/usr/bin/env python3
# simple_server.py

from http.server import HTTPServer, SimpleHTTPRequestHandler
import socketserver

# ポート番号の設定
PORT = 8000

# ハンドラクラスはSimpleHTTPRequestHandlerをそのまま使う
HandlerClass = SimpleHTTPRequestHandler

def main():
    # HTTPServerまたはTCPServerを使ってサーバーを作成
    with socketserver.TCPServer(("", PORT), HandlerClass) as httpd:
        print(f"Serving at port {PORT}")
        try:
            # 無限ループでリクエストを処理
            httpd.serve_forever()
        except KeyboardInterrupt:
            # Ctrl+Cで安全に停止
            print("\nShutting down server...")
            httpd.server_close()

if __name__ == "__main__":
    main()

このスクリプトを実行すると、先ほどのpython -m http.serverとほぼ同じように、カレントディレクトリを公開するサーバーが立ち上がります。

Shell
python simple_server.py
実行結果
Serving at port 8000

この方法の利点は、自分でハンドラクラスを書き換えて挙動をカスタマイズしやすい点にあります。

APIモックサーバーなどを作る際には、スクリプトでの起動が便利です。

Python2との違いと注意点

Python2では、http.serverというモジュール名ではなく、SimpleHTTPServerBaseHTTPServerが使われていました。

Python2でローカルサーバーを立ち上げたい場合、よく使われていたコマンドは次のようなものです。

Shell
python -m SimpleHTTPServer 8000

Python3に移行した現在は、Python2自体が公式サポート終了となっているため、新しく学ぶ場合はPython3系のみを覚えれば問題ありません。

もし古い記事でSimpleHTTPServerの記述を見かけたら、「Python3ではhttp.serverに置き換わっている」と理解しておくとよいです。

また、モジュール名だけでなく、文字列処理や標準ライブラリの細かな挙動も異なるため、Python2向けサンプルコードをそのままPython3で実行するとエラーになることがあります。

そのため、新規開発や学習ではPython3を前提にすることを強くおすすめします。

実用的な使い方の例

静的サイト(HTML/CSS/JS)の動作確認

静的サイトの開発では、HTMLファイルを直接ダブルクリックしてブラウザで開く方法もありますが、JavaScriptでのAjax通信や、一部のライブラリはfile://スキームでは正しく動作しないことがあります。

そこで、プロジェクトフォルダをルートとしてローカルサーバーを立ち上げると、本番とほぼ同じhttp://での動作確認ができます。

Shell
cd /path/to/your/static-site
python -m http.server 8000

その後、ブラウザでhttp://localhost:8000にアクセスすると、index.htmlがトップページとして表示されます。

相対パスの挙動やリソースの読み込み順など、大事なポイントを本番と近い形でテストできるのが大きなメリットです。

APIモックサーバーとして使う方法

http.serverは、そのままでは静的ファイル配信が中心ですが、ハンドラを自作することで簡易APIモックとしても利用できます。

ここでは、特定のパスにアクセスするとJSONを返す簡単な例を紹介します。

Python
#!/usr/bin/env python3
# mock_api_server.py

from http.server import HTTPServer, BaseHTTPRequestHandler
import json

class MockAPIHandler(BaseHTTPRequestHandler):
    # GETリクエストへの応答を定義
    def do_GET(self):
        # パスに応じてレスポンスを切り替える例
        if self.path == "/api/users":
            self._send_json_response(
                {"users": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]}
            )
        else:
            # 未定義パスは404を返す
            self.send_response(404)
            self.end_headers()
            self.wfile.write(b"Not Found")

    def _send_json_response(self, data, status_code=200):
        # ステータスコードを送信
        self.send_response(status_code)
        # レスポンスヘッダにContent-Typeを設定
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.end_headers()
        # Pythonの辞書をJSONに変換して送信
        response_body = json.dumps(data).encode("utf-8")
        self.wfile.write(response_body)

def run(server_class=HTTPServer, handler_class=MockAPIHandler, port=8001):
    server_address = ("", port)
    httpd = server_class(server_address, handler_class)
    print(f"Mock API server is running on port {port}")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("\nShutting down mock API server...")
        httpd.server_close()

if __name__ == "__main__":
    run()

このスクリプトを実行します。

Shell
python mock_api_server.py
実行結果
Mock API server is running on port 8001

ブラウザやHTTPクライアントからhttp://localhost:8001/api/usersにアクセスすると、次のようなJSONが返ってきます。

JSON
{"users": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]}

このように、バックエンドが完成する前にフロントエンド開発を進めたいときに、mock APIとしてhttp.serverを活用できます。

社内・チーム内での簡易ファイル共有

同じネットワーク内のメンバーに、一時的にファイルを配布したい場面があります。

メールでは送れない大きなファイルや、一時的な成果物などは、Pythonのローカルサーバーで簡易ファイル共有することができます。

手順としては、サーバー役のPCで共有したいフォルダに移動し、LAN内からアクセス可能なアドレスでサーバーを立ち上げます。

Shell
cd /path/to/share
python -m http.server 8000

そのうえで、同じネットワーク内のメンバーに、サーバーPCのIPアドレスを伝えます。

例えばサーバーPCのローカルIPが192.168.0.10であれば、以下のURLにアクセスしてもらいます。

http://192.168.0.10:8000

ブラウザ上でディレクトリ一覧が表示され、必要なファイルをクリックしてダウンロードできます。

ただし、この方法では認証やアクセス制限は一切ないため、公開するネットワークやフォルダの中身には細心の注意が必要です。

この点については、後半のセキュリティの章で改めて解説します。

開発を快適にするオプションとTips

バインドアドレス(0.0.0.0)の設定

デフォルトのpython -m http.serverでは、通常すべてのインターフェイス(0.0.0.0)で待ち受けます。

つまり、同じLAN内の他のPCからもアクセスできる状態になることが多いです。

もし明示的にバインドアドレスを指定したい場合は、スクリプトでサーバーを立ち上げる方法が便利です。

Python
#!/usr/bin/env python3
# bind_address_server.py

from http.server import HTTPServer, SimpleHTTPRequestHandler

PORT = 8000
BIND_ADDRESS = "127.0.0.1"  # 自分のPCからのみアクセス可能

def run():
    server_address = (BIND_ADDRESS, PORT)
    httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
    print(f"Serving on {BIND_ADDRESS}:{PORT}")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("\nShutting down server...")
        httpd.server_close()

if __name__ == "__main__":
    run()

この例では127.0.0.1(localhost)でのみ待ち受けるため、同じPCからしかアクセスできません

逆に、LAN内の他のPCからもアクセスさせたい場合は、次のように0.0.0.0を使います。

Python
BIND_ADDRESS = "0.0.0.0"

0.0.0.0で待ち受けると外部からのアクセスも受け付けるため、利用するネットワークや環境を慎重に選ぶ必要があります。

ディレクトリリスティングの挙動

http.serverは、リクエストされたパスがディレクトリである場合、次のような挙動をします。

  1. そのディレクトリ内にindex.htmlがあれば、それを返す
  2. なければ、そのディレクトリ配下のファイル一覧をHTMLとして生成して返す

これは、簡易サーバーとしては非常に便利ですが、フォルダ内の構成が丸見えになるという側面もあります。

公開したくないファイルや機密情報を含むディレクトリでサーバーを起動しないよう、十分注意しましょう。

ディレクトリリスティングを制御したい場合は、SimpleHTTPRequestHandlerを継承してlist_directoryメソッドをオーバーライドすることで、表示内容をカスタマイズしたり、403 Forbiddenを返したりすることも可能です。

ただし、このレベルのカスタマイズが必要な場合は、FlaskなどのWebフレームワークを使った方がシンプルになる場合も多いです。

自動リロードと組み合わせる方法

http.server自体には、ファイル変更を検知して自動リロードする機能はありません。

しかし、外部ツールと組み合わせることで、快適な開発環境を構築できます。

典型的なパターンとしては、次のような構成です。

  1. python -m http.serverで静的ファイルを配信
  2. 別のツール(例: BrowserSync、npmのライブサーバー、watchdogスクリプトなど)でファイル変更を監視
  3. 変更があったらブラウザを自動リロード

Pythonだけで実現したい場合は、watchdogライブラリを使ってファイル変更時にブラウザを再読み込みする、といったスクリプトを書くこともできます。

ただし、ある程度の構築が必要になるため、フロントエンド開発が中心であれば、既存のライブリロードツールと組み合わせる方が実用的な場合が多いです。

セキュリティと運用上の注意点

本番運用にhttp.serverを使わない理由

http.serverは非常に便利ですが、本番運用するWebサービスのサーバーとして使うことは推奨されていません

理由はいくつかあります。

1つ目は、セキュリティ機能が極めて限定的なことです。

認証やアクセス制御、レートリミット、WAFのような高度な保護機能はありません。

また、想定していない使い方をされた場合の挙動も、専用サーバーほど厳密には検証されていません。

2つ目は、高負荷や多数同時接続への耐性が低いことです。

大量アクセスを受けると処理が詰まりやすく、サービスが不安定になる恐れがあります。

3つ目は、ログ管理や監視、スケールアウトの仕組みが乏しいことです。

本番運用では、ログの収集・分析、稼働状況の監視、ロードバランサとの連携などが必要になりますが、http.server単体ではこれらを賄うことは困難です。

そのため、http.serverは開発・学習・一時的な利用専用のツールと位置づけ、本番用途では専用サーバーやWebフレームワークを使うことが重要です。

外部公開時のリスクと対策

LAN内だけで使うつもりでhttp.serverを立ち上げていても、設定次第では意図せず外部からアクセス可能になってしまうことがあります。

ここでは、代表的なリスクと簡単な対策を整理します。

まず、グローバルIP経由でアクセス可能になってしまうリスクがあります。

ルーターのポートフォワーディング設定や、クラウド環境のセキュリティグループ設定などが緩いと、世界中からあなたのローカルサーバーにアクセスできてしまう可能性があります。

http.serverには認証も暗号化もないため、ファイルが丸見えになる危険があります。

対策としては、次のようなポイントを意識することが重要です。

1つ目は、バインドアドレスをlocalhost(127.0.0.1)に限定することです。

自分のPCだけで完結させたい場合は、先ほど紹介したように127.0.0.1でサーバーを起動します。

2つ目は、ファイアウォールやOSのセキュリティ設定を適切に保つことです。

不必要なポートを外部に開放しない、公開ルールを確認する、といった基本的な対策が重要です。

3つ目は、機密情報を含むディレクトリでサーバーを起動しないことです。

ホームディレクトリ全体などでコマンドを実行してしまうと、思わぬファイルまで閲覧可能になってしまうことがあります。

公開するフォルダは用途ごとに限定し、中身も確認してから起動するようにしましょう。

外部からのアクセスを前提にWebサービスを提供したい場合は、必ず本番向けのWebサーバーやフレームワークを利用し、適切なセキュリティ設定を行うことが不可欠です。

まとめ

Pythonのhttp.serverを使えば、インストール不要・1行コマンドでローカルサーバーを起動でき、静的サイトの確認やAPIモック、簡易ファイル共有まで幅広く活用できます。

一方で、本番運用には向かない設計であり、認証や暗号化、負荷対策といった機能は備えていません。

そのため、開発・検証・一時的利用に割り切り、ポートやバインドアドレス、公開ディレクトリの選び方に注意しながら安全に活用することが大切です。

まずは小さなプロジェクトで試し、便利さとリスクのバランスを体感してみてください。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!