Flask + Gunicorn + Nginx + Supervisor ちゃんと動くまで

# Flask + Gunicorn + Nginx + Supervisor ちゃんと動くまで

>参考:
> nginx/gunicorn/supervisorでflaskアプリを動かす | かねしろぐ
>http://blog.shun-ichiro.com/howto/nginx-gunicorn-supervisor-flask/

## Information

+ wwwディレクトリ: `/var/www`
+ Flaskアプリディレクトリ: `/var/www/apps/`
+ 今回使うスクリプトがあるディレクトリ: `/var/www/apps/sampleapp/`


## Flask

ベースになるスクリプト: `/var/www/apps/sampleapp/sample.py`

```python:sample.py
#!/usr/bin/env python
#coding: utf-8

from flask import Flask

app = Flask("sample")

@app.route("/sample") #トップディレクトリ / は別に使うため
def index():

    return "<h1>Hello World</h1>"

if __name__ == "__main__":

    app.run(host="0.0.0.0",debug=True)
```

## Gunicorn

設定ファイル: `/var/www/apps/sampleapp/guniconf.py`

```python:guniconf.py
import multiprocessing

# Server Socket
bind = 'unix:/tmp/gunicorn_my_app.sock'
backlog = 2048

# Worker Processes
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'sync'
worker_connections = 1000
max_requests = 0
timeout = 30
keepalive = 2
debug = False
spew = False

# Logging
logfile = '/var/www/apps/sampleapp/app.log'
loglevel = 'info'
logconfig = None

# Process Name
proc_name = 'gunicorn_my_app'
```

一回起動してみる

```
$ cd /var/www/apps/sampleapp/
$ gunicorn sample:app --config guniconf.py
```


## Nginx

デフォルトの設定: `/etc/nginx/sites-enabled/000-default.conf `

```
server {
  listen 80 default_server;

  root /var/www;
  index index.php index.html index.htm;

  location / {
          try_files $uri $uri/ /index.php?q=$uri&$args;
          autoindex on;
  }

  error_page 404 /404.html;

  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
          root /usr/share/nginx/html;
  }

  location ~ \.php$ {
          try_files $uri =404;
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass unix:/var/run/php5-fpm.sock;
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
  }
}
```

このファイルに以下の情報を追加

```
+ upstream my_app_server{
+     #server unix:/tmp/gunicorn_my_app.sock fail_timeout=0;
+     server unix:/tmp/gunicorn_my_app.sock;
+ }

server {
  listen 80 default_server;

  root /var/www;
  index index.php index.html index.htm;

  location / {
          try_files $uri $uri/ /index.php?q=$uri&$args;
          autoindex on;
  }

  error_page 404 /404.html;

  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
          root /usr/share/nginx/html;
  }

  location ~ \.php$ {
          try_files $uri =404;
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass unix:/var/run/php5-fpm.sock;
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
  }

  + location /sample { 
  +         try_files $uri @my_app;
  + }
  + 
  + location @my_app {
  + 
  +         proxy_set_header Host $host;
  +         proxy_set_header X-Real-IP $remote_addr;
  +         proxy_redirect off;
  +     
  +         proxy_pass http://my_app_server;
  + }

}
```

一回再起動

```
$ sudo service nginx restart
```

再起動してGunicorn起動したらちゃんとアクセスできるか確認する。

## Supervisor

Supervisorは **プロセスをデーモン化** するもの。
それぞれのディストリビューション等のパッケージマネージャでインストールする。

設定ファイル: `/etc/supervisor/conf.d/my_app.conf`

```
[program:my_app]
command = /home/***/.pyenv/shims/gunicorn sample:app --config /var/www/apps/sampleapp/guniconf.py
directory = /var/www/apps/sampleapp/
user = root 
```

gunicornのコマンドは **絶対パス** で書く。各々書き換えて下さい

設定ファイルを`supervisor`に読み込ませる必要があります。

```
$ supervisorctl reread
$ supervisorctl update
$ supervisorctl start my_app
```

これで一応動くはず！！