🦁

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

4 min read

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

本来、Flaskはアプリケーションサーバーの役割があるのですが、Webサーバーが入っていない状態だと、Webサーバー+アプリケーションサーバーの役割をしないといけなくなり、Flaskの負担が大きくなるので、「このままでは大量アクセス処理でパンクするなどのリスクが大きく、応答が遅くなってしまう場合もあるので、あくまで開発用のサーバーとして使ってください(本番用として使うのはやめた方がいい)」ということになります。

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に設定しておきましょう。

今回の記事で試してみる際には問題ないと思いますが、0.0.0.0/0を設定すると全てのIPアドレスを受け入れることになるので、本番用サーバーではIPアドレスを限定するようにしましょう。

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

ログインするとコメントできます