EC2にnginx+uwsgi+python でHello World

Hello World!とうhtmlを返すのに加え、S3に何か書き出せることも確認するコードにしました。

# 環境
EC2(Amazon Linux)

# 準備

## EC2インスタンス
サンプルコードにS3への書きだしがあるので、S3にput_object可能なロールを割り当てておく。

## インストール
### nginx
```$ sudo yum install nginx```

### uwsgi
```$ sudo pip install uwsgi```

you need a C compiler to build uWSGI
とでた場合はCのコンパイラを入れてください。
[Installing uWSGI](http://uwsgi.readthedocs.io/en/latest/Install.html)　では以下で入れていました。
```$ sudo yum groupinstall "Development Tools"```

## 設定

参考：[Quickstart for Python/WSGI applications](http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html)

### nginx
/etc/nginx/nginx.conf を編集

- server { location / { の中を編集
- server { の中に location = /favicon.ico{ を追加して記載

```nginx.conf
server {

  location / {
      include uwsgi_params;
      uwsgi_pass 127.0.0.1:3031;
  }

  location = /favicon.ico{
    empty_gif;
  }
```

最初ブラウザからテストしたとき、favionのリクエストに対してもuwsgiに繋がってしまって、２重実行になってしまった。なので、location = /favicon.icoも明記しました。

### uwsgi

uwsgi用のディレクトリを適当に用意
```$ mkdir /var/www/uwsgi```

このディレクトリに、以下のように置いてくイメージで進めます。

```
uwsgi/
   index.py  # 実行ソース
   uwsgi.ini　　# 設定ファイル
   uwsgi.log # ログ出力先
   uwsgi.pid　　# プロセスid出力先
```

uwsgi.ini 実行時にわたすオプションを書く。長くなったのでiniファイルに書くようにしました。

```uwsgi.ini
[uwsgi]
master = True
socket = 127.0.0.1:3031
wsgi-file = index.py
stats = 127.0.0.1:9191
logto = uwsgi.log
pidfile = uwsgi.pid
```

参考：[uWSGI Options](http://uwsgi-docs.readthedocs.io/en/latest/Options.html)

# コード

Hello World!とうhtmlを返すのに加え、S3に何か書き出せることも確認するコードにしました。
s3に書き出すためにboto3を使うので入れておきます。
```$ sudo pip install boto3```


applicationという関数がuwsgiからのエントリポイントです。BucketNameのところは自分で作ったバケット名に変えてください。

```:index.py
# coding:utf-8

import boto3
import logging
import datetime
import uuid

handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)

def main():

    # S3
    s3 = boto3.resource('s3')
    now_s = datetime.datetime.now().strftime('%Y.%m.%d-%H:%M:%S')
    key = 'test-folder/{0}-{1}.txt'.format(now_s, uuid.uuid4())
    s3.meta.client.put_object(Bucket='BucketName', Key=key, Body='test dayo')

    # log
    logger.info('test-log-dayo')



def application(env, start_response):
    main()
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World!"

```

# うごかす

## 起動

nginx起動

```
$ service nginx start
```

uwsgi起動

```
$ cd /var/www/uwsgi
$ uwsgi --ini uwsgi.ini
```

## 確認
EC2にhttpリクエスト。以下が確認できたらOK。

 - 応答が200で、**Hello World!**というhtmlが返る。
 - S3の指定したバケットのtest-folderに「日付＋日時＋uid.txt」みたいな名前のファイルができている。
 - ログに test-log-dayo と出ている。

![s3に書き出されたファイル](https://qiita-image-store.s3.amazonaws.com/0/43631/efe0ec03-f89b-4140-c806-7f8291641d31.png)


# 停止(uwsgi)
## フロント実行のとき
**control + c** で止めました。

## バックグラウンド実行のとき
以下のどっちかで止めました。

```
$ kill -9 `cat uwsgi.pid`
```

```
$ killall -9 uwsgi 
```


# その他

## Getのクエリパラメータ取得
cgi.FieldStorageから取得できなかった。
applicationの引数envのQUERY_STRINGから取れた。


## Postのリクエストボディ取得
cgi.FieldStorageから取得できなかった。
applicationの引数envのwsgi.inputをreadしたら取れた。


参考：[Accessing POST Data from WSGI](http://stackoverflow.com/q/530526/6484948)


# おわり
ちょっと触ってみるつもりが、時間かかったので書きました。Linux最近触りはじめたたマンです。おかしかったら教えてもらえると助かります。
おわり。