Flask+Nginx+uWSGI+CentOS7でアプリケーションを作る際にやったこと+日記::12/9
ConoHa1のCentOS7上でFlaskのアプリケーションを作成し,uWSGIとnginxで公開しようとした際に,いろいろ詰まったので,どのようにして回避しようとしたのかを共有したいと思います.
前準備
yum install -y nginx yum install -y https://centos7.iuscommunity.org/ius-release.rpm yum install -y python36u python36u-libs python36u-devel python36u-pip yum groupinstall "Development Tools" yum install -y uwsgi
あとGoogle Domainsなどで適当にドメインを取ってきて,サーバのIPと結びつけておきましょう.
簡素なFlaskアプリを作る
ぼくの環境ではデフォルトでrootとしてLoginしていたので/root/ディレクトリ下にアプリケーション作るとします.
mkdir app cd app
Python3.6の仮想環境を構築して,適当にアプリケーションを組みます
python3.6 -m venv env . env/bin/activate pip3 install flask uwsgi vim app.py
/root/app/app.py
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "Yay! You're on Flask!" if __name__ == "__main__": app.run(host="0.0.0.0" ,port=5000)
とりあえず,ファイアウォールで5000番ポートを開放してhttp://[サーバのIP]:5000 にアクセスします
firewall-cmd --permanent --add-port=5000/tcp firewall-cmd --reload python3 app.py
アクセスして,Yay! You're on Flask!と表示されたら成功です2.
Nginx
サーバの設定を行います.ただし,上のようにHTTPプロキシではなくsocketでつなげます.
vim /etc/nginx/conf.d/app.conf
/etc/nginx/conf.d/app.conf
server { listen 80; server_name [取ってきたドメインの入力]; charset utf-8; client_max_body_size 75M; location / { try_files $uri @myapp; } location @myapp { include uwsgi_params; uwsgi_pass unix:///root/app/uwsgi.sock; } }
恥ずかしながら,これを調べる前まではHTTPプロキシでポートを消費して通信する方法しか知りませんでした...
uWSGI
WSGI(Web Server Gateway Interface)*1は、Pythonで書かれたWebアプリケーションとアプリケーションサーバーのあいだのインターフェースを規定した仕様(PEP333)です。WSGI仕様に従ったWebアプリケーションを乗せることができるWebサーバーをWSGIサーバーと呼ぶことにします。
uWSGI(http://projects.unbit.it/uwsgi/)は、WSGIサーバーですが、既存のWebサーバーに機能を追加する形になっています。「WSGIサーバー = Webサーバー + WSGIコンテナ」とするなら、WebサーバーとしてNginx、WSGIコンテナとしてuWSGIを使った組み合わせが Nginx+uWSGI ということになります。
(http://d.hatena.ne.jp/m-hiyama/20120312/1331513519)
とのことです.
(ドキュメンテーションを読む気が起きなくて)この周りの設定で消耗しました...
vim uwsgi.ini
/root/app/uwsgi.ini
[uwsgi] module = app socket = /root/app/%n.sock chmod-socket = 666 callable = app
いろいろ試行錯誤しましたが結果4行で済みました.
moduleはapp.py
のapp
の部分,callableはapp.py
のスクリプトの中で呼び出しているapp = Flask(__name__)
のappです.スクリプト名等を変更している場合は適宜変更してください.
service nginx restart adduser centos passwd centos # パスワードを入力...
rootだと動かないようなのでアプリを動かす用のユーザを作成しました.(もっと良いやり方があるかもしれないけど…)
次に権限とファイアウォール周りを変更します.
chown centos:centos -R . chmod 555 .. firewall-cmd --permanent --add-port=80/tcp firewall-cmd --reload
起動させてみましょう
uwsgi --ini uwsgi.ini --gid centos --uid centos
URLにアクセスしてエラーが出なければ成功です.
デーモン化させて終わり
最後にこの簡単なプロセスをデーモン化させます.
といっても簡単でuWSGIの起動時に--daemonize /path/to/log/file
と設定するだけでよいようです.
ついでに,サービスを止める際にpidで止められるようにpidを/tmp/に出力させます.
[uwsgi] module = app socket = /root/app/%n.sock chmod-socket = 666 callable = app daemonize = /var/log/uwsgi/%n.log pidfile = /tmp/myapp.pid uid = centos gid = centos
これで準備完了であとは
uwsgi --ini uwsgi,ini
で起動させて
uwsgi --stop /tmp/myapp.pid
で停止させることができます
あ~,俺デーモンになっちゃったよぉ~
日記
研究室の面接が終わり,まああとは天に祈るだけとなり,ある程度緊張も解けてきたので久々に日記っぽい記事を書きます.
自然言語処理
ゼロから作るDeep Learning ? ―自然言語処理編
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/07/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
自然言語処理に対して,今まで嫌だな~,やりたくないな~と避けてきたのですが,いい加減知識の裾野を言語処理領域まで広げるべきなんじゃないかと,つい最近のBERTだとかちょっと前のAttention/Transformerだとかの興盛の様子を見て購入しました.
1章は前冊の復習であったので,おおよそほとんど既知であったのですが,2章からは
- 2章 カウントベースの分散表現
- 3-4章 推論ベースの分散表現
- 5-6章 RNN,LSTM
- 7章 RNNによる文章生成
- 8章 Attention機構
と,昨今のNLP論文を追うために必要な基礎理論を凡そ学習できる良い本だと思う.