nginxとpythonとpyramid fabricでデプロイ
サムライファクトリーの平成コンビがお送りするWebサービスダイナシ
画像にコメントをつけて、ぜひ楽しんでください。
前回はnginxとuwsgiを連携してアプリを動作する方法を紹介しました。

前回までのエントリー
Pyramidのインストールまで
サーバーの起動まで
MySQLの設定
Nginxとuwsgi


ホームディレクトリ以下に保存されたアプリをそのままuwsgiで動かしていましたが、このままだと不便なことが多々あります。
・複数人で開発した場合
・本番環境と開発環境が違う場合
以上の問題をfabricで解決してみたいと思います。

fabricはpythonで記述できるデプロイツールです。
ssh経由でのコマンド実行やrsyncでのファイル同期など簡単な記述で実現できます。

今回は以下の構成を前提とします。
■開発環境
ホスト名:dev
ユーザー:yoshi
■本番環境
ホスト名:pro
ユーザー:web
yoshi@devからweb@proへsshでログインできること。

今回もFabricをsetup.pyに追記します。

requires = [
'pyramid',
'SQLAlchemy',
'transaction',
'pyramid_tm',
'pyramid_debugtoolbar',
'zope.sqlalchemy',
'waitress',
'mysql-python',
'uwsgi',
'Fabric', <-- 追記
]


「python setup.py develop」を実行すればFabricがインストールされます。
好みによりますがfabricはデプロイツールなので直接pipでインストールでも良いかもしれません。

インストールが成功すると「fab」コマンドが実行できるようになります。
fabコマンドはカレントディレクトリにあるfabfile.pyを実行してくれます。

fabricに変更するために各種設定ファイルを変更します。
※dev側で作業

vi production.ini
-----------------
[uwsgi]
virtualenv = /var/www/test.hoge.com/env
-----------------


fabfile.pyを用意します。

vi fabfile.py
-----------------
import os
from fabric.api import env, local, run, sudo
from fabric.contrib import project

env.user = 'web'
env.key_filename = os.environ['HOME'] + '/.ssh/id_rsa'
env.ignore = ['*.pyc', '.gitignore', '.git', 'sample.egg-info', 'env', 'dist']
env.sleep = 3

def production():
env.hosts = [
'pro',
]
env.app_path = '/var/www/test.hoge.com'

def rsync():
project.rsync_project(env.app_path, '../sample/', exclude=env.ignore, delete=True)

def start():
sudo('/etc/rc.d/init.d/test start')
local('sleep %(sleep)d' % env)
sudo('/etc/rc.d/init.d/nginx start')

def stop():
sudo('/etc/rc.d/init.d/nginx stop')
sudo('/etc/rc.d/init.d/test stop')

def deploy():
stop()
rsync()
start()
-----------------


pro側にデプロイ用ディレクトリを用意しておきます。

mkdir -p /var/www/test.hoge.com


「fab production rsync」を実行するとproにアプリがインストールされます。
fabの後にpythonの関数を並べた順番に処理が実行されます。

env変数はfabricで利用される環境変数になります。「env.user」「env.key_filename」「env.hosts」は予め決められた変数でそれぞれ「接続先のユーザー名」「ローカルの秘密鍵ファイルパス」「実行するホストリスト」を設定してます。
「env.hosts」に複数のホストを設定するとrsync関数が各ホストに対して実行されます。

「project.rsync_project」はrsyncを実行します。
第1引数にデプロイ先のディレクトリ、第2引数にローカルのディレクトリを指定します。「../sample/」と相対パスで指定しているのは実際デプロイされるディレクトリとローカルのプロジェクトのディレクトリが異なる場合に必要となります。「/」で終了しているのも意味があります。
あとは、excludeで同期しないファイルリスト、delete=Trueでローカルに存在しないファイルはproから削除するように設定しています。

pro側にもpythonbrewとpythonをインストールして新しい仮想環境を用意してアプリを構築します。

mkvirtualenv pyramid
cd /var/www/test.hoge.com
python setup.py develop
ln -s /home/web/.virtualenvs/pyramid/ env

setup.pyに依存ライブラリを記述しているので簡単に同一環境を用意することが出来ます。

前回用意したnginx、uwsgiの設定ファイルをすべてproにコピーして一部修正します。

sudo vi /etc/sysconfig/test
-----------------
UWSGI_USER=web
UWSGI=/var/www/test.hoge.com/env/bin/uwsgi
PROFILE=/var/www/test.hoge.com/production.ini
PIDFILE=/var/run/test/uwsgi.pid
LOCKFILE=/var/lock/subsys/test
-----------------

sudo vi /etc/nginx/conf.d/test.hoge.com.conf
-----------------
server {
listen 80;
server_name test.hoge.com;

location / {
uwsgi_pass unix:///var/run/test/uwsgi.sock;
include uwsgi_params;
client_max_body_size 10m;
client_body_buffer_size 128k;
}

location /static {
root /var/www/test.hoge.com/sample;
expires 30d;
add_header Cache-Control public;
access_log off;
}

}
-----------------


dev側から「fab production start」を実行するとuwsgi、nginxの順でサービスが起動されます。
fabricの「local」「run」「sudo」はそれぞれ「ローカルのコマンド実行」「ssh経由でコマンド実行」「ssh経由でsudoでコマンド実行」となっています。
デプロイ以外でも色々と利便性の高いツールです。

途中間が開いてしまいましたが、nginxとpythonとpyramidを利用したアプリ構築について記載してみました。

途中で環境やバージョンが変わってしまったので記載通りに動かない場合がありましたら、コメントやメールフォームでご指摘頂けると助かります。


2012/05/05 19:52 | Comments(0) | プログラム

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



| HOME | nginxとpythonとpyramid nginxとuwsgi>>