🚀 はじめに
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環境を揃え、ストレージ権限を付与する。
結果(この時点でできること)
nginxとpythonが利用可能、/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.confにhttp { include conf.d/*.conf; }が含まれていること。
3-2. 設定のテストと反映
操作
# nginx設定テスト
nginx -t
# 設定再読み込み
nginx -s reload
目的
- 設定ミスを事前に検知し、安全に反映する。
結果(この時点でできること)
- 逆プロキシ設定が有効化される。
注意/補足
- エラー時は
nginx -tの詳細を修正。
3-3. 動作確認
操作
- 別ターミナルでGunicornを起動(
127.0.0.1:8000) - ブラウザで
http://<スマホIP>:8080を開く 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 updateとpkg 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のログを確認したか?(エラー原因特定)
📚 参考リンク
- Termux 公式
- Wiki: https://wiki.termux.com/wiki/Main_Page
- Package Management: https://wiki.termux.com/wiki/Package_Management
- Storage: https://wiki.termux.com/wiki/Storage
- Termux-services: https://wiki.termux.com/wiki/Termux-services
- F-Droid(Termux配布)
- Termux on F‑Droid: https://f-droid.org/en/packages/com.termux/
- nginx 公式
- Beginner’s Guide: https://nginx.org/en/docs/beginners_guide.html
- HTTP Proxy: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- Python / Flask / Gunicorn
- Flask Quickstart: https://flask.palletsprojects.com/
- Gunicorn Docs: https://docs.gunicorn.org/en/stable/run.html
🎯 まとめ
- AndroidのTermuxで、nginx(静的)+**Python(動的)**のミニサーバーが簡単に構築できる。
- 逆プロキシでFlaskを外部公開し、静的配信との共存も可能。
- 省電力・ポート・権限などAndroid特有の落とし穴を事前対策すれば安定動作。
- 学習・デモ・検証に最適。次はサービス化(termux-services)やHugo配信にも応用しよう。
