VPS のセットアップ

Sorry, Japanese only.

OS は Cent OS 6 の 64 bit 版を想定しています. VPS のセットアップメモですが,Cent OS 共通の話題も多く含まれています.なお,セキュリティ上の都合により一部は伏せさせていただいております.

項目 説明
OS Cent OS 6 64 bit
Disk 50 GB
Memory 512 MB
VPS Osukini Server LT
最終更新 11/December/2012

自分の覚書として書いているので安全性や完全性については保証いたしかねます.

初期セットアップ

Osukini Server を契約後,OS の再インストールから最小セットアップを選択する.今回は標準的に使われる Apache を使わず, MySQL もとりあえずは必要ないので一からセットアップすることにする.

自分のユーザーの作成

useradd -m USERNAME
passwd USERNAME

USERNAMEは適宜自分の名前に変更する.二行目でパスワードを設定する.

SSH の設定

  1. ローカルで SSH key を作成
    • ssh-keygen -t rsa
  2. SSH key を登録
    • ローカルの ~/.ssh/id_rsa.pub をリモートの ~/.ssh/authorized_keys に追記
    • authorzied_keysが外から見えない Permission にしておく
    • ログインし直して正しく動くことを確認.リモートのパスワードを聞かれずにログインできればOK.秘密鍵のパスワードは聞かれる
  3. パスワードによるログインを禁止.以下を追記する.(コメントを修正でもOK)

    PasswordAuthentication no
    ChallengeResponseAuthentication no
    
  4. sshd を再起動してパスワードでログイン出来ないことを確認.

    • このときに現在の接続を切らずに確認しないと二度とログインできなくなるかもしれないので要注意.
    • sshd の再起動は service sshd restart
    • 存在しないユーザー名でログインしようとして Permission denied (publickey). と表示されれば成功.
    • ついでにポート番号を 22 番から変更しておくと良い.ただし, iptables の変更を忘れずに.

自動アップデートの設定

セキュリティアップデートは自動でインストールしておくのが良い.

# yum install yum-cron
# service yum-cron start
# chkconfig yum-cron on

sudo の設定

普段は root にならないほうが望ましいので, sudo を用いて必要なときだけ root になるようにする.

# visudo

%wheel ALL=(ALL) ALL の行のコメントを外す.#がコメントなので,それを消せば良い.

# gpasswd -a USERNAME wheel

USERNAME は自分のユーザー名にして実行する.これでグループ wheelUSERNAME を追加したことになる.

もし,以下の設定でソースコードからインストールしたソフトウエアをsudoを使って実行したい場合には/usr/local/binsecure_pathに加えておく必要がある.

Defaults    secure_path = /usr/local/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin

のように書き換える.

各種ソフトウエアのインストール

開発ツール

最小セットアップでは開発ツールが一切入っていないので最低限のものをインストールする.

# yum install gcc gcc-c++ make

EPEL

Extra Packages for Enterprise Linux

Cent OS はパッケージ管理システムから使えるパッケージが少ないので, EPEL でパッケージを追加する.

$ curl -O http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-7.noarch.rpm
$ sudo rpm -ivh epel-release-6-7.noarch.rpm

paco

paco - a source code pacKAGE oRGANIZER for Unix/Linux

paco はソースコードからインストールしたソフトウエアを管理してくれる. 当然ながらソースコードから入れたソフトウエアは自動アップデートの対象にはならない.

EPEL に収録されているのでインストールは簡単.

$ yum install paco

インストール済みのソフトウエアの確認は paco -ai でできる.

tmux

tmux

tmux は GNU screen の代替ソフトウエアで縦分割や高速な動作を特徴としている. tmux を利用するためには libevent も必要なので,インストールする.

EPEL でも利用可能なので簡単に済ますならば yum install tmux でインストールできる.ただ,すこし古いのでここではソースコードからインストールする.

$ tar xzf libevent-2.0.21-stable.tar.gz
$ cd libevent-2.0.21-stable
$ ./configure
$ make
$ sudo /usr/local/bin/paco -D make install


$ tar xzf tmux-1.7.tar.gz
$ cd tmux-1.7
$ ./configure
$ make
$ sudo /usr/local/bin/paco -D make install

これだけだと,tmux の起動時にtmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directoryと言われるのでさらに以下の設定をする.

