EC2のAmazon LinuxにNginxを入れてFlaskを動かす方法
この記事では、EC2のAmazon LinuxにWebサーバーとしてNginxを入れて、Flaskを動かす手順について整理します。なお、NginxとFlaskを連携するためのインタフェースとしては、gunicornを使いました。(なくても動作はしますが、データのやりとりを高速に実行するためには必要です)
EC2の立ち上げやSSH接続の方法については、他の記事もたくさんあると思うので、今回の記事では割愛します。
下記のようにEC2にSSH接続した状態からスタートします。
そもそもなんでNginxを入れる必要があるの?
Webサーバーを入れずに「python3 app.py」でFlaskを実行すると、下記のように警告が出ます。
「WARNING: This is a development server. Do not use it in a production deployment.」
1. python3とpip3の確認
それでは始めて行きましょう。
まず、下記コマンドで環境の確認をします。
$ sudo yum update
$ python3 --version #python3が入っているか確認
$ sudo yum install python3 #もしなければ、python3のインストール
$ pip3 --version #pip3が入っているか確認
$ sudo yum install python3-pip #もしなければ、pip3のインストール
2. 必要なライブラリ等のインストール
使用するライブラリやソフトウェアのインストールを行います。
Flask以外に使用するライブラリがある時は、ここでインストールしておきましょう。
$ sudo pip3 install flask #Flaskのインストール
$ sudo amazon-linux-extras install nginx1 #nginxのインストール
$ (sudo yum install nginx) #上記コマンドでうまくいかない場合
$ sudo pip3 install gunicorn #gunicornのインストール
3. サンプルプログラムの作成
$ mkdir flask #flaskは任意のフォルダ名
$ cd flask
$ vi app.py #app.pyの作成と編集
プログラムを書く際は、iを押すとインサートモードになり編集できるようになります。
編集後は、escを押した後「:wq」で保存して終了します。
↓サンプルプログラムの例
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
host="0.0.0.0"を付けることでパブリックアクセスが可能になります。
ポート番号は8080にしておき、EC2のセキュリティグループのインバウンドで、カスタムTCPの8080番を0.0.0.0/0に設定しておきましょう。
4. 設定ファイルの確認
管理者権限で/etc/nginx/nginx.confのファイルの中のserverの部分を変更します。
cd /etc/nginx
sudo vi nginx.conf
Flaskプログラムと同様に、iを押すとインサートモードになり編集できるようになります。
編集後は、escを押した後「:wq」で保存して終了します。
↓下記の例にならって、設定ファイルのserver部分を変更しましょう。
server {
listen 80;
listen [::]:80;
server_name EC2のIPアドレス;
root /home/ec2-user/flask; ←app.pyがあるフォルダ
location / {
try_files $uri @flask;
}
location @flask {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_pass http://127.0.0.1:8000;
}
}
5. gunicornでアプリを起動する
実際に起動してみましょう。
$ sudo service nginx restart #設定を変えた後は反映のためにリスタートが必要
$ cd /home/ec2-user/flask
$ gunicorn app:app #gunicornでアプリケーションを起動
プログラムは 「ctrl+c」 で止まります。
このままTeraTermを閉じると、バックグラウンドで起動したままになります。
↓デーモン起動により、バックグラウンドでFlaskを実行し続けるには下記コマンドを実行します
$ gunicorn app:app --daemon
6. 実際にアクセスして確認する
IPアドレスにアクセスして、下記のようにFlaskが動いていることを確認できれば成功です。
7. アプリの起動を終了させる
実行タスクのポート番号を確認し、killコマンドで終了させます。
$ ps aux #実行中タスクを全て表示
$ ps aux | grep gunicorn #「gunicorn」で文字列検索して、実行中タスク表示
$ kill 1521 #ポート番号を指定して終了させる
↑(/usr/bin/python3 /usr/local/bin/gunicorn app:appが実行されているポート番号を指定する)
↓すみません、画像が少し見にくいですが、1521番でタスクが実行されているのがわかります。
終わりに
サラっと書いたので、少し雑な記事になってしまいましたが、
ここまで読んでくださって本当にありがとうございました。
Discussion