この記事は 前編の続き です。
まだ読んでいない方は、先にこちらを見てください。
前編では、
- FlaskでWebサーバーを立てる
- 同一ネットワーク内からアクセスする
ところまでやりました。
後編では、
- nginxを使ってポート5000を隠す
- 外部ネットワークからアクセスできるようにする
ところまで進めます。
nginxのインストール
まずは nginx を入れます。
sudo apt install -y nginx
インストール後、起動と自動起動を設定します。
sudo systemctl start nginx
sudo systemctl enable nginx
ここまでで nginx 自体は動いています。
nginxの設定
設定ファイルを編集します。
sudo nano /etc/nginx/nginx.conf
⚠️ 注意
これは nginx.conf を丸ごと書き換える方法 です。
本番や既存環境ではおすすめしませんが、
初心者向け・検証用途 として話を単純にするため、この方法を取ります。
設定内容
とりあえず以下をそのまま入れてください。
user www-data;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:5000;
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;
}
# WebSocket対応(今回は不要でも入れておく)
location /ws/ {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
}
これは、
- nginxが 80番ポートで待ち受け
- 中身は Flask(127.0.0.1:5000)に転送
するだけの、超シンプルな構成です。
設定ファイルの確認
設定ミスがないかチェックします。
sudo nginx -t
以下のような文が出ればOKです。
syntax is oktest is successful
nginxの再起動
sudo systemctl restart nginx
Flaskサーバーを起動
前編で作った Flask サーバーを起動してください。
python3 server.py
動作確認(同一ネットワーク内)
同じLAN内の端末から、以下にアクセスします。
http://<ラズパイのIP>
ここでポイントは:
- :5000 を付けなくていい
- nginx(80番)が受けて、Flaskに流している
ページが表示されたら成功です。
グローバルIPアドレスの確認
次に、外部公開の確認をします。
以下のようなサイトで
サーバーと同じLANに接続した状態で グローバルIPを確認してください。
外部ネットワークからアクセス
次に、
- モバイル回線
- 別のWi-Fi
など、サーバーとは違うネットワーク に移動します。
ブラウザで以下にアクセスしてください。
http://<グローバルIPアドレス>
問題なければ、作成したページが表示されます。
表示されない場合
- ルーターのポートフォワーディング設定ミス
- 80番ポートが開いていない
- 回線側(ISP)でサーバー公開が制限されている
特に 後者はどうしようもない ので、その場合は諦めましょう。
一般家庭のグローバルIPアドレスは
数日〜数週間で変わります。
「昨日見れたのに今日は無理」は普通に起きます。
おわりに
これで、
- ラズパイ
- Flask
- nginx
- 外部公開
まで一通り完了です。
次は番外編として、
- ドメインの設定
- HTTPS(Let’s Encrypt)
- セキュリティの最低限
あたりを書く予定です。
⚠️ ドメインは有料なので、
本当に必要かはよく考えてください。
お疲れさまでした 🙌