Python で簡易 WEB サーバーを構築する方法と注意点
そもそも WEB サーバーとは
WEB サーバーは、ブラウザなどのクライアントからのリクエストを受け取り、HTML ファイルや画像などのデータを返すソフトウェアです。
普段インターネットを使うとき、あなたが見ている Web ページはすべてどこかのサーバーから送られてきています。その代わりを Python でやってみるのがこの記事の主題です。
方法 1: 標準モジュール http.server(最も手軽)
Python に最初から入っている http.server モジュールを使うと、ワンコマンドで WEB サーバーが立ち上がります。
サーバーを立てる
# カレントディレクトリを配信
python3 -m http.server 8000
これだけで http://localhost:8000 にアクセスできるようになります。カレントディレクトリのファイルがそのまま Web 上で閲覧できます。
別のポートで立てる
python3 -m http.server 3000
特定のディレクトリだけ配信する
python3 -m http.server 8000 --directory /path/to/www
動作の仕組み
このコマンドがやることは非常にシンプルです。
- 指定したポートで TCP 接続を待つ
- ブラウザからリクエストが来たら、対応するファイルを読み込む
- ファイルの中身をブラウザに返す
Python のコードを 1 行も書かずに済むのが魅力です。
方法 2: Flask を使った基本的な WEB サーバー
http.server は静的ファイルの配信が中心です。動的なページ(ユーザーの入力に応じて内容が変わるページ)を作りたい場合は、Web フレームワークを使います。
その中でも最もシンプルなのが Flask です。
Flask のインストール
pip install flask
最小限のサーバー
app.py を作成します。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello, World!</h1>'
@app.route('/about')
def about():
return '<h1>このサイトについて</h1><p>Python で作った WEB サーバーです。</p>'
if __name__ == '__main__':
app.run(debug=True, port=5000)
サーバーを起動する
python app.py
http://localhost:5000 にアクセスすると、「Hello, World!」と表示されます。
Flask の基本概念
| 概念 | 説明 |
|---|---|
@app.route('/') |
URL / にアクセスした時に実行する関数を定義 |
return |
ブラウザに返す HTML テキスト |
debug=True |
コード変更時に自動でリロードされる(開発用) |
port=5000 |
待受ポートの指定 |
HTML テンプレートを使う
実際の開発では、Python の中で HTML を書くのは大変です。Flask にはテンプレート機能があり、HTML ファイルを別に用意できます。
プロジェクト構成:
myapp/
├── app.py
└── templates/
└── index.html
templates/index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Python WEB サーバー</title>
</head>
<body>
<h1>{{ title }}</h1>
<p>{{ message }}</p>
</body>
</html>
app.py:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', title='ようこそ', message='Python で作った WEB サーバーです。')
if __name__ == '__main__':
app.run(debug=True, port=5000)
方法 3: Python 独自で HTTP サーバーを書く(学習用)
WEB サーバーの中身を理解するために、Socket を使った最小限のサーバーを書いてみます。実用性は低いですが、仕組みがわかるので学習にはなります。
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8080))
server.listen(1)
print('Server running on port 8080...')
while True:
client, addr = server.accept()
request = client.recv(1024).decode()
print(f'Request: {request.splitlines()[0]}')
# 固定の HTML を返す
body = '<h1>Hello from raw socket!</h1>'
response = (
'HTTP/1.1 200 OK\r\n'
'Content-Type: text/html; charset=utf-8\r\n'
f'Content-Length: {len(body.encode())}\r\n'
'\r\n'
f'{body}'
)
client.sendall(response.encode())
client.close()
ブラウザで http://localhost:8080 にアクセスすると、「Hello from raw socket!」と表示されます。
本番運用での注意点(重要)
簡易サーバーは開発・学習・社内ツールなどには便利ですが、本番公開にはそのまま使えない場面がほとんどです。主な注意点をまとめます。
1. セキュリティ
| 問題点 | 説明 |
|---|---|
| HTTPS 未対応 | http.server や Flask の run() は HTTP のみ。通信が暗号化されない |
| 認証機能がない | 誰でもアクセスできてしまう |
| XSS / SQL インジェクション | 入力値のバリデーションを自分で書く必要がある |
2. パフォーマンス
| 問題点 | 説明 |
|---|---|
| 同時接続数の制限 | 単純なサーバーは同時に処理できるリクエスト数が少ない |
| 非同期対応が必要 | 多人数が使う場合は Gunicorn / uWSGI などの WSGI サーバーが必要 |
3. 可用性
| 問題点 | 説明 |
|---|---|
| サーバーが止まると全滅 | プロセスが落ちたら Web サイトが表示されなくなる |
| 自動復旧がない | systemd や Docker のリスタート機能を使う必要がある |
4. http.server に特有の注意
- デフォルトで カレントディレクトリの全ファイルを公開 してしまう
- ディレクトリリストィングが有効(フォルダの中身がすべて見える)
- 設定ファイルが存在しないため、セキュリティ設定が難しい
本番向けの構成イメージ
[ブラウザ] → [nginx(リバースプロキシ)] → [Gunicorn] → [Flask アプリ]
- nginx: SSL/TLS 終端、静的ファイル配信、負荷分散
- Gunicorn: Flask アプリを本番環境で動かす WSGI サーバー
- Flask: アプリケーションのロジック
まとめ: 何を选ぶか
| 場面 | おすすめ |
|---|---|
| ファイルを素早く共有したい | http.server |
| 簡単なツールやプロトタイプを作りたい | Flask |
| 本番公開したい | Flask + Gunicorn + nginx |
| WEB サーバーの仕組みを学びたい | Socket ベースの自作 |
Python で WEB サーバーを立てることは非常に簡単ですが、「簡単だからこそ」本番運用の注意点を押さえておくことが重要です。開発・学習用途として使い、本番に-options する場合は別途環境を整えましょう。
おすすめの Python WEB 開発書籍
Python で WEB アプリを開発する方向けに、おすすめの本を紹介します。