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
以下は例。
$ # 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)
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 公式が提供しているリポジトリを追加する。
- NGINX 公式の公開キーをダウンロードする。(これね)
- $ sudo apt-key add nginx_ signing.key
- $ sudo vim /etc/apt/sources.list
deb http://nginx.org/packages/ubuntu/ precise nginx
deb-src http://nginx.org/packages/ubuntu/ precise nginx
- $ sudo apt-get update
- $ 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 を単体で動かす。
$ 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/ にアクセスする。