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{ を追加して記載
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]
master = True
socket = 127.0.0.1:3031
wsgi-file = index.py
stats = 127.0.0.1:9191
logto = uwsgi.log
pidfile = uwsgi.pid
コード
Hello World!とうhtmlを返すのに加え、S3に何か書き出せることも確認するコードにしました。
s3に書き出すためにboto3を使うので入れておきます。
$ sudo pip install boto3
applicationという関数がuwsgiからのエントリポイントです。BucketNameのところは自分で作ったバケット名に変えてください。
# 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 と出ている。
停止(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最近触りはじめたたマンです。おかしかったら教えてもらえると助かります。
おわり。