AnacondaでDjangoの本番環境を構築する

Djangoの本番環境構築した時にかなりハマってしまったので、その時のハマりどころなども含めて手順をまとめました。

本番環境

以下の構成で本番環境を構築しました。

  • CentOS 6
  • Apache 2.2
  • Python 3.5.2
  • Django 1.10.5
  • pyenv 1.1.1-5
  • Anaconda 4.2.0(64bit)
  • mod_wsgi 4.5.15

前提として、Djangoのソースコードは既に配置済みで、DBもマイグレーション完了しているものとします。

この辺りは開発環境で開発している時と手順は変わらないので・・・。

今回はApacheDjangoをのせることがメインです。

Djangoとmod_wsgiについて

Djangomod_wsgi利用する方法については、こちらも参考になると思います。

Anacondaとは

AnacondaPython本体と、Pythonでよく利用されるライブラリをセットにしたPythonパッケージです。

Anacondaをインストールすると、Python本体とライブラリがインストールされるため、環境構築が非常に楽になります。

本番環境構築の流れ

本番環境構築の大まかな流れは下記の通りです。

  1. pyenvのインストール
  2. Anacondaのインストール
  3. condaコマンドでPythonの環境を構築する
  4. mod_wsgiのインストール
  5. Apacheの設定

pyenvのインストール

pyenvをインストールします。

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

インストールが完了したらPATHの設定を行います。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc

$ source ~/.bashrc

Anacondaのインストール

Anacondaをインストールします。

# インストール可能なAnacondaを確認します。
$ pyenv install -l | grep ana

# 自身の環境に応じたAnacondaをインストールしてください。
$ pyenv install anaconda3-4.2.0
$ pyenv rehash
# グローバル設定
$ pyenv global anaconda3-4.2.0

今回は本番環境なので、Pythonの2系と3系の共存などは特に考えていないため、Pythonの3系のAnacondapyenvのグローバルに設定しています。

インストールが完了したらPATHの設定を行います。

$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

インストールしたAnacondaに付随しているcondaをアップデートしておきます。(念のため)

$ conda update conda

condaコマンドでPythonの環境を構築する

仮想環境を構築します。

# conda create -n <環境名> python=<バージョン> <スペース区切りでライブラリ名>

$ conda create -n python3.5.2 python=3.5.2

PYTHONPATHPYTHONHOMEを設定します。

$ echo 'export PYTHONHOME=/home/hoge/.pyenv/versions/anaconda3-4.2.0' >> ~/.bashrc
$ echo 'export PYTHONPATH=/home/hoge/.pyenv/versions/anaconda3-4.2.0/bin:/home/hoge/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages' >> ~/.bashrc
$ source ~/.bashrc

この状態でPythonのバージョンを確認します。

$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (64-bit)

このように表示されれば成功です!

mod_wsgiのインストール

ApacheDjangoを動かすにはmod_wsgiが必要なので、pipを利用してインストールします。

$ pip install mod_wsgi

インストールが完了すると下記のパスにモジュールが配置されます。

/home/hoge/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so

ただ、このモジュールは/home/hogeというユーザのパスの中に存在しているので、そのままだたApacheユーザはモジュールにアクセスすることができません。

なので、アクセスできるようにしてあげる必要があります。

$ chmod 755 -R /home/hoge

pyenvのインストール先をApacheがアクセスできるところに変更してあげても良いと思います。

Apacheの設定

Apacheの設定ファイルを作成します。

wsgi.conf

LoadModule wsgi_module /home/hoge/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so

python.conf

# 静的ファイルへアクセスするための設定
Alias /static/ /documentroot/project_name/staticfiles/

<Directory /documentroot/project_name/staticfiles>
    Order deny,allow
    Allow from all
</Directory>

# ファイルストレージなどの保管場所へアクセスするための設定
Alias /media/ /documentroot/project_name/media/

<Directory /documentroot/project_name/media>
    Order deny,allow
    Allow from all
</Directory>

# wsgi関連の設定
WSGIScriptAlias /app_name /documentroot/project_name/app_name/wsgi.py
WSGIPythonPath /documentroot/project_name:/home/hoge/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages

# Djangoアプリケーションの設定
<Directory /documentroot/project_name/app_name>
    Order allow,deny
    Allow from all
</Directory>

documentrootproject_nameapp_nameは環境に合わせて変更してください。

設定が完了したらApacheを再起動します。

# /etc/init.d/httpd restart

ブラウザでアクセスして画面が表示されたら成功です!

最後に

Djangoは開発環境はすぐに構築できたのですが、本番環境構築では、必要なソフトのインストールや設定が必要なため、環境構築できるまでに思った以上に時間がかかってしまいました。

やはり、runserverで簡単に動かすのと、Apacheにのせて動かすのではかなり勝手が違いますね・・・。

Djangoの本番環境構築で困ってるのであれば、今回ご紹介した手順を参考にしてみてください。