さくらのVPSでApache+Python+Django+SQLiteのアプリを動かす方法

さくらのVPSでApacheを動かし、Python+Django+SQLiteでアプリを動かす場合のメモです。ファイアウォールとか、基本的な設定は終わっているものとします。基本的な設定に関しては、「CentOSをサーバーとして活用するための基本的な設定」や「はじめてのさくら VPS + CentOS の初期設定からチューニングなどの作業まとめ」がわかりやすいと思います。

補足としまして、このメモではPythonの仮想開発環境virtualenvを使い、Apacheとの連携はmod_wsgiを使っています。

apacheのインストール

まずはapacheをインストールします。これに関しては、上で上げたサイトに詳しく載っていますが、ここにもコマンドを載せてきます。

apacheのインストール

sudo yum -y install httpd

apacheを起動

sudo /etc/init.d/httpd start

apacheの自動起動を設定

sudo /sbin/chkconfig httpd on

apacheが動いているかを確認

curl http://IP_ADDRESS

Pythonのインストール

次はPythonのインストールです。ただ、setuptoolsやSQLiteに必要なものは、Pythonをインストールする前にインストールします。

zlib-devel(setuptools用), sqlite-devel(SQLite用)をインストール

sudo yum install -y zlib-devel sqlite-devel

Pythonをインストール

mkdir ~/tmp
cd ~/tmp
wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
tar zvxf Python-2.7.2.tgz
cd Python-2.7.2
./configure --enable-shared --prefix=/opt/python2.7
make
sudo make install

sqlite3のモジュールを確認

ls /opt/python2.7/lib/python2.7/lib-dynload/_sqlite3.so

Pythonの環境変数を設定

vi ~/.bashrc
--- ファイル: ~/.bashrc ---
export PYTHONHOME=/opt/python2.7
export PYTHONPATH=/opt/python2.7/lib/python2.7/site-packages/
export PATH=/opt/python2.7/bin:$PATH
source ~/.bashrc

Pythonがきちんと動くかを確認(私の環境下では失敗しました。)

python -V
--- エラーメッセージ ---
python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

libpython2.7.so.1.0をコピー

sudo ln -s /opt/python2.7/lib/libpython2.7.so.1.0 /lib64/

Pythonがきちんと動くかを確認

python -V Python 2.7.2

これでPythonのインストールが終わりました。

mod_wsgiインストール

Pythonをインストールしたら、次はapacheでPythonを動かすためのmod_wsgiというモジュールをインストールします。なお、先に「httpd-devel」をインストールするのは、mod_wsgiをconfigureする際に「/usr/sbin/apxs」を指定するためです。

mod_wsgiをインストール

sudo yum -y install httpd-devel
cd ~/tmp
wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz
tar vzxf mod_wsgi-3.3.tar.gz
cd mod_wsgi-3.3
./configure --with-apxs=/usr/sbin/apxs --with-python=/opt/python2.7/bin/python2.7
make
sudo make install

mod_wsgiがインストールされたかを確認

ls /etc/httpd/modules/mod_wsgi.so

これでmod_wsgiがインストールされました。ただ、これを有効にするにはApacheの設定ファイルを修正する必要があります。これに関しては下で述べます。

virtualenv環境の構築

Pythonの開発では、virtualenvという仮想開発環境を使用すると、パッケージの干渉を防ぐことができます。また、必要なモジュールを把握したり、それらをインポートするのも簡単にできます。

setuptoolsのインストール

cd ~/tmp
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
tar zvxf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
sudo /opt/python2.7/bin/python2.7 setup.py install --prefix=/opt/python2.7

virtualenvのインストール

sudo easy_install virtualenv

以上でvirtualenvがインストールされます。

アプリの準備

「/var/www/hoge」ディレクトリ下に、virtualenvを使って仮想開発環境を構築します。

virtualenvで仮想開発環境を構築

cd /var/www
su
mkdir hoge
cd hoge
virtualenv venv --no-site-packages
source venv/bin/activate

virtualenvが正しくできているかを確認

which python

上記コマンドで、「/var/www/hoge/venv/bin/python」が表示されればOKです

Djangoを使ったアプリの作成

Djangoを使ったアプリを作成します。このメモはApache+Django+SQLiteで動作させることが目的なので、アプリ自体は非常にシンプルなものです。

Djangoをインストール

pip install Django

Djangoをインストールしたらアプリ作成に入ります。

startprojectコマンドを実施

django-admin.py startproject myproject
cd myproject

settings.pyを修正

vi settings.py
--- ファイル: settings.py ---
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/tmp/sqlite3.db',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

INSATLLED_APPS = (
    ...,
    ...,
    'myapp',
)

startappコマンドの実施

django-admin.py startapp myapp

モデルの修正

vi myapp/models.py
--- ファイル: myapp/models.py ---
from django.db import models
class Hoge(models.Model):
    name = models.CharField(max_length=255)

モデルをもとにデータベース作成(途中の「yes/no」は「no」で構いません。)

python manage.py syncdb

ビューの修正

vi myapp/views.py
--- ファイル: myapp/views.py ---
# Create your views here.
from django.http import HttpResponse
from myapp.models import Hoge
def index(request):
    hoge = Hoge(name='Hoge')
    hoge.save()
    return HttpResponse([hoge.name + '<br/>' for hoge in Hoge.objects.all()])

urls.pyの修正

vi urls.py
--- ファイル: urls.py ---
from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns('',
    (r'^.*$', 'myapp.views.index'),
)

wsgiモジュールの作成

アプリができたら、Apacheから呼び出すwsgiモジュールを作成します。

wsgiファイルの作成

cd ..
mkdir wsgi-scripts
cd wsgi-scripts
vi django.wsgi
--- ファイル: django.wsgi ---
#! /usr/bin/env python
import os, sys
import django.core.handlers.wsgi
sys.path.append('/var/www/hoge')
sys.path.append('/var/www/hoge/myproject')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
_application = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
    return _application(environ, start_response)

最後にSQLiteのデータベースファイルをApacheが読み書きできるように、権限を変更します。

SQLiteのファイル権限変更

chmod 666 /tmp/sqlite3.db

これで一通りアプリの準備が整いました。

Apacheの設定

Apacheから先ほど作成した、「django.wsgi」を呼び出すために「httpd.conf」を修正します。また、mod_wsgiモジュールを読み込む部分も記述します。

httpd.confの修正

vi /etc/httpd/conf/httpd.conf
--- ファイル: httpd.conf ---
LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome /var/www/hoge/venv
WSGIPythonPath /var/www/hoge/venv/lib/python2.7/site-packages
WSGIScriptAlias /django /var/www/hoge/wsgi-scripts/django.wsgi

httpd.confのチェック

/usr/sbin/apachectl configtest

さくらのVPS+Apache+Python+Django+SQLiteアプリの確認

Apacheの設定が終わったら、後は確認をするだけです。

Apacheの再起動

/etc/init.d/httpd restart

アプリの確認

curl http://IP_ADDRESS/django/

この記事が役に立った場合、シェアしていただけると励みになります!!