Notebook

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.pyappの部分,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 ? ―自然言語処理編

ゼロから作るDeep Learning ? ―自然言語処理編

自然言語処理に対して,今まで嫌だな~,やりたくないな~と避けてきたのですが,いい加減知識の裾野を言語処理領域まで広げるべきなんじゃないかと,つい最近のBERTだとかちょっと前のAttention/Transformerだとかの興盛の様子を見て購入しました.

1章は前冊の復習であったので,おおよそほとんど既知であったのですが,2章からは

  • 2章  カウントベースの分散表現
  • 3-4章 推論ベースの分散表現
  • 5-6章 RNN,LSTM
  • 7章  RNNによる文章生成
  • 8章  Attention機構

と,昨今のNLP論文を追うために必要な基礎理論を凡そ学習できる良い本だと思う.


  1. ConoHaのVPSを選択した重要な理由として美雲このはちゃんが可愛いという点があります.

  2. お察しの通りYay! You’re on Railsのパクリです