こんなあなたに
- 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アドレス(ドメイン)に適宜補完してください.
また,LoadModule
とWSGIPythonHome
も環境によって異なることがあります.
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対応