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 では以下で入れていました。
$ sudo yum groupinstall "Development Tools"

設定

参考:Quickstart for Python/WSGI applications

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に繋がってしまって、2重実行になってしまった。なので、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

コード

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に書き出されたファイル

停止(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

おわり

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.