Docker+Apacheでシステムを汚さずにFlaskアプリを公開するメモ
Pythonで作った自作のラインボットを公開する際に、システムのPythonにpipインストールして後悔したことがあるのでDockerで公開すればシステムを汚さずに公開できることを知ったのでメモ
この記事でできること:
・ホストOSのPython環境を汚さずにアプリを公開する
・dockerコンテナで動作しているFlaskアプリをリバースプロキシ経由で外部へ公開する
具体的には、ホストOSのApacheに来たアクセスを、
dockerコンテナ内で動作するnginxへプロキシしてアプリを公開する
要するにこれはリバースプロキシの設定をnginxのconfに記述する
これにより、ホストOS側の設定としてはapacheのバーチャルホスト設定を追加するだけでアプリを公開できる
アプリ用に無駄に443以外のポート開放する必要がないのもメリット
前提:Almalinuxで環境構築 (他のCentOSとかのディストリビューションも多分流れは一緒)
Dockerインストールと起動
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf -y install docker-ce docker-ce-cli containerd.io
# systemctl start docker
# docker --version
Docker version 20.10.17, build 100c701
Dockerコンテナ作成とコンテナ起動
sudo docker run -it --name {適当につけたコンテナ名} -p 1000:80 {イメージタグ} bash
イメージは自分のアプリに合わせて好きなものを使う
-pオプションでホストの1000番ポートでDockerコンテナを動作させ、
Dockerコンテナ内のnginx80番ポートへ接続する(ホストOSの80番とは関係ない)
1000番は外部に開いていない他の任意のポートでOK
Apacheで外部アクセスをコンテナ内Nginxにつなげる
Apacheのインストール方法は省略
Apacheのバーチャルホスト設定で外部から来たアクセスをdockerコンテナ内のnginxへつなげる設定
以下のProxyPassでhttp://app.example.com/にきたアクセスをローカルホスト1000番(Dockerコンテナ)に渡している
これをApacheのconfファイルに追記
<VirtualHost *:80> # ← 443でもOK
ServerName app.example.com
ProxyRequests Off
ProxyPass / http://localhost:1000/
ProxyPassReverse / http://localhost:1000/
</VirtualHost>
mod_proxyが必要なので適宜有効化
以上の設定により、
apache(80番ポート) → Dockerコンテナ(1000番ポート) → コンテナ内nginx(80番ポート)
のように処理を流せる
あとはコンテナ内でFlaskアプリを外部公開するように設定すれば完了
自分のdockerコンテナ内のnginxの設定とuwsgi.iniをメモ
# nginx.conf
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
proxy_pass http://127.0.0.1:9999/;
}
}
# uwsgi.ini
[uwsgi]
wsgi-file=/linebot/app.py
callable=app
http=0.0.0.0:9999
socket=/tmp/uwsgi.sock
module=app
chmod-socket=666
daemonize=/linebot/uwsgi.log
コンテナ内部では、80番ポートで受け取ったリクエストを9999番で動作しているuwsgiにリクエストを渡している
詳細は別のnginx+uwsgiでアプリを外部公開しているサイトを参照していただきたい
これとか (Nginx + uWSGI + Flaskによるwebアプリの構築)
以上
ホストのApacheを生かしたいが為に周りくどい方法になったような気がしますが、
もしもっと単純にできるよって言う場合はぜひ教えていただけるとありがたいです
ディスカッション
コメント一覧
まだ、コメントがありません
この記事のトラックバックURL
nyaa
情報系の大学院生
いろいろな記事を書きます
新着記事
: サーバー
おうちサーバーにはミニPCが最適解だというお話【自宅サーバー】
はじめに 皆さん自宅サーバー興味ありますでしょうか 自宅サーバーやりたいなと思っ ...: サーバー
【Mattermost】運用効率化のためにアップデート自動化スクリプトを作ってみた
はじめに 研究室のMattermostの運用担当なのですが、ネイティブ環境で構築 ...: サーバー
【Gemini API × docker-mailserver】AIで受信メールのフォルダ分けを自動化してみた
※2025/05/19 dockerコンテナ再立ち上げの際に自動で本環境が再構築 ...: 音楽ゲーム
【L-TEK PAD購入&おすすめ改造】やはりコスパ最強。家庭用ではこれ一択
物欲に負けて遂に購入 前にGRANDPRIXで遊ぶだけなら改造ソフトマットで十分 ...: 音楽ゲーム
【総額5000円以下】高難易度も遊べる安価DDRマットを自作したメモ
アーケード風の本格メタルパッドは高すぎる 最近の円安でDDRのメタルパッド(アー ...タグ
Contents