🚀 はじめに

AndroidスマホにTermuxを入れるだけで、nginx(静的配信)Python(動的アプリ)を組み合わせたミニサーバーを構築できます。この記事は、インストールから逆プロキシでFlaskを公開、つまずき対策までを一気通貫で解説します。

この記事で達成できること

  • スマホ上でnginxを起動し、静的ファイルを配信
  • **Python(Flask+Gunicorn)**でWebアプリを動かす
  • nginxの逆プロキシでPythonアプリを外部公開
  • よくあるエラー(ポート、スリープ、権限)を回避

※ Playストア版Termuxは更新停止。F-Droid版のTermuxが安全です。


🧭 前提と準備

本番前に、インストール元・権限・ポート・IPなど、初心者が混乱しやすい前提を整えます。

1-1. Termuxのインストール(F-Droid版推奨)

操作

  • F-Droidアプリをインストール → Termuxで検索 → 最新版をインストール

目的

  • 保守されている配布元からTermuxを導入し、最新パッケージを利用可能にする。

結果(この時点でできること)

  • 以降のpkgによる導入と更新が安定して行える。

注意/補足

  • Play版Termuxは古いため非推奨。F-Droid版を使用。

1-2. 初期設定(更新・権限・必須ツール)

操作

# パッケージ更新
pkg update && pkg upgrade -y
# ストレージアクセス(/sdcard を使えるように)
termux-setup-storage
# よく使うツール
pkg install -y git curl vim tmux
# サーバー関連
pkg install -y nginx python
# (必要なら)サービス管理とSSH
pkg install -y termux-services openssh

目的

  • 基本ツール・Webサーバー・Python環境を揃え、ストレージ権限を付与する。

結果(この時点でできること)

  • nginxpythonが利用可能、/sdcardへの読み書きも許可済み。

注意/補足

  • termux-setup-storageで権限付与。定期的にpkg upgradeで更新。

1-3. 使うポートとIPを確認

操作

# 低番ポート(80/443)はroot権限が必要 → Termuxでは 8080/8000 を使うのが安全
# 自端末のIP確認(Wi‑Fi接続時)
ip -4 addr show wlan0 | grep 'inet '

目的

  • 外部端末からアクセスするためのIPと安全なポート設計を決める。

結果(この時点でできること)

  • 例:http://<スマホIP>:8080:8000 に到達可能な構成を想定できる。

注意/補足

  • 同一Wi‑Fi内からのみ到達可能。モバイル回線越しの一般公開は推奨しない。

⚙️ Step 2:基本機能のセットアップ(nginx / Python)

nginxで静的配信、Pythonで動的アプリの起動までを段階的に進めます。

2-1. nginxで静的ファイルを配信

操作

  • 設定ファイル:$PREFIX/etc/nginx/nginx.conf
  • ドキュメントルート(初期):$PREFIX/share/nginx/html$PREFIX/data/data/com.termux/files/usr
# 設定チェック
nginx -t
# 起動(デーモン化)
nginx
# 再起動/終了
nginx -s reload
nginx -s stop
# 動作確認(ローカル)
curl -I http://127.0.0.1:8080

目的

  • スマホ上で静的コンテンツを配信できるWebサーバーを立ち上げる。

結果(この時点でできること)

  • ブラウザで http://<スマホIP>:8080 に接続可能。

注意/補足

  • 外部端末からはスマホのIP+:8080でアクセス。

操作(静的ファイルの配置)

# 例:簡単なページを作成
echo '<h1>Hello from Termux + nginx</h1>' > $PREFIX/share/nginx/html/index.html
# ブラウザで http://<スマホIP>:8080 を開く

目的

  • 実ファイルを配信して表示確認する。

結果(この時点でできること)

  • index.htmlが表示される。

注意/補足

  • パスは$PREFIX/share/nginx/html。権限エラー時は配置先を見直す。

2-2. Pythonの簡易サーバー(検証用)

操作

# カレントディレクトリのファイルをHTTP配信(ポート8000)
python -m http.server 8000 --bind 0.0.0.0
# → http://<スマホIP>:8000 でアクセス可能

目的

  • 迅速にHTTP配信の挙動を確認する。

結果(この時点でできること)

  • 軽量なテスト用サーバーとして動作。

注意/補足

  • 検証用途のみ。本番運用には不向き。

2-3. Flask+Gunicorn(実用的なPythonアプリ)

操作

# 仮想環境を作成
python -m venv venv
source venv/bin/activate
# 必要パッケージを導入
pip install flask gunicorn
# 最小アプリ
cat > app.py << 'EOF'
from flask import Flask
app = Flask(__name__)
@app.get("/")
def hello():
    return "Hello from Flask on Termux!"
EOF
# Gunicornで起動(2ワーカー、ローカル8000番)
gunicorn -w 2 -b 127.0.0.1:8000 app:app
# 外部端末からもアクセスする場合は 0.0.0.0:8000 に変更

