Tag Archives: レンタルサーバ

さくらのレンタルサーバでpyenvとDjangoを動かす

さくらのレンタルサーバとは

VPSとは異なり,OSの管理をさくらインターネットが行い,一部の権限だけをユーザーが持つホスティングサービスです.
root権限のあるVPSとは違い,できることと使えるリソースは限られますが以下の機能がセットアップなしで利用できます.
さらに,OSやApacheのセキュリティアップデートなどのメンテナンスもさくらが行うので,(自分が設置したもの以外)メンテナンスを意識せずに使えるため,これまでVPSでやってきた人にとっても思った以上に便利だと思います.

  • ApacheによるWebサーバ + CGI
  • メールサーバ (SMTP/POP3/IMAP)
  • データベースサーバ(MySQL)
  • PHP, Python, 等々のコマンド
  • CRON

詳しい仕様は サービスサイト に任せるとして本題に入ります.

ある程度ApacheやDjangoについて理解できている人向けにあっさりと説明します.

Djangoを動かす

一般的な設置方法との違い

レンサバのApacheには mod_wsgi のようなPython向けのモジュールが入っていないため,一般的なデプロイ方法では設置できません.また,常時起動のデーモンプロセスを起動させることもできないため,FastCGIサーバとしてDjangoを動作させることもできません.
そこで,言語問わずCGIモードに対応していることを用いてCGIとしてDjangoを動かします.

Djangoのアプリケーションを作成する

今回はデプロイの説明のため,Webアプリケーションの作成に関しては触れません.サンプルとして以下に公開しているDjangoのプロジェクトを利用して説明します.

chibiegg/django-example-python2

さくらのレンタルサーバを契約する

さくらのレンタルサーバオンラインサインアップ より,さくらのレンタルサーバを契約します.MySQLはスタンダードプラン以上で利用できます.すでに契約しているひとは持っているアカウントでOKです!

2週間の無料お試し期間もあります.(この記事も2週間お試し期間をつかって書いています)

契約すると,仮登録完了メール等でパスワードが通知され,最終的に以下のようなコントロールパネルにログインできると思います.

さくらのレンタルサーバコントロールパネル

今回は初期ドメイン chibiegg-201505.sakura.ne.jp で契約したとして説明します.

データベースを作成する

コンパネ左のメニューから データベースの設定 をクリックします.

データベースの管理メニュー

“データベースの新規作成” をクリックし,適当なデータベース名とパスワードを決めて,データベースを作成します.
パスワードは今後作成する全てのデータベースで共通になります.(変更可能)
また,文字コードはUTF-8を指定します.

データベースの作成

作成後に表示されるデータベースサーバ名を控えておきます.(いつでも参照可能です)

今回は mysql508.db.sakura.ne.jp でした.

SSHでログインして作業する

サブディレクトリを初期ドメインのルートディレクトリにする

標準では /home/chibiegg-201505/www/ がルートディレクトリになりますが,さくらのレンタルサーバでは一つの契約で複数のドメインのWebサイトを提供できます.このとき,ドメインごとに別ディレクトリを指定すると便利なので, /home/chibiegg-201505/www/chibiegg-201505.sakura.ne.jp/htdocs/chibiegg-201505.sakura.ne.jp のルートディレクトリになるように ~/www/.htaccess を作成します.

RewriteEngine on
RewriteCond %{HTTP_HOST} chibiegg-201505.sakura.ne.jp [NC]
RewriteCond %{REQUEST_URI} !(^/chibiegg-201505.sakura.ne.jp) [NC]
RewriteRule .* /chibiegg-201505.sakura.ne.jp/htdocs%{REQUEST_URI} [L]

pyenvのセットアップ

標準ではPythonのバージョンが2系しかなく,また,pipなども利用できないため,pyenvpyenv-virtualenv を利用し,プロジェクトごとにバージョンとパッケージを選択できるようにします.

pyenvに関しては基本的に一般的な方法そのままです.

git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

でインストールし, ~/.bash_profile を以下のようにします.

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export TMPDIR="$HOME/tmp"
export PYTHON_PATH=./
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

今後pyenvを使うときは bash を使います.

chsh -s /usr/local/bin/bash
bash
source ~/.bash_profile

