gunicornの設定

djangoで何か作って運用するための準備としてgunicornを使ってみた。

gunicorn

トップページには簡単に動きまっせみたいなことを書いているが、3晩はかかった。仕事だとしたらば1日潰れたぐらい時間がかかった。

 

まずはvagrantで動いてるubuntu 14.04にインストール


$ pyenv shell 3.4.3

$ pip install gunicorn

 

つづいてサンプルアプリの写経

~/src/gunicorn/myapp/myapp.py


def app(environ, start_response):
 data = "Hello World!\n"
 start_response("200 OK", [
 ("Content-Type", "text/plain"),
 ("Content-Length", str(len(data)))
 ])
return iter([data])

 

動かしてみると、おー動く。


unicorn -w 4 myapp:app

[INFO] Listening at: http://127.0.0.1:8000 (13232)

でもブラウザからは動作はしない。vagrantのポートフォワードの設定をしてもダメ。webサーバ、うちの場合はnginxの設定も必要らしい。

gunicornのインストール | i2bsの日記

なんとなく真似てgunicornのグループを作成して、vagrantユーザを所属させてみたが、結局confの設定は正しく読めなかった。

nginxの設定もunixドメインソケットのupstreamの設定がキモっぽいがsite-available/defaultに書いてると、/var/log/nginx/error.logに以下のエラーが出てnginxが起動しない。

"upstream" directive is not allowed here

ググってみるとどうもバーチャルホストの設定が必要らしくconf.d/になんか書く必要があるとのこと。参考にさせてもらったサイトでもよくみるとそうなってたので、そのようにした。でもconf./dの設定とsites-availableの設定の関係性が分からなくなった。

 

confの設定がどうも効かないので、CLIから直接起動。アプリを書いたディレクトリで、以下を叩く。


unicorn -b "unix:/tmp/gunicorn.sock" myapp:app

 

今度はListeningのlogが変わった。


[INFO] Listening at: unix:/tmp/gunicorn.sock (13277)

 

がしかし、http://127.0.0.1:18000/にアクセスすると、gunicornのアプリがエラーする。(18000はvagrantへのhttpアクセスのport forwardの設定port)


[ERROR] Error handling request Traceback (most recent call last):
 File "/opt/pyenv/versions/3.4.3/lib/python3.4/site-packages/gunicorn/workers/sync.py", line 177, in handle_request
 resp.write(item)
 File "/opt/pyenv/versions/3.4.3/lib/python3.4/site-packages/gunicorn/http/wsgi.py", line 326, in write
 raise TypeError('%r is not a byte' % arg)

 

“gunicorn type error not a byte”でググって、stackoverflowで解決。

gunicorn (Python3.4 and 3.3) sends in response only headers without data | stackoverflow

元のアプリがpython 3系だとダメらしい。以下のresponseとおぼしき1行を修正してブラウザからの動作は確認できた。

– return iter([data])

+ return [bytes(data, ‘utf-8’)]

 

残すは設定ファイルからのgunicorn起動。

 

2015/10/05追記

設定ファイル書けた。たぶんファイルのパーミッションの問題で、daemon化ができていなかった。以下は動作が確認できたファイルで、logファイルは先に作成して、chmod 666した。


import multiprocessing

bind = 'unix:/tmp/gunicorn.sock'

workers = 2
worker_class = 'sync'
worker_connections = 1000
max_requests = 1000
timeout = 30
keepalive = 2

debug = False
spew = False

prelood_app = True
daemon = True
pidfile = '/tmp/gunicorn.pid'
umask = 0
#user = 'vagrant'
#group = 'gunicorn'

accesslog = '/usr/local/gunicorn/logs/access.log'
errorlog = '/usr/local/gunicorn/logs/error.log'
loglevel = 'info'

proc_name = 'gunicorn'

なお確認したソフトのバージョンは、以下。
python 3.4.3
nginx 1.4.6
gunicorn 19.3.0

Comments on this post

No comments.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Trackbacks and Pingbacks on this post

No trackbacks.

TrackBack URL