2012年8月19日日曜日

Django + uWSGI + NGINX 環境構築メモ on Ubuntu 12.04

Ubuntu 12.04 での環境構築をメモ。

色々なところからの寄せ集めだが、メインとなる情報源は How to Setup a Linux, Nginx, uWSGI, Python, Django Server。 それと前後する作業を追記している。

バージョン

(この前提条件を書いてないと、バージョンごとに設定ファイルの場所が意外と変わってたりして、混乱するんだよね…)
  • Ubuntu 12.04
  • Python 2.7.3 (with virtualenv, virtualenvwrapper)
  • Django >= 1.4
  • uWSGI 1.2.5
  • NGINX 1.2.2.1 (precise)

インストール

Ubuntu 12.04

省略

Python 2.7.3

virtualenv, virtualenvwrapper は、pip からインストール。
使い方は 2009年版Python開発環境を整えよう などを参考にさせていただいた。

以下は例。
$ # PyPy の環境 mypypy を新規に作成する。
$ mkvirtualenv  -v  --python=/usr/bin/pypy  mypypy
$
$ # mypypy 環境に切り替える (Tab 補完が効くのね)
$ workon  mypypy
(mypypy)$ pip  install  django
(mypypy)$
(mypypy)$ # mypypy 環境から離れる
(mypypy)$ deactivate
virtualenv を格納するディレクトリは、環境変数 WORKON_HOME に設定する。(デフォルトは $HOME/.virtualenvs)
あと、virtualenvwrapper.sh か virtualenvwrapper_lazy.sh のどちらかを、virtualenvwrapper の Shell Startup File にもあるように、.bashrc の末尾に追加しておく必要がある。
export WORKON_HOME=$HOME/devel/virtualenvs
source `which virtualenvwrapper.sh`
追補。
上記リンク先には環境変数 PROJECT_HOME なるものが設定されているけど、mkproject などのプロジェクト系コマンドを使わないなら設定する必要はないようだ。
ちなみに mkproject  hoge すると、mkvirtualenv hoge & workon hoge & プロジェクトフォルダを PROJECT_HOME 下に作る & cdproject hoge …という一連の処理をしてくれるようだ。(New virtualenvwrapper commands より)
多機能ではあるが、使う場面があるかなー?

あと上では PyPy の環境を作っているけど、あくまでコマンド例として記載しただけ。
PyPy の場合はいくつかパッチを当てたりしないといけないようなので、動作検証は全くしていない。

Django

1.4 とそれ以前では django-admin.py startproject したときのディレクトリ構造が微妙に違っている。
1.4 形式では wsgi.py が作成されるようになっているので、後述する uWSGI の起動部分で手間がかからない。

uWSGI

「みゅーうぃすきー」って発音するのか??
まあとにかく、こちらは apt-get でインストール。
$ sudo  apt-get  install  uwsgi
Python の pip でインストールする方法が書かれているものもあったけど、virtualenv 下でのインストールやら起動の仕方が分からなかったので上記の方法をとった。
なんかつまづきそうだったし。まぁ、virtualenv 外にインストールされるような気がするけど。

NGINX

apt-get するんだけど、Ubuntu のリポジトリが古いバージョンのままなので、NGINX 公式が提供しているリポジトリを追加する。
下の手順は、公式のダウンロードページに全て書いてある。
  1. NGINX 公式の公開キーをダウンロードする。(これね)
  2. $ sudo  apt-key  add  nginx_ signing.key
  3. $ sudo  vim  /etc/apt/sources.list
    deb http://nginx.org/packages/ubuntu/ precise nginx
    deb-src http://nginx.org/packages/ubuntu/ precise nginx
  4. $ sudo  apt-get  update
  5. $ sudo  apt-get  install  nginx
NGINX 用のユーザとグループが作成されているはず。
$ cat  /etc/passwd
というわけで、インストールは完了。

Django プロジェクトを uWSGI + NGINX で動かす


Django プロジェクトを作成し、uWSGI 単体での動作確認まで


virtualenv を作成する(必要に応じて)

