🦁

EC2のAmazon LinuxにNginxを入れてFlaskを動かす方法

2021/07/28に公開

この記事では、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