目的

  • 実用的なWSGIサーバーでFlaskアプリを安定的に提供する。

結果(この時点でできること)

  • http://127.0.0.1:8000でFlaskのレスポンスを返す。外部公開は0.0.0.0で可能。

注意/補足

  • ログ/プロセス管理は後述のtmux活用を推奨。

🛠️ Step 3:逆プロキシでFlask公開(nginx→Gunicorn)

外部からは**nginx(8080)にアクセス→内部でFlask(Gunicorn, 8000)**へ転送する構成を作ります。

3-1. 逆プロキシ設定ファイルを追加

操作

  • mkdir -p $PREFIX/etc/nginx/conf.d
  • $PREFIX/etc/nginx/conf.d/flask.conf を作成
mkdir -p $PREFIX/etc/nginx/conf.d
cat > $PREFIX/etc/nginx/conf.d/flask.conf << 'EOF'
server {
    listen 8080;
    server_name localhost;

    # 静的コンテンツ(必要なら差し替え)
    root /data/data/com.termux/files/usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri @flask_app;
    }

    # Flaskアプリへ転送
    location @flask_app {
        proxy_pass http://127.0.0.1:8000;
        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;
    }

    # ヘルスチェックなど
    location = /health {
        return 200 "OK";
        add_header Content-Type text/plain;
    }
}
EOF

目的

  • nginxをフロントに配置し、静的配信と動的アプリの共存を実現する。

結果(この時点でできること)

  • http://<スマホIP>:8080 経由でFlaskに到達可能。

注意/補足

  • nginx.confhttp { include conf.d/*.conf; }が含まれていること。

3-2. 設定のテストと反映

操作

# nginx設定テスト
nginx -t
# 設定再読み込み
nginx -s reload

目的

  • 設定ミスを事前に検知し、安全に反映する。

結果(この時点でできること)

  • 逆プロキシ設定が有効化される。

注意/補足

  • エラー時はnginx -tの詳細を修正。

3-3. 動作確認

操作

  1. 別ターミナルでGunicornを起動(127.0.0.1:8000
  2. ブラウザで http://<スマホIP>:8080 を開く
  3. index.htmlがあれば静的ファイル、なければFlaskのレスポンス

目的

  • 静的配信と動的転送の両立が正しく機能しているか確認する。

結果(この時点でできること)

  • 想定どおりのレスポンスが得られる。

注意/補足

  • API専用に/apiだけFlaskへ転送するなどURI分離が有効。

⚠️ 運用の注意(Android特有の落とし穴)

Androidの省電力や権限仕様により、サーバーが停止・到達不能になることがあります。以下を事前対策します。

操作

# スリープ対策
termux-wake-lock
# tmuxでセッション管理(落ちにくい)
tmux new -s server

目的

  • Dozeによる停止を防ぎ、プロセスを安定稼働させる。

結果(この時点でできること)

  • サーバー稼働が継続しやすくなる。ログ確認や複数窓運用が容易。

注意/補足

  • 端末の省電力設定からTermuxを除外。低番ポート(80/443)は権限が必要のため、基本は8080/8000を使う。

✅ よくあるつまずき(チェックリスト)

  • F-Droid版Termuxをインストールしているか?(Play版は非推奨)
  • pkg updatepkg upgradeを実行したか?(古いパッケージでエラーが出やすい)
  • termux-setup-storageでストレージアクセスを許可したか?
  • 必要なパッケージ(nginx, python, git, tmuxなど)をインストールしたか?
  • ポート番号は8080/8000を使用しているか?(80/443は権限不足で失敗)
  • スマホのIPアドレスを確認したか?(ip -4 addr show wlan0
  • Gunicornを0.0.0.0:8000で起動したか?(外部アクセス時)
  • nginx設定テスト(nginx -t)を実行したか?
  • conf.d/*.confがnginx.confにincludeされているか?
  • 省電力設定でTermuxを除外したか?(Dozeでプロセス停止を防ぐ)
  • termux-wake-lockを実行したか?(スリープ対策)
  • tmuxでセッション管理しているか?(プロセス維持)
  • 権限エラー時にファイル配置先を$PREFIX配下に修正したか?
  • 外部公開はWi-Fi内のみで行っているか?(モバイル回線越しは非推奨)
  • nginxとGunicornのログを確認したか?(エラー原因特定)

📚 参考リンク


🎯 まとめ

  • AndroidのTermuxで、nginx(静的)+**Python(動的)**のミニサーバーが簡単に構築できる。
  • 逆プロキシでFlaskを外部公開し、静的配信との共存も可能。
  • 省電力・ポート・権限などAndroid特有の落とし穴を事前対策すれば安定動作。
  • 学習・デモ・検証に最適。次はサービス化(termux-services)Hugo配信にも応用しよう。