以降の作業をする前に、virtualenv を作成しておく。(当然、virtualenv を利用しない場合はこの手順は省略する)
$ mkvirtualenv  -v  --python=`which python`  dj
(dj)$ pip  install  django


Django プロジェクトを作成する

プロジェクトを作成し、runserver で動作することを確認する。
(dj)$ django-admin.py  startproject  django_uwsgi_nginx
(dj)$ cd  django_uwsgi_nginx
(dj)$ python  manage.py  runserver


uWSGI 単体動作用の INI ファイルを作成する

uwsgi_http.ini
[uwsgi]
http = :8000
chdir = <django_uwsgi_nginx の絶対パス
>
module = django_uwsgi_nginx.wsgi
virtualenv = 
<WORKON_HOME(virtualenvsの場所)の絶対パス>/dj
※virtualenv は、利用していない場合は記述しない。

uWSGI を単体で動かす。
上で作成した INI ファイルを指定して起動。http://localhost:8000/ を確認。
$ uwsgi  --ini  uwsgi_http.ini


NGINX を経由させる

uWSGI と NGINX の設定が必要。先に uWSGI の方を設定する。


プロジェクトを /var/www 下へ

まず、プロジェクトディレクトリを /var/www の下に持ってくる。
プロジェクト django_uwsgi_nginx がログインユーザのホーム中にあったため、/var/www の下に cp してくる。
$ sudo  mkdir  /var/www
$ sudo  cp  -R  <django_uwsgi_nginx の絶対パス>  /var/www/
django_uwsgi_nginx
また、nginx ユーザで動かすため、ユーザ nginx、グループ nginx に所有権を移す。
$ sudo  chown  -R  nginx:nginx  /var/www/django_uwsgi_nginx


uWSGI 起動設定

/etc/init/uwsgi.conf に記述する。
新しめの Ubuntu では init プログラムとして upstart というものが採用されているらしく、/etc/init ディレクトリ内に「どの条件(イベント)で uWSGI がどう振る舞うべきか」を記述するらしい。
というか、init 関係の流れってあまり理解していない。要勉強だな…

で、記述する内容は以下のとおり。(太文字は、情報源から変更した部分)

description "uWSGI"start on runlevel [2345]stop on runlevel [06] respawn exec uwsgi --master --processes 4 --die-on-term --uid nginx --gid nginx \--socket /tmp/uwsgi.sock --chmod-socket 660 --vhost --logto /var/log/uwsgi.log \--plugins python,http
ユーザを nginx に、プラグインに http を足している。http は不要のような気がする。(Ubuntu のリポジトリの場合は必要らしいけど、NGINX 公式のリポジトリからインストールしているし)


NGINXのサーバ設定


NGINX の設定ファイルは、/etc/nginx/conf.d の中に *.conf のファイル名で作成する。
情報源によっては /etc/nginx/sites-enabled の中に作成するというものがあったが、今回インストールしたバージョン (1.2.2.1) では存在しなかった。

server {
    listen          80;
    server_name     $hostname;
    location /static {
        alias /var/www/django_uwsgi_nginx/static;
    }
    error_page   404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location / {
        include     uwsgi_params;
        uwsgi_pass  unix:/tmp/uwsgi.sock;
        uwsgi_param UWSGI_PYHOME    
<WORKON_HOME(virtualenvsの場所)の絶対パス>/dj;
        uwsgi_param UWSGI_CHDIR     /var/www/django_uwsgi_nginx;
        uwsgi_param UWSGI_MODULE    django_uwsgi_nginx.wsgi:application;
    }    
}
恐らくは、virtualenv を使っていない場合は UWSGI_PYHOME の指定は不要だと思う。

uwsgi_param で uWSGI の設定をしているため、前に書いたような INI ファイルは今回は不要。

設定ファイルを置いたら、configtest をして、文法エラーが無いことも確認する。
その後、uWSGI も NGINX も、サービスを再起動させる。
$ sudo  service  nginx  configtest
$ sudo  service  uwsgi  restart
$ sudo  service  nginx  restart
後は、http://localhost/ にアクセスする。

0 件のコメント: