Pythonでwebサーバーを自作!基礎から応用まで詳しく解説

目次

はじめに

概要

この文書は「web サーバー 自作 python」に関連する複数の記事を調査・比較して、学びやすくまとめたものです。Pythonでローカルにサーバーを立てる基本から、ソケットやSSLを使った実装例まで、段階的に学べる構成にしています。

目的

  • 基礎理解:HTTPの仕組みとPythonでの簡易起動法を理解します。
  • 実践力:簡単なWebサイトを作る手順や、自作サーバーで注意すべき点を学びます。
  • 発展:ソケットや暗号化(HTTPS)を用いた実装例で応用力を高めます。

対象読者

プログラミング初心者から中級者を想定します。Pythonの基本文法(変数、関数、モジュール)が分かれば読み進められます。

本資料の使い方

章ごとに手を動かしながら進めると理解が深まります。まずは第2章の簡易起動法で試し、徐々にソケットやSSLの章に進んでください。

Pythonで簡易ローカルHTTPSサーバを立てる|npaka

概要

Pythonの標準ライブラリとOpenSSLで自己署名証明書を作り、ローカルでHTTPSサーバを立てます。テスト用や開発中のファイル共有に便利です。

証明書の作成(OpenSSL)

  1. ターミナルで以下を実行します(localhostをCNに設定)。
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365 -subj "/CN=localhost"
  1. これで key.pem と cert.pem が作成されます。ブラウザは自己署名を警告しますが、開発用なら無視して進められます。

Pythonスクリプト例

以下は最小限のサーバースクリプトです。

import http.server, socketserver, ssl
PORT = 4443
handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(('localhost', PORT), handler)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('cert.pem', 'key.pem')
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
print(f"Serving HTTPS on https://localhost:{PORT}")
httpd.serve_forever()

起動とアクセス

  1. 作成したcert.pem と key.pem をスクリプトと同じフォルダに置きます。
  2. スクリプトを実行し、ブラウザで https://localhost:4443 にアクセスします。

注意点

  • 自己署名証明書は信頼されないため、本番公開には使えません。ブラウザの例外設定でローカルアクセスを許可してください。
  • ポートやファイアウォール設定に気を付けてください。ローカルネットワークで共有する場合は許可を確認します。

PythonでWebフレームワークを使わずにWebサイトを作成する

概要

socketモジュールだけで、簡易的なHTTPサーバーを自作します。フレームワークを使わずに、ソケットの作成、接続待ち、リクエスト受信、シンプルなレスポンス送信までを学べます。教育目的の最小実装です。

必要な準備

  • Python 3がインストールされていること
  • ターミナルでスクリプトを実行できること

コード例

import socket
HOST='127.0.0.1'
PORT=8000
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
    s.bind((HOST, PORT))
    s.listen()
    print('Listening on', HOST, PORT)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        req = b''
        while True:
            data = conn.recv(1024)
            if not data:
                break
            req += data
            if b'\r\n\r\n' in req:
                break
        print(req.decode(errors='replace'))
        body = '<html><body><h1>Hello</h1></body></html>'
        resp = ('HTTP/1.1 200 OK\r\n'
                f'Content-Length: {len(body.encode())}\r\n'
                "Content-Type: text/html; charset=utf-8\r\n"
                "Connection: close\r\n\r\n") + body
        conn.sendall(resp.encode())

ポイント解説

  • HTTPリクエストは最初にリクエスト行、続いてヘッダ、空行、ボディの順です。
  • この例ではヘッダ終端の”\r\n\r\n”で受信完了を判断します。長いボディやPOSTは別処理が必要です。
  • HTTP/1.1はデフォルトで接続を保持します。ここでは簡単にするため”Connection: close”を返しています。
  • 複数同時接続はループとスレッドやselectで対応します。実運用では既成フレームワークやセキュリティ対策を使ってください。

動作確認

ブラウザでhttp://127.0.0.1:8000/にアクセスすると表示されます。ターミナルでリクエスト内容が出力されるはずです。

Pythonでローカル内で簡易Webサーバーを使う方法 – Chaba Lab

概要

Python標準のhttp.serverモジュールを使うと、コマンド1行でローカルに簡易Webサーバーを立てられます。カレントディレクトリがWebルートになるため、テストやファイル共有に便利です。

コマンド1行で起動

  • ターミナルで公開したいフォルダに移動し、次を実行します。
  • macOS/Linux: python3 -m http.server 8000
  • Windows: python -m http.server 8000
  • ブラウザで http://localhost:8000/ を開くと、フォルダ内のファイル一覧やindex.htmlが表示されます。

