はじめに
概要
この記事では、PythonでローカルにWebサーバーを立てる方法をやさしく解説します。標準ライブラリだけで数秒で立ち上げる簡易サーバーから、ローカルでHTTPSを動かす手順、さらにsocketモジュールを使って基本を学ぶ自作サーバーまで扱います。学習や開発のための手順と実例コードを中心に説明します。
対象読者
初心者から中級者を想定しています。Pythonの基本文法とターミナルの操作が分かれば読み進められます。Webの深い知識は不要です。
この記事で学べること
- 標準コマンドで静的ファイルを配る方法(数行で完了)
- ローカルでHTTPSを動かす簡単な手順と自己署名証明書の作り方
- socketを使った最低限のHTTP処理の仕組み理解
必要な準備と注意点
Pythonがインストールされていること、端末でのコマンド実行ができることが前提です。ローカルでの実験は安全ですが、公開環境で使う際はセキュリティに十分配慮してください。
2. Python標準ライブラリで「秒」で立てる簡易Webサーバー
概要
Pythonには、コマンド1行でローカルに簡易Webサーバーを立ち上げる機能があります。たとえば作業中のフォルダをそのまま公開し、ブラウザで確認するときに便利です。学習やフロントエンドの確認、簡単なファイル共有に向いています。
立て方(基本)
カレントディレクトリを公開する最も簡単な方法は次のコマンドです。
python -m http.server
デフォルトでポート8000が使われます。ブラウザで http://localhost:8000 にアクセスするとディレクトリ一覧やindex.htmlが表示されます。
ポートを指定する場合は次のようにします。
python -m http.server 9000
公開ディレクトリを指定したい場合は –directory オプションを使います。
python -m http.server 8000 --directory path/to/public
バインド先をローカルだけに限定するには –bind 127.0.0.1 を追加します。
実用的な使い方と注意点
- サーバー停止は Ctrl+C で行います。
- 静的ファイルの確認や簡単な共有に便利です。\
- しかし、本番運用や公開ネットワークでの使用には向きません。認証やHTTPSがなく、ファイルがそのまま見えてしまうためです。
必要なときに素早く立ち上げて確認する、という使い方が最も役立ちます。
3. ローカルでHTTPSサーバーをPythonで立てる
概要
ローカルでHTTPSを試すときは、http.serverとsslモジュールを組み合わせます。自己署名証明書を用意すれば、短時間で暗号化通信を確認できます。開発用途ならブラウザの警告は許容できます。
1) 自己署名証明書の作成(例)
ターミナルで次のコマンドを実行します。OpenSSLが必要です。
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout key.pem -out cert.pem -days 365 \
-subj "/CN=localhost"
これで key.pem(秘密鍵)と cert.pem(証明書)ができます。
2) Pythonスクリプト(例)
以下の内容を server.py として保存します。
from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl
httpd = HTTPServer(('localhost', 4443), SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(
httpd.socket, keyfile='key.pem', certfile='cert.pem', server_side=True)
print('Serving on https://localhost:4443')
httpd.serve_forever()
3) 起動と注意点
ターミナルで python3 server.py を実行してアクセスします。ブラウザは自己署名証明書を信頼しないため警告が出ます。ローカル確認だけなら問題ありません。証明書をOSやブラウザに登録すれば警告を消せますが、手順を誤るとセキュリティに影響するので注意してください。
4. WebフレームワークなしでWebサーバーを自作する(socket編)
概要
PythonのsocketモジュールでTCPサーバーを立ち上げ、HTTPリクエストを自分で受け取ってレスポンス文字列を返します。仕組みを理解する良い練習です。
サンプルコード(最小限)
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(1)
print(f"Listening on http://{HOST}:{PORT}")
while True:
conn, addr = s.accept()
with conn:
req = conn.recv(1024).decode('utf-8', errors='ignore')
print(req.splitlines()[0] if req else '-')
body = 'Hello, World!'
resp = (
'HTTP/1.1 200 OK\r\n'
'Content-Type: text/plain; charset=utf-8\r\n'
f'Content-Length: {len(body.encode())}\r\n'
'\r\n'
f'{body}'
)
conn.sendall(resp.encode())
実行と確認
このスクリプトを実行し、ブラウザで http://127.0.0.1:8000/ にアクセスすると「Hello, World!」が表示されます。ポートは1024未満でなければ管理者権限不要です。
解説ポイント
- TCP接続を受け取り、生のHTTPテキストを読み書きします。HTTPヘッダーは自分で組み立てます。
- 簡単ですが単一スレッドなので同時接続には弱いです。並列化するにはスレッドやasyncio、selectが必要です。
- 実運用向けではありません。ヘッダー解析、長いリクエスト、セキュリティは未実装です。












