CentOS 5.9 + Python(Flask)のWebアプリ作成環境

サーバといえばCentOS、そんなふうに考えていた時期が(ry
いや、今もきっとそうだと思います、多分。

とりあえず最新のCentOS 5.9にFlaskを使ったPythonのWebアプリ作成環境を構築してみました。

まずCentOSPythonはバージョン2.4なのでなんとかしたいです。
ただ元々入っているのを消したりすると困る人がいるかもしれないので
pythonzとvirtualenvを使って新しいPythonを入れようと思います。

とはいっても元々入っているPythonだとpythonzもvirtualenvも使えません。
ということでyumのepelリポジトリからPython2.6をインストールしちゃいます。
それではepelリポジトリの設定から。

# epelリポジトリのインストール
$ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
# epelリポジトリの初期化
$ sudo yum check-update --enablerepo=epel

デフォルトでepelリポジトリを使わないようにするには設定ファイルのenabledを0にしておきます。

$ sudo vim /etc/yum.repos.d/epel.repo
$ diff -u /etc/yum.repos.d/epel.repo~ /etc/yum.repos.d/epel.repo
--- /etc/yum.repos.d/epel.repo~	2010-08-12 03:07:06.000000000 +0900
+++ /etc/yum.repos.d/epel.repo	2013-02-17 22:35:25.000000000 +0900
@@ -3,7 +3,7 @@
 #baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch
 mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch
 failovermethod=priority
-enabled=1
+enabled=0
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL

これでPython2.6がインストールできるようになりました。
yumコマンドでインストールします。

$ sudo yum install python26 --enablerepo=epel

次はpythonzのインストールです。

# pythonzのインストールスクリプトが使用するpythonをsedで指定
$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | sed -e "s/\/usr\/bin\/python/\/usr\/bin\/python26/" | bash

# .bashrcにpythonzの設定を追加
$ vim .bashrc
$ diff -u .bashrc~ .bashrc
--- .bashrc~	2013-02-17 22:32:43.000000000 +0900
+++ .bashrc	2013-02-17 22:44:36.000000000 +0900
@@ -6,3 +6,5 @@
 fi
 
 # User specific aliases and functions
+
+[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc

それではpipでvirtualenvをインストールしましょう。
と思ったらpipもまだ使えないんでしたね...

以下のコマンドでpipとvirtualenvをインストールします。

# setuptoolsのインストール
$ curl http://peak.telecommunity.com/dist/ez_setup.py | sudo python26
# pipのインストール
$ curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python26

# virtualenvのインストール
$ sudo pip-2.6 install virtualenv
$ sudo pip-2.6 install virtualenvwrapper

$ mkdir .virtualenvs
# .bashrcにvirtualenvの設定を追加
$ vim .bashrc
diff -u .bashrc~ .bashrc
--- .bashrc~	2013-02-17 22:44:36.000000000 +0900
+++ .bashrc	2013-02-17 22:50:41.000000000 +0900
@@ -8,3 +8,8 @@
 # User specific aliases and functions
 
 [[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc
+
+export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2.6
+export VIRTUALENVWRAPPER_VIRTUALENV=/usr/bin/virtualenv-2.6
+export WORKON_HOME=$HOME/.virtualenvs
+source /usr/bin/virtualenvwrapper.sh

.bashrcの設定を変更したら追加した設定を読み込みます。

$ source .bashrc

さて、このあとはpythonzで新しいPythonをインストールするわけですが、
pythonzはソースからビルドするのでビルド環境を整えなければいけません。

# ビルドツールのインストール
$ sudo yum install gcc gcc-c++ automake autoconf
# Pythonのビルドに必要なライブラリのインストール
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel

さあPython2.7(そろそろ3系でも良いのかもしれませんが...)のインストール、
といきたいところなんですけど、今の状態だとpythonzはシステムのPython
使ってしまうのでPython2.6を使うようにpythonzを修正します。

vim .pythonz/bin/pythonz
diff -u .pythonz/bin/pythonz~ .pythonz/bin/pythonz
--- .pythonz/bin/pythonz~	2013-02-17 22:43:52.000000000 +0900
+++ .pythonz/bin/pythonz	2013-02-17 22:52:04.000000000 +0900
@@ -1,2 +1,2 @@
 #!/usr/bin/env bash
-python /home/myapp/.pythonz/scripts/pythonz_main.py "$@"
+python26 /home/myapp/.pythonz/scripts/pythonz_main.py "$@"

ようやくPython2.7がインストールできるようになりました。
このあと、mod_wsgiのビルドで必要となるのでビルドオプションに
"CFLAGS=-fPIC"をつけておきます。

$ pythonz install --configure="CFLAGS=-fPIC" 2.7.3

今度はmod_wsgiですが、その前にmake installでインストールするパッケージを
管理するためにpacoを入れておきましょう。

$ curl -OL http://downloads.sourceforge.net/paco/paco-2.0.9.tar.gz
$ tar zxvf paco-2.0.9.tar.gz
$ cd paco-2.0.9
$ ./configure --disable-gpaco
$ make
$ sudo make install
$ sudo make logme
$ cd

気を取り直してmod_wsgiをインストールします。
なお、virtualenvでインストールしたPythonを使わないのであれば
epelからインストールしてしまっても良いと思います。

# mod_wsgiのビルドに必要なライブラリのインストール
$ sudo yum install httpd-devel

# mod_wsgiのインストール
$ curl -O http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
$ tar zxvf mod_wsgi-3.4.tar.gz
$ cd mod_wsgi-3.4
# pythonzでインストールしたPythonを指定
$ ./configure --with-python=$HOME/.pythonz/pythons/CPython-2.7.3/bin/python
$ make
$ sudo paco -D make install
$ sudo chmod 755 /usr/lib64/httpd/modules/mod_wsgi.so
$ cd

mod_wsgiがインストールできたのでもう使わないmod_pythonの設定は消し、
mod_wsgiの設定をしておきましょう。

$ sudo rm /etc/httpd/conf.d/python.conf
$ sudo vim /etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so

WSGIRestrictStdout off
WSGISocketPrefix /var/run/wsgi

<VirtualHost *>
    WSGIDaemonProcess app-sample user=app group=app threads=5 python-path=/home/app/.virtualenvs/myapp/lib/python2.7/site-packages
    WSGIScriptAlias / /home/app/flask-app-sample/app.wsgi
    WSGIScriptReloading On

    <Directory /home/app/flask-app-sample>
        WSGIProcessGroup app-sample
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

httpdの設定を変更したらhttpdを再起動します。

$ sudo /etc/init.d/httpd restart

Webアプリで使うデータベースは何でも良いんですが、なんとなくMySQLにしてみます。

# MySQLのインストール
$ sudo yum install mysql mysql-devel mysql-server

# MySQLのエンコーディングをutf8にする
$ sudo vim /etc/my.cnf
diff -u /etc/my.cnf~ /etc/my.cnf
--- /etc/my.cnf~	2013-01-23 05:05:35.000000000 +0900
+++ /etc/my.cnf	2013-02-17 23:03:28.000000000 +0900
@@ -9,6 +9,9 @@
 # Disabling symbolic-links is recommended to prevent assorted security risks;
 # to do so, uncomment this line:
 # symbolic-links=0
+default-character-set=utf8
+skip-character-set-client-handshake
+character-set-server=utf8
 
 [mysqld_safe]
 log-error=/var/log/mysqld.log

mysqldの設定を変更したらmysqldを再起動します。

$ sudo /etc/init.d/mysqld restart

MySQLの準備が出来たのでアプリで使用するデータベースを作成します。

# rootのパスワードを設定
$ mysqladmin -u root password 'password'
$ mysql -u root -p
# appユーザのアカウントを設定
mysql> grant all privileges on myapp.* to app@localhost identified by 'app';
mysql> exit
# アプリで使用するデータベースの作成
$ mysql -u app -p
mysql> create database myapp;
mysql> exit

長かったですね...やっとWebアプリの環境をセットアップできるようになりました。
mkvirtualenvでアプリ用の環境を作ります。

$ mkvirtualenv -p ~/.pythonz/pythons/CPython-2.7.3/bin/python myapp
$ pip install flask
$ pip install flask-wtf
$ pip install flask-sqlalchemy
$ pip install mysql-python

$ chmod 755 /home/app

ところで、素のVim(しかもバージョン7.0)で開発をするのはツライものがあります。
ということでVimも最新版を入れておきましょう。

if_pythは最新のvirtualenvのPython2.7を使用することにします。

$ sudo yum install mercurial --enablerepo=epel

$ hg clone https://vim.googlecode.com/hg/ vim
$ cd vim

# virtualenv環境にいなかったらvirtualenv環境に入っておく
$ workon myapp

$ ./configure \
--prefix=$HOME/local/vim \
--with-features=huge \
--with-compiledby=daisuzu \
--enable-multibyte \
--enable-fontset \
--enable-cscope \
--enable-perlinterp \
--enable-pythoninterp \
--with-python-config-dir=$HOME/.pythonz/pythons/CPython-2.7.3/lib/python2.7/config

$ make
$ sudo paco -D make install

なんだか疲れてしまいました。
肝心のアプリは完成品が出てくる料理番組のようにflask-app-sampleあたりで。
うまく動かない場合はiptablesSELinuxを無効にしてみてください。


P.S.
今日はYokohama.vim.reverse #4でした。
お寿司もピザも美味しかったです。
そしてまたVimのスゴさを知ることができました。