次回からはSSHログイン時にbashが起動します.

今回のプロジェクトで使う環境をセットアップする

pyenv install 2.7.9
pyenv virtualenv 2.7.9 django-example-python2
pyenv activate django-example-python2
pip install django mysqlclient

Djangoのファイルを設置する

bash
mkdir -p ~/www/chibiegg-201505.sakura.ne.jp/htdocs
cd ~/www/chibiegg-201505.sakura.ne.jp
git clone https://github.com/chibiegg/django-example-python2.git
cd django-example-python2
pyenv local django-example-python2

Djangoの設定ファイルを修正する

~/www/chibiegg-201505.sakura.ne.jp/django-example-python2/src/myprj/production_settings.py を以下のように編集します.

この時,ディレクトリやホスト名,データベースの接続情報は環境に合わせてください.

# encoding=utf-8

from .settings import *

DEBUG = False
ALLOWED_HOSTS = ["chibiegg-201505.sakura.ne.jp"]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'chibiegg-201505_myprj',
        'USER': 'chibiegg-201505',
        'PASSWORD': 'PASSWORDISHERE',
        'HOST': 'mysql508.db.sakura.ne.jp',
        'OPTIONS': {
               "init_command": "SET storage_engine=InnoDB",
        }
    }
}

STATIC_URL = '/static/'
STATIC_ROOT = '/home/chibiegg-201505/www/chibiegg-201505.sakura.ne.jp/htdocs/static/'

migrate (syncdb) する

VPSの時と同じようにモデルからテーブルを作成し,スーパーユーザの作成と,静的ファイルの生成を行います.

cd ~/www/chibiegg-201505.sakura.ne.jp/django-example-python2/src
python manage.py migrate --settings=myprj.production_settings
python manage.py createsuperuser --settings=myprj.production_settings
python manage.py collectstatic --settings=myprj.production_settings

CGIを作成する

ここまでは,どこにデプロイするときも同じです.本来であれば,mod_wsgiや,FastCGI(gunicorn)を使いますが,CGIモードで動かすためにcgiのスクリプトを ~/www/chibiegg-201505.sakura.ne.jp/htdocs/django.cgi に作成します.

ひな形を用意してますので,ダウンロードして使います.

cd ~/www/chibiegg-201505.sakura.ne.jp/htdocs
wget --no-check-certificate https://raw.githubusercontent.com/chibiegg/django-cgi/master/django-python2.cgi
mv django-python2.cgi django.cgi
chmod +x django.cgi

このスクリプトには,実行環境に合わせて3箇所編集・追記する場所があります.

pythonのバイナリの場所を指定する

一行目のpythonのパスを,pyenvの環境のpythonにします.
今回は /home/chibiegg-201505/.pyenv/versions/django-example-python2/bin/python ですので,一行目を以下のようにしました.

#!/home/chibiegg-201505/.pyenv/versions/django-example-python2/bin/python

プロジェクトのパスを追加する

# Change this to the directory above your site code. の行の後にDjangoのプロジェクトのパスを追加します.

sys.path.append("/home/chibiegg-201505/www/chibiegg-201505.sakura.ne.jp/django-example-python2/src")

利用するDjangoの設定を指定する

末尾のほうの application.settings を今回利用する myprj.production_settings に変更します.

.htaccessでリダイレクトの設定をする

ここまでで http://chibiegg-201505.sakura.ne.jp/django.cgi/admin/ にアクセスしてみましょう.
ちゃんとDjangoの管理サイトにアクセスできると思います.

Django管理サイト

ただ,これではカッコ悪いので,ちゃんとRewriteでURLを /admin/ だけになるようにしましょう.

~/www/chibiegg-201505.sakura.ne.jp/htdocs/.htaccess を以下のように作成します.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /django.cgi/$1 [QSA,L]
</IfModule>

これで http://chibiegg-201505.sakura.ne.jp/admin/ でちゃんとアクセスできるようになりました.

Python3を使う場合

pyenvを入れたのでPython3系列も利用可能です.CGIファイルがバージョンによってことなりますので,

https://raw.githubusercontent.com/chibiegg/django-cgi/master/django-python3.cgi

を利用してください.