よく使うオプション

  • ポート変更: 数字を8000の代わりに指定します(例: 3000)。
  • バインド先指定: python3 -m http.server 8000 –bind 127.0.0.1 とするとローカルのみ公開します。
  • ディレクトリ指定(Python 3.7+): python3 -m http.server 8000 –directory ./public

プログラムから起動する例(短いスクリプト)

from http.server import HTTPServer, SimpleHTTPRequestHandler

server = HTTPServer((‘127.0.0.1’, 8000), SimpleHTTPRequestHandler)
print(‘Serving on http://127.0.0.1:8000’)
server.serve_forever()

使い方のポイントと注意

  • Ctrl+Cで停止します。
  • 認証やTLSがないため、本番環境や公開ネットワークでの使用は避けてください。ローカルでの確認や社内ネットワークでの一時的な共有に向きます。
  • MIMEタイプは自動判別しますが、細かい設定が必要な場合は専用サーバーを使うと楽です。

Python + ソケットでHTTPサーバーを自作!Webサービスの基礎を学ぼう

概要

socketモジュールでHTTPサーバーの仕組みを学びます。リクエスト解析からレスポンス生成、簡単なWSGIミドルウェア、TCP接続の簡易プールまで扱い、Webサービスの内部が分かるように解説します。

最小のHTTPサーバー

短いコードで接続を受け取り、リクエスト行を読み、固定のHTMLを返す例です。

import socket
s=socket.socket()
s.bind(('localhost',8000))
s.listen()
while True:
    conn,addr=s.accept()
    req=conn.recv(1024).decode()
    print(req.splitlines()[0])
    resp='HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n<h1>Hello</h1>'
    conn.send(resp.encode()); conn.close()

リクエスト解析はシンプルにまず行を分割して確認します。

WSGI風ミドルウェアの例

環境変数を作り簡単なミドルウェアでレスポンスを書き換えます。アプリを呼び出し、start_responseを通してヘッダを渡す基本を体験できます。

TCP接続プールの考え方

毎回ソケットを作る代わりに接続を再利用する仕組みを自作します。queueで接続を管理し、同時接続の制御やタイムアウト処理を加えると現実的になります。

WSGIアプリとの連携

自作のソケット受信部から環境を作成し、WSGIアプリに渡すことで既存のフレームワークも動かせます。ログや例外処理を整えると運用が楽になります。

実践のヒント

  • リクエストのサイズや不正な入力に注意してください。
  • スレッドやプロセスで並列化すると応答性が上がります。
  • 本番環境では既存のサーバーを使うことを推奨します。

簡単にローカルでWebサーバーを立てる3つの方法(Node/Python/VSCode)

はじめに

ローカルでWebサーバーを立てる目的は主に、静的ファイルの確認やフロント開発の確認です。ここでは手軽に使える3つの方法を、コマンド例と特徴を交えて分かりやすく紹介します。

1. Node.js(http-server / serve)

  • コマンド例(インストール不要):
  • npx http-server . -p 8000
  • npx serve . -p 5000
  • 特徴:高速で設定が柔軟、SPAのフォールバックやCORS設定が可能です。ビルド後の配布物を確認したいときに便利です。

2. Python(http.server)

  • コマンド例:
  • python3 -m http.server 8000
  • 特徴:Pythonが入っていればすぐ使えます。非常にシンプルで、カレントディレクトリをそのまま公開します。ファイル一覧が自動で表示されるため、簡単な確認に向いています。停止はCtrl+Cです。

3. VSCode(Live Server拡張)

  • 使い方:拡張機能でLive Serverをインストールして、右クリックから「Open with Live Server」。保存すると自動でリロードします。
  • 特徴:編集と確認を同時に行いたい開発者向けで、ホットリロードが便利です。エディタ内で完結します。

使い分けの目安

  • 単純にファイルをすぐ確認したいとき:Pythonのhttp.server
  • ビルド後の配布物や細かい設定が必要なとき:Nodeのhttp-server/serve
  • 編集→確認を高速に繰り返したいとき:VSCodeのLive Server

注意点

  • 基本的にローカル専用で、インターネットに公開しないでください。セキュリティ対策はありません。ポートが既に使われている場合は別のポートを指定してください。

以上の3つを使い分ければ、ほとんどのローカル確認は十分にカバーできます。用途に合わせて選んでください。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次