LoginSignup
4
6

More than 3 years have passed since last update.

【ハッカソンで使える!】AzureやAWSなどの仮想マシン上にFlaskサーバーをデプロイする

Last updated at Posted at 2020-10-08

こんなあなたに

  • PythonでWebサーバーを構築して公開したい
  • 深層学習を使用したAPIサーバーを作りたい

ハッカソンでFlaskを使ってAPIサーバーを構築するために色々調べてやったので,イチからまとめました.

前提

  • Azure, AWS, GCPなどで,仮想マシンを作成済み
  • ssh接続ができている
  • 80番ポートが開放されている
  • OSはUbuntu18.04

環境

  • AWS EC2インスタンス
  • Ubuntu18.04

本編

1. 必要なパッケージのインストール

# apache2のインストール #
$ sudo apt install apache2 apache2-dev

# Pythonのインストール #
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
# 最後に表示される設定を~/.bashrcに記述

# インストール可能なanacondaのバージョンを表示
$ pyenv install -l | grep anaconda
# anacondaをインストール
$ pyenv install anaconda3-5.3.1
# anacondaを有効化
$ pyenv global anaconda3-5.3.1

# anacondaの環境を作成
$ conda create -n <hoge> python=3.6
$ conda activate <hoge>
# flask, mod_wsgiのインストール
$ conda install flask
$ pip install mod_wsgi

2. flaskを使ったアプリケーションを作成

/var/www/以下にflask_appディレクトリを作成し,以下のファイルを配置する.

/var/www/flask_app/app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Flask!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')
/var/www/flask_app/adapter.wsgi
import sys
sys.path.insert(0, '/var/www/flask_app')

from app import app as application

3. apache2の設定ファイルを追加する

/etc/apache2/conf-available/flask.conf
LoadModule wsgi_module /home/<user>/.pyenv/versions/anaconda3-5.3.1/envs/<hoge>/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
WSGIPythonHome /home/<user>/.pyenv/versions/anaconda3-5.3.1/envs/<hoge>/
<VirtualHost *:80>
  ServerName <server-ip>:80
  DocumentRoot /var/www/flask_app
  WSGIDaemonProcess flask_app user=<user> group=<user> threads=5
  WSGIScriptAlias / /var/www/flask_app/adapter.wsgi
  <Directory "/var/www/flask_app/">
    WSGIProcessGroup flask_app
    WSGIApplicationGroup %{GLOBAL}
    WSGIScriptReloading On
    Require all granted
  </Directory>
</VirtualHost>

上記はあくまで一例です.
<user><hoge>, <server-ip>の部分はそれぞれ,ログインユーザー,anacondaの環境名,サーバーのIPアドレス(ドメイン)に適宜補完してください.
また,LoadModuleWSGIPythonHomeも環境によって異なることがあります.

LoadModuleの求め方

flaskをインストールした環境を有効にした上で以下のコマンドを実行するとパッケージがインストールされているディレクトリが出てくる.

$ python -c "import sys; print(sys.path)"

その中から,mod_wsgiを探し,パスを確認する.タブ補完していくと間違わない

$ ls /home/<user/.pyenv/versions/anaconda3-5.3.1/envs/<hoge>/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

4. 追加した設定ファイルを有効化する

$ sudo a2enconf flask

5. apache2の再起動

$ sudo systemctl restart apache2.service

接続確認

ブラウザで,http://<server-ip>にアクセス.(httpsではないので注意)
Hello, Flask!と表示されれば成功です.

接続できない・エラーが発生するときは.

  • 仮想マシンの80番ポートが開放されているかを確認する
    • サーバーのコンソールから設定できるはず
  • internal errorとかが出たらとりあえず以下を確認してみる.
$ sudo systemctl status apache2.service

$ sudo tail /var/log/apache2/error.log

Future work

  • SSL対応
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6