まっさらなVPS（CentOS6）からApacheを使ってDjangoを動かすまでのメモ


個人的に制作するサイトではVPSでDjangoを動かす事が多いです。これをAnsibleの[playbook](http://qiita.com/itkr/items/1881cf86386dccb37fdd)にしようとしていますが、それをするにもひとまず作業をまとめておかなければならないので、(DBサーバーもwebサーバーもひっくるめて)１台でDjangoアプリを動かすときによく使う設定などをメモ程度に羅列しておきます。ある程度記憶を頼りに書いている部分があるので間違っているところがあるかも

- Note: 記述しているコマンドは適時`sudo`をつけている場合があります
- Note: Django側の設定はここには書かれていません
- Note: 各設定ファイルは全行ではなく差分だけ書いている場合があります

## 初期設定

yumの更新

```
yum update
```

使いそうなツール

```
yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel mysql-devel
```

日本語化
/etc/sysconfig/i18n

```/etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
```

## ユーザー作成

```
useradd webapp
passwd webapp
```

sudo できるように

```
usermod -G wheel webapp
```

```
visudo
```

- `%wheel ALL=(ALL) ALL`

## 鍵認証

### `ssh-copy-id`を使う場合

#### ローカル作業
```
$ brew install ssh-copy-id
```

```
$ ssh-keygen -t rsa -v
$ ssh-copy-id webapp@xxx.xxx.xx
```

### `ssh-copy-id`を使わない場合

#### サーバー側

```
mkdir ~/.ssh
chmod 700 ~/.ssh
```

#### ローカル

```
$ ssh-keygen -t rsa -v
$ chmod 600 ~/.ssh/id_rsa.pub
$ scp ~/id_rsa.pub webapp@xxx.xxx.xx:~/.ssh/authorized_keys
```

## SSH設定

/etc/ssh/sshd_config

```/etc/ssh/sshd_config
Port 22  # 22はデフォルト値なのでこれ以外にした方が安全
PasswordAuthentication no
PermitRootLogin no
```

```
service sshd restart
```

## ファイアウォール

- Note: CentOS 6の設定です。CentOS 7からは設定方法が変わっているようです

/etc/sysconfig/iptables

```/etc/sysconfig/iptables
*filter
:INPUT    DROP    [0:0]
:FORWARD  DROP    [0:0]
:OUTPUT   ACCEPT  [0:0]
:SERVICES -       [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A SERVICES -p tcp --dport 22 -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT
COMMIT
```

```
service iptables start
iptables -L
```

## httpdインストール

```
yum install httpd
chkconfig httpd on
```

```/etc/httpd/conf/httpd.conf
ServerTokens ProductOnly
ServerSignature Off
NameVirtualHost *:80
```

```
service httpd configtest
service httpd restart
```

## pythonインストール

- Note: ここではシステム上で作業するためのPythonを`/usr/local/`に、virtualenvでバージョン管理する際にベースとして指定するPythonを`/opt/local/`にインストールしています。

### 作業用 Python

- Note: `CFLAGS=-fPIC --enable-shared`はあとでmod_wsgiをmakeした時にエラーに成ったので追加しました

```
curl -O https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
tar xvzf Python-2.7.10.tgz
cd Python-2.7.10
./configure CFLAGS=-fPIC --enable-shared
make
make install
```

(再ログイン)

### virtualenv用 Python

`pythonbrew`や`pyenv`を使うとバージョン管理は楽になりそうですが、それらを導入するまでもないと思うので直接インストールします。

```
curl -O https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
tar xvzf Python-2.7.10.tgz
cd Python-2.7.10
./configure --prefix=/opt/local/python2.7.10
make
make install
```

## 作業用Pythonにpipをインストール

```
wget https://bootstrap.pypa.io/get-pip.py
/usr/local/bin/python get-pip.py
```

## virtualenv と virtualenvwrapperをインストール

```
/usr/local/bin/pip install virtualenv
/usr/local/bin/pip install virtualenvwrapper
```

```~/.bashrc
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
fi
```

## Djangoアプリ用のvirtualenvを作成

```
mkvirtualenv project_name --python=/opt/local/python2.7.10/bin/python
```

## mod_wsgiのインストールと設定

- Note: `/home/webapp/project_name`にDjangoのアプリが入っている想定です。wsgiスクリプトやstaticのpathは調整する必要があります。
- Note: アプリのサンプル `cd /home/webapp; git clone git@github.com:itkr/simpledjango.git project_name`
- Note: はじめyumでインストールしましたが、標準で入っているPython2.6.6が使われてエラーになってしまったためソースからインストールする方法を記載しました。（参考：[readthedocs app won't start with apache and django](http://stackoverflow.com/questions/32552289/readthedocs-app-wont-start-with-apache-and-django)）

### インストール

```
yum install httpd-devel
```

```
wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.2.8.tar.gz -O mod_wsgi-4.2.8.tar.gz
tar xzf mod_wsgi-4.2.8.tar.gz
cd mod_wsgi-4.2.8
./configure --with-python=/usr/local/bin/python2.7  # さっきインストールした作業用Python
```

```/etc/ld.so.conf
/usr/local/lib
```

```
ldconfig
```

### 設定

```/etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonPath /home/webapp/.virtualenvs/project_name/lib/python2.7/site-packages
```

```/etc/httpd/conf.d/project_name.conf
<VirtualHost *:80>
    ServerName simpledjango
    ErrorLog /var/log/httpd/simpledjango.error_log
    CustomLog /var/log/httpd/simpledjango.access_log combined
    AddDefaultCharset UTF-8

    <Directory "/home/webapp/project_name">
        AllowOverride None
    </Directory>

    WSGIScriptAlias / /home/webapp/project_name/wsgi/production.py

    Alias /static/admin /home/webapp/.virtualenvs/project_name/lib/python2.7/site-packages/django/contrib/admin/static/admin
    Alias /static /home/webapp/project_name/statics/
</VirtualHost>
```

- Note: アプリごとにvirtualenv環境を分けるにはこちらの方法を利用すると良いかもしれません → [mod_wsgiでアプリごとにvirtualenv環境を設定する](http://clngn.hatenablog.com/entry/20120407/1333776357)

- Note: ソースを置くディレクトリによっては403エラーが出るかもしれません。その場合は`chmod 705 /home/webapp/`など、権限を変更しておきます

## mysqlのインストール

```
yum install mysql-server
yum install mysql-devel
```

```/etc/my.conf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0

character_set_server=utf8
default-storage-engin=InnoDB
innodb_file_per_table

[mysql]
default-character-set=utf8

[mysqldump]
default-character_set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
```

```
service mysqld start
mysql_secure_installation
chkconfig mysqld on
```

## アプリを動かす準備

- Note: pipでインストールするものはrequirements.txtなどに列挙しておき`pip install -r requirements.txt`のように実行した方が良いと思います

```
cd ~/project_name
workon project_name
```

```
pip install MySQL-python
pip install django
```

```
python manage.py migrate --run-syncdb --settings=settings.production
```

最後にブラウザからアクセスしてみる