FlaskアプリをuWSGIで動かす(2)

ユーザの作成

専用ユーザを作る。

takatoh@nightschool $ sudo adduser bruschetta
[sudo] password for takatoh: 
ユーザー `bruschetta' を追加しています...
新しいグループ `bruschetta' (1003) を追加しています...
新しいユーザー `bruschetta' (1003) をグループ `bruschetta' に追加しています...
ホームディレクトリ `/home/bruschetta' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい UNIX パスワードを入力してください: 
新しい UNIX パスワードを再入力してください: 
passwd: パスワードは正しく更新されました
bruschetta のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
	フルネーム []: bruschetta
	部屋番号 []: 
	職場電話番号 []: 
	自宅電話番号 []: 
	その他 []: 
以上で正しいですか? [Y/n] Y

sudo する権限をつける。

takatoh@nightschool $ sudo gpasswd -a bruschetta sudo
ユーザ bruschetta をグループ sudo に追加

アプリの配置と起動確認

今作った新しいユーザでログインしなおして GitHub から clone。

bruschetta@nightschool:~$ git clone https://github.com/takatoh/Bruschetta.git bruschetta
Cloning into 'bruschetta'...
remote: Counting objects: 345, done.
remote: Compressing objects: 100% (126/126), done.
remote: Total 345 (delta 231), reused 319 (delta 205), pack-reused 0
Receiving objects: 100% (345/345), 31.03 KiB | 0 bytes/s, done.
Resolving deltas: 100% (231/231), done.
Checking connectivity... done.

virtualenv の作成と必要なライブラリのインストール。

bruschetta@nightschool:~$ cd bruschetta
bruschetta@nightschool:~/bruschetta$ virtualenv env
New python executable in env/bin/python
Installing setuptools, pip, wheel...done.
bruschetta@nightschool:~/bruschetta$ source env/bin/activate
(env)bruschetta@nightschool:~/bruschetta$ pip install -r requirements.txt
Collecting Flask (from -r requirements.txt (line 1))
/home/bruschetta/bruschetta/env/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading Flask-0.10.1.tar.gz (544kB)
    100% |████████████████████████████████| 544kB 720kB/s 
Collecting Flask-SQLAlchemy (from -r requirements.txt (line 2))
  Downloading Flask-SQLAlchemy-2.1.tar.gz (95kB)
    100% |████████████████████████████████| 98kB 1.6MB/s 
Collecting Flask-Script (from -r requirements.txt (line 3))
  Downloading Flask-Script-2.0.5.tar.gz (42kB)
    100% |████████████████████████████████| 45kB 2.4MB/s 
Collecting Werkzeug>=0.7 (from Flask->-r requirements.txt (line 1))
  Downloading Werkzeug-0.11.2-py2.py3-none-any.whl (304kB)
    100% |████████████████████████████████| 307kB 1.1MB/s 
Collecting Jinja2>=2.4 (from Flask->-r requirements.txt (line 1))
  Downloading Jinja2-2.8-py2.py3-none-any.whl (263kB)
    100% |████████████████████████████████| 266kB 1.4MB/s 
Collecting itsdangerous>=0.21 (from Flask->-r requirements.txt (line 1))
  Downloading itsdangerous-0.24.tar.gz (46kB)
    100% |████████████████████████████████| 49kB 1.8MB/s 
Collecting SQLAlchemy>=0.7 (from Flask-SQLAlchemy->-r requirements.txt (line 2))
  Downloading SQLAlchemy-1.0.9.tar.gz (4.7MB)
    100% |████████████████████████████████| 4.7MB 120kB/s 
Collecting MarkupSafe (from Jinja2>=2.4->Flask->-r requirements.txt (line 1))
  Downloading MarkupSafe-0.23.tar.gz
Building wheels for collected packages: Flask, Flask-SQLAlchemy, Flask-Script, itsdangerous, SQLAlchemy, MarkupSafe
  Running setup.py bdist_wheel for Flask
  Stored in directory: /home/bruschetta/.cache/pip/wheels/d2/db/61/cb9b80526b8f3ba89248ec0a29d6da1bb6013681c930fca987
  Running setup.py bdist_wheel for Flask-SQLAlchemy
  Stored in directory: /home/bruschetta/.cache/pip/wheels/79/20/fe/49ca207b5445eacf8f34ac4c7f2365dd344e17668cd63b8fdd
  Running setup.py bdist_wheel for Flask-Script
  Stored in directory: /home/bruschetta/.cache/pip/wheels/42/85/3d/fca6d4a04f7852ce8322be36ff8918ceff9bce568e7144c813
  Running setup.py bdist_wheel for itsdangerous
  Stored in directory: /home/bruschetta/.cache/pip/wheels/97/c0/b8/b37c320ff57e15f993ba0ac98013eee778920b4a7b3ebae3cf
  Running setup.py bdist_wheel for SQLAlchemy
  Stored in directory: /home/bruschetta/.cache/pip/wheels/f7/c3/1f/a136a98dbce9c82df10df168813df34bba6d039787e4327634
  Running setup.py bdist_wheel for MarkupSafe
  Stored in directory: /home/bruschetta/.cache/pip/wheels/94/a7/79/f79a998b64c1281cb99fa9bbd33cfc9b8b5775f438218d17a7
Successfully built Flask Flask-SQLAlchemy Flask-Script itsdangerous SQLAlchemy MarkupSafe
Installing collected packages: Werkzeug, MarkupSafe, Jinja2, itsdangerous, Flask, SQLAlchemy, Flask-SQLAlchemy, Flask-Script
Successfully installed Flask-0.10.1 Flask-SQLAlchemy-2.1 Flask-Script-2.0.5 Jinja2-2.8 MarkupSafe-0.23 SQLAlchemy-1.0.9 Werkzeug-0.11.2 itsdangerous-0.24

データベースの初期化。

(env)bruschetta@nightschool:~/bruschetta$ python manage.py init_db

起動確認。

(env)bruschetta@nightschool:~/bruschetta$ python manage.py runserver
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

OK。

uWSGIを使った起動

uWSGI 用の設定ファイル。

[uwsgi]
uid = root
gid = root
http = :9090
venv = /home/bruschetta/bruschetta/env
python-path = /home/bruschetta/bruschetta
wsgi-file = /home/bruschetta/bruschetta/manage.py
callable = app
master=true
pidfile=/var/run/bruschetta.pid
logger=file:/home/bruschetta/bruschetta/bruschetta.log

起動確認。

bruschetta@nightschool:~/bruschetta$ sudo uwsgi bruschetta.ini
[sudo] password for bruschetta: 
[uWSGI] getting INI configuration from bruschetta.ini

OK。sudo をつけてるのは、/var/run/bruschetta.pid に書き込むため。

起動用スクリプト

PATH=/sbin:/usr/local/bin:/usr/bin:/bin
APP_ROOT=/home/bruschetta/bruschetta

case "$1" in
start)
    cd ${APP_ROOT}
    uwsgi bruschetta.ini
    ;;
stop)
    PID_FILE=/var/run/bruschetta.pid
    PID=`cat ${PID_FILE}`
    kill -INT ${PID}
    rm ${PID_FILE}
    ;;
*)
    echo "Usage: bruschetta {start|stop}" >&2
    exit 1
    ;;
esac

exit 0

起動確認。

bruschetta@nightschool:~/bruschetta$ sudo service bruschetta start
[uWSGI] getting INI configuration from bruschetta.ini

あれ、デーモンにならない。
ググってみたら、ini ファイルに logger じゃなくて daemonize を書くみたい。次のように書きなおした。

[uwsgi]
uid = root
gid = root
http = :9090
venv = /home/bruschetta/bruschetta/env
python-path = /home/bruschetta/bruschetta
wsgi-file = /home/bruschetta/bruschetta/manage.py
callable = app
master=true
pidfile=/var/run/bruschetta.pid
#logger=file:/home/bruschetta/bruschetta/bruschetta.log
daemonize=/home/bruschetta/bruschetta/bruschetta.log

今度は OK。

Ubuntu 起動時に自動的に起動するように設定。sysv-rc-conf を使う。

bruschetta@nightschool:~/bruschetta$ sudo sysv-rc-conf
buschetta-service

Nginxの設定

upstream uwsgi-bruschetta {
    server 127.0.0.1:9090;
}

server {
    # port
    listen 80;

    # server name
    server_name bruschetta;

    # document root
    root /home/bruschetta/bruschetta;

    # index
    #index index.php index.html index.htm;

    # log files
    access_log /var/log/nginx/bruschetta/access.log combined;
    error_log /var/log/nginx/bruschetta/error.log warn;

    keepalive_timeout 60;
    proxy_connect_timeout 60;
    proxy_read_timeout 60;
    proxy_send_timeout 60;

    #client_max_body_size 20M;

    location / {
        #root /home/bruschetta/bruschetta;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://uwsgi-bruschetta;
    }

}

sites-enabled から sites-available へリンクを張る。

bruschetta@nightschool:/etc/nginx/sites-enabled$ sudo ln -s ../sites-available/bruschetta bruschetta

/etc/hosts に次の行を挿入。

127.0.0.1 bruschetta

ログファイル用のディレクトリを作成。

bruschetta@nightschool:~$ sudo mkdir /var/log/nginx/bruschetta

Nginx を再起動。

bruschetta@nightschool:/etc/nginx/sites-enabled$ sudo service nginx restart
 * Restarting nginx nginx

これで完了。