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.

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

Trackbacks and Pingbacks on this post

No trackbacks.

TrackBack URL