ホーム 記事一覧

Python で簡易 WEB サーバーを構築する方法と注意点

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

動作の仕組み

このコマンドがやることは非常にシンプルです。

  1. 指定したポートで TCP 接続を待つ
  2. ブラウザからリクエストが来たら、対応するファイルを読み込む
  3. ファイルの中身をブラウザに返す

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 アプリを開発する方向けに、おすすめの本を紹介します。