LoginSignup
47
52

More than 5 years have passed since last update.

EC2にnginx+uwsgi+python でHello World

Last updated at Posted at 2016-06-19

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最近触りはじめたたマンです。おかしかったら教えてもらえると助かります。
おわり。

47
52
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
52