/etc/ld.so.conf.d/local.confを開き

/usr/local/lib

と記述する.最後にsudo ldconfigを実行し,libevent-2.0.so.5を見つけられるようにする.

Python 2.7

Python Programming Language

Cent OS 6 の Python は少し古いので最新版をインストールする. 最初にビルドに必要な依存ライブラリをいくつかインストールしている.GUI関係はインストールしていない.

$ yum install bzip2-devel readline-devel zlib-devel sqlite-devel openssl-devel gdbm-devel
$ curl -O http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
$ tar xjf Python-2.7.3.tar.bz2
$ cd Python-2.7.3
$ ./configure
$ make
$ sudo paco -D make install
$ curl -O http://python-distribute.org/distribute_setup.py
$ sudo /usr/local/bin/python distribute_setup.py
$ sudo /usr/local/bin/easy_install pip

最後の方で distribute や pip もインストールしている.これによって簡単に 3rd-party のライブラリがインストールできる.

ufw

ufw - Uncomplicated Firewall

Firewall の iptables は難解なので簡単にセットアップできる ufw を使う. Pythonのセットアップを終えておくこと.

$ tar xzf ufw-0.33.tar.gz
$ sudo python setup.py install
$ sudo chmod -R g-w /etc/default/ufw /lib/ufw/ufw-init /etc/ufw/ /usr/local/sbin/ufw

起動スクリプトをインストール

$ sudo cp /lib/ufw/ufw-init /etc/init.d/ufw

/etc/init.d/ufw を開き,冒頭のコメントの最後に# chkconfig: - 95 04を追記する.

最後に設定を行って仕上げ

$ sudo ufw limit SSH
$ sudo service iptables stop
$ sudo service ufw start
$ sudo chkconfig iptables off
$ sudo chkconfig ufw on

nginx

nginx

Webサーバーとして最も有名なのは Apache だが,それほどスペックの高くないサーバーではより軽量な nginx の方が良い.動的ページを動かさなければセットアップも nginx の方が簡単だが動的ページは自力では動かせないので別のソフトウエアの助けを借りることになる(uWSGI など).

$ curl -O http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sudo rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sudo yum install nginx
$ sudo service nginx start
$ sudo chkconfig nginx on

Firewall でポートを開けておくのを忘れない. ufw なら ufw allow WWW, Cent OS 6 標準の場合には sudo system-config-firewall-tui で設定する. 設定ファイルは /etc/nginx/ 以下にあり,設定ファイルの検証は nginx -t でできる.

Supervisor

Supervisor: A Process Control System

Supervisor はスクリプトをデーモン化するためのソフトウエア.次のセクションの RhodeCode や uWSGI などを常時起動させるために使うと便利. Python を使っているので先に Python のインストールを終えておくこと. EPEL にも収録されているので yum install supervisor でもインストールできる.

$ sudo pip install supervisor

インストールは一瞬だが,SuperVisor 自体をデーモン化してあげる必要がある.ついでに必要なファイルを配置する. EPEL でインストールした場合には以下のファイルコピーは不要.

$ sudo cp /usr/local/lib/python2.7/site-packages/supervisor/skel/sample.conf /etc/supervisord.conf

以下の内容を/etc/init.d/supervisordに保存する. EPEL にはからインストールした場合には不要.EPEL に含まれていたのものをベースにしている.

#!/bin/bash
#
# supervisord   This scripts turns supervisord on
#
# Author:       Y.Okamura (update for pip installed supervisor)
#               Mike McGrath (based off yumupdatesd)
#
# chkconfig:    - 95 04
#
# description:  supervisor is a process control utility.  It has a web based
#               xmlrpc interface as well as a few other nifty features.
# processname:  supervisord
# config: /etc/supervisord.conf
# pidfile: /var/run/supervisord.pid
#

# source function library
. /etc/rc.d/init.d/functions

RETVAL=0

supervisord="/usr/local/bin/supervisord"
PIDFILE="/var/run/supervisord.pid"
CONFIG="/etc/supervisord.conf"

start() {
        echo -n $"Starting supervisord: "
        $supervisord -j "$PIDFILE" -c "$CONFIG"
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord
}

stop() {
        echo -n $"Stopping supervisord: "
        killproc supervisord
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/supervisord
}

