at_yasu's blog

ロード的なことを

Django + Uwsgi + nginx in CentOS6

なんか uWSGI が(私の中で)はやりっぽいので使ってみる。久しぶりに Django で遊びたくなったし。



要は WSGI だけど、それを Cで書いて速くした感じ?
いろいろな機能があるみたい。
設定がLDAPから取れたりクラスタリングとか複数インスタンスの管理とかRPCのサポートとかメモリー内ストレージとかUDPでロギングとか。
VirtualEnv 対応してるみたい。
よくわからん。


SakuraVPS の無料券もろたのでやってみる。せっかくだしね。

で、初めは標準の python2.6 でやってたけど、 thread に対応してないのと開発環境がPython2.7でやっちゃったので、threadに対応した python2.7 を作ってやる。でもこれやっても「*** Python threads support is disabled. You can enable it with --enable-threads ***」と言われる。解せぬ。

1. Python のインストール先は `/opt/local`
2. 作ったアプリケーションのインストール先は `/srv/www`
3. virtualenv の先は `/srv/www/py27`

先に断っておくと、shell の実行で先頭が「$」のは一般ユーザ、先頭が「#」が チャーリールート です。


必要なのを入れておく

忘れないように。git いります。

$ sudo mkdir -p /opt/local /srv/www
$ sudo chgrp wheel /opt/local /srv/www
$ sudo yum install git
$ sudo yum install libxml2-devel libxml2-python

Python2.7 のインストール

$ yum install mysql mysql-server mysql-devel
$ curl -O http://python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2
$ tar jxf Python-2.7.5.tar.bz2
$ cd Python
$ ./configure --with-thread --enable-shared --prefix=/opt/local
$ make -j2
$ sudo make install


でこれだと、libpython2.7.so.1.0 がねーぞksと言われて動かんので対応させる。

# echo '/opt/local/lib' > /etc/ld.so.conf.d/python-2.7.conf
# ldconfig

setuptools 入れて、pip入れて、virtualenv を入れて、環境汚染がないように venv で作業環境を作って、その中にdjangoやuwsgiを入れる。

# wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | /opt/local/bin/python
# /opt/local/bin/easy_install setuptools
# /opt/local/bin/easy_install pip
# /opt/local/bin/pip install virtualenv
# cd /srv/www
# virtualenv --distribute --no-site-packages --python=/opt/local/bin/python py27
# source py27/bin/activate
(py27)# pip install MySQL-python uwsgi django

ここまで出来たら、MySQLとDjangoの設定する。ここでは割合。


ハマったところだけメモ。Django の MEDIA_ROOT 及び TEMPLATE_PATH を `os.path.abspath("./template") ` にしていたのを絶対パスで指定。


次にフロントエンド側。何かと使う機会がなかった Nginxを使ってみる

# yum install nginx

アプリの設定

今回は趣味でやったものだから github(https://github.com/a-yasui/djangoTest) に投下済。起動スクリプトや、nginxの設定、uwsgiの設定も入ってるよ☆

  • uwsgi: uwsgiのLinux用起動スクリプト
  • uwsgi_http.ini: uwsig の設定ファイル
  • uwsgi.conf: nginx の設定ファイル

以下に各ファイルの設定方法など。

uwsgi

uwsgi は init.d に置くスクリプトです。環境によっては中の変数などは変えてください。

# cp uwsgi /etc/init.d/
# chmod +x /etc/init.d/uwsgi
# chkconfig --levels 235 uwsgi on
# service uwsgi start

uwsgi.conf

Nginx の設定ファイルです。同上

SERVER_DOMAIN および IPADDRESS にはそれぞれ適切な値を。

# cp uwsgi.conf /etc/nginx/conf.d/
# service nginx restart

uwsgi_http.ini

uwsgi の設定ファイル。SERVER_DOMAIN には適切な値を入れてください。そして、uwsgi にある変数「UWSGI_VASSALS」で指定しているパス上に置いてください。

django/tonbo/tonbo/settings.py

django の設定。django/tonbo/tonbo/settings.py.default を django/tonbo/tonbo/settings.py にコピーして、django/tonbo/tonbo/settings.py の中身を編集。

編集する変数

1. ADMINS: (名前, メールアドレス)のタプルにする。エラーなどが起きた時に飛んでくる。
2. ALLOWED_HOSTS: ホスト名を入れてください。サブドメインとかもここで追加するみたい。
3. TIME_ZONE, LANGUAGE_CODE: お国に合わせてください
4. MEDIA_ROOT: この場合だと、 /srv/www/djangoTest/django/tonbo/media
5. STATIC_ROOT: この場合だと、 /srv/www/djangoTest/django/tonbo/static
6. TEMPLATE_DIRS: この場合だと、 /srv/www/djangoTest/django/tonbo/template

最後に

最後に忘れないようにやっておく。

MySQL のユーザ作成とパスワードと、データベースの設定。データベース作成時に文字コードの指定忘れてたら、どこぞの誰かみたいに友人知り合いに見してバグってやがるwwwと言われて泣きをみる。私だけど。

(py27)$ mysql -uroot -p> grant usage on *.* to django@localhost identified by '';
> create database django_db default character set utf8;
> grant all on django_db.* django@localhost;
> flush privileges;
> ^D
(py27)$ python ./manage.py syncdb
(py27)$ python ./manage.py collectstatic

こんな感じ。


nginx でキャッシュさせるようにしてなかったり色々アレなのは今後の課題。

Ex: 参考一覧

https://gist.github.com/jniltinho/5565617
http://d.hatena.ne.jp/paraches/20120321/1332307423
http://uwsgi-docs.readthedocs.org/en/latest/Install.html
http://taichino.com/engineer-life/linux/2170
http://d.hatena.ne.jp/m-hiyama/20120312/1331513519