WordPress サーバーに Python API を組み込む方法(Flask / FastAPI 編)

こんにちは。aniumaでインターンをしているryuseiです。

今回はwordpressのFAQページに使用するAIチャットボットを導入する流れをまとめていきたいと思います。

WordPress は PHP が中心ですが、「AI API を使いたい」「PDF 処理や画像処理をしたい」など、PHP だけでは扱いづらい処理も多いですよね。
そんなときに便利なのが Python アプリ(Flask / FastAPI)をサーバー内で動かして、WordPress から呼び出す方法です。

今回は VPS サーバー(Ubuntu + Nginx)を例に、
https://example.com/pyapi/ で Python API を公開する流れをまとめました。


全体像

  • Python アプリ(Flask or FastAPI)を localhost:8000 で待ち受け
  • systemd で常駐化してサーバー起動時に自動起動
  • Nginx リバースプロキシ/pyapi/127.0.0.1:8000/ に転送
  • WordPress は通常どおり / で稼働

1. サーバー環境を準備

まずは Python と Nginx をインストールします。

sudo apt update
sudo apt install -y python3 python3-venv nginx

専用のユーザーとディレクトリを作成しておくと管理が楽です。

sudo adduser --system --group --home /srv/pyapi pyapi
sudo mkdir -p /srv/pyapi
sudo chown -R pyapi:pyapi /srv/pyapi

仮想環境を作って必要ライブラリを入れます。
(ここでは FastAPI+Uvicorn を例にしていますが、Flask でもOK)

sudo -u pyapi python3 -m venv /srv/pyapi/venv
sudo -u pyapi /srv/pyapi/venv/bin/pip install --upgrade pip
sudo -u pyapi /srv/pyapi/venv/bin/pip install fastapi uvicorn[standard]

2. Python アプリを作成

/srv/pyapi/app.py を作ります。

from fastapi import FastAPI

app = FastAPI()

@app.get("/health")
def health():
    return {"ok": True}

@app.get("/hello")
def hello(name: str = "World"):
    return {"message": f"Hello, {name}!"}

動作確認(手動起動):

sudo -u pyapi /srv/pyapi/venv/bin/python -m uvicorn app:app --host 127.0.0.1 --port 8000

ブラウザで http://サーバーIP:8000/hello?name=Ryusei を叩いてみてください。


3. systemd で常駐化

アプリをサービス化しておくと、サーバー再起動後も自動で立ち上がります。

/etc/systemd/system/pyapi.service を作成:

[Unit]
Description=PyAPI (FastAPI) via Uvicorn
After=network.target

[Service]
User=pyapi
Group=pyapi
WorkingDirectory=/srv/pyapi
ExecStart=/srv/pyapi/venv/bin/python -m uvicorn app:app --host 127.0.0.1 --port 8000
Restart=always

[Install]
WantedBy=multi-user.target

有効化・起動:

sudo systemctl daemon-reload
sudo systemctl enable pyapi
sudo systemctl start pyapi
sudo systemctl status pyapi

4. Nginx リバースプロキシ設定

WordPress と同じドメインで /pyapi/ を公開します。

/etc/nginx/sites-available/wordpress.conf に追記:

location /pyapi/ {
    proxy_pass http://127.0.0.1:8000/;
    proxy_http_version 1.1;

    proxy_set_header Host               $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  $scheme;
}

設定反映:

sudo nginx -t
sudo systemctl reload nginx

これで https://example.com/pyapi/hello?name=Ryusei にアクセスすると、

{"message": "Hello, Ryusei!"}

が返ります


5. WordPress から呼び出す

functions.php にショートコードを追加すると、投稿や固定ページ内で Python API を叩けます。

add_shortcode('call_python_api', function($atts) {
    $atts = shortcode_atts(['name' => 'World'], $atts);
    $url  = home_url('/pyapi/hello?name=' . rawurlencode($atts['name']));
    $res  = wp_remote_get($url, ['timeout' => 10]);

    if (is_wp_error($res)) return 'API error';
    $body = wp_remote_retrieve_body($res);
    $data = json_decode($body, true);

    return isset($data['message']) ? esc_html($data['message']) : 'No message';
});

投稿に

[call_python_api name="Ryusei"]

と書けば、その場で Python API の結果を表示できます。


6. セキュリティと運用のポイント

  • Python は 127.0.0.1 で動かし、外部には直接晒さない
  • /pyapi/ は認証(APIキー / JWT など)を実装すると安心
  • systemctl status pyapijournalctl -u pyapi -f でログ確認
  • HTTPS(Let’s Encrypt)を必ず導入

まとめ

WordPress に直接 Python を埋め込むのではなく、
「Python は裏で API サーバー化 → Nginx でプロキシ → WordPress から呼び出す」
という構成にすると、拡張性・安定性・セキュリティの三拍子が揃います。

これで、AI API や独自処理を WordPress サイトに統合できるようになります