restart() {
        stop
        start
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|force-reload|reload)
        restart
        ;;
  condrestart)
        [ -f /var/lock/subsys/supervisord ] && restart
        ;;
  status)
        status supervisord
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
        exit 1
esac

exit $RETVAL

次にサービスを有効化しておしまい.

$ sudo service supervisord start
$ sudo chkconfig supervisord on

RhodeCode

RhodeCode

RhodeCode は GithubBitBucket のようなリポジトリ管理システムのオープンソース実装.

git は yum でもインストールできるが, RhodeCode で使うためにはソースコードから入れたほうが良い. また,RhodeCode には専用のユーザーを追加して,そのユーザーで動かすことが推奨される. Python を使っているので先に Python のインストールを終えておくこと.

$ sudo yum install curl-devel expat-devel perl-ExtUtils-MakeMaker gettext-devel asciidoc xmlto
$ tar xzf git-1.8.0.1.tar.gz
$ make configure
$ ./configure --prefix /usr/local/ --without-tcltk
$ make all doc
$ sudo paco -D make install install-doc install-html
$ sudo pip install virtualenv
$ sudo useradd -rm -d /var/rhodecode -g nobody rhodecode

virtualenv は RhodeCode の環境を独立させるために使う. RhodeCode をインストールすると沢山のモジュールがバージョン指定でインストールされるが, virtualenv を使えば他の環境に影響を与えずにすむ. ここから専用ユーザーで作業する.

$ sudo su - rhodecode
$ virtualenv rhodecode
$ . ~/rhodecode/bin/activate
$ pip install rhodecode

これでインストールが終わるのでセットアップに移る.セットアップはドキュメントを参照する.

$ paster make-config RhodeCode production.ini
$ mkdir repo
$ paster setup-rhodecode production.ini

これでリポジトリの場所を聞かれたら/var/rhodecode/repoと答えれば OK

次のコマンドを実行すると立ち上がる.

$ paster serve production.ini

ローカルで ssh USERNAME@VPS-ADDR -L 5000:localhost:5000 としてリモートの5000番ポートをローカルの5000番ポートに Port Forwarding することでhttp://127.0.0.1:5000/で試すことができる.恒久的に起動させるためには Supervisor を使うと簡単で,以下の内容を/etc/supervisord.confに追記する.

[program:rhodecode]
command=/var/rhodecode/rhodecode/bin/paster serve /var/rhodecode/production.ini
autostart=true
autorestart=unexpected
user=rhodecode
stdout_logfile=/var/rhodecode/stdout.log
stderr_logfile=/var/rhodecode/stderr.log
directory=/var/rhodecode

sudo supervisorctl rereadで読み込んで実行すればデーモンとして実行される. nginx での設定例は以下の通り.proxy.confドキュメントにある.

# HTTPS server
#

upstream rc {
    server 127.0.0.1:5000;
}

server {
    listen       443;
    server_name  yourserver;

    ssl                  on;
    ssl_certificate      cert.pem;
    ssl_certificate_key  cert.key;

    ssl_session_timeout  5m;

    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /rhodecode {
        alias /var/rhodecode/rhodecode/lib/python2.7/site-packages/rhodecode/public;
        satisfy any;
        auth_basic           "closed site";
        auth_basic_user_file /somewhere/.htpasswd;

        try_files $uri @rhode;
    }

    location @rhode {
        proxy_pass      http://rc;
        include         /etc/nginx/proxy.conf;
    }
}

この例では SSL を使用し,さらにrhodecodeというディレクトリのなかにRhodeCodeを設置している.このようにサブディレクトリに設置する場合にはproduction.ini[filter:proxy-prefix]の3行下をprefix = rhodecodeとして,さらに[app:main]の2行下のfilter-with = proxy-prefixのコメントを外す.こうすることで RhodeCode をサブディレクトリに設置できる.

munin

munin はシステムの状態を監視するためのツール.インストールはyum install munin プラグインは/etc/munin/pluginsに配置されている.必要なものを取捨選択しておく.

munin-nodeの開始

sudo service munin-node start
sudo chkconfig munin-node on

Cronは自動的に登録されるので手動で登録する必要は無い.最後に適切に/etc/munin/munin.confを書き換えておしまい.