CentOS 6.7 に Nginx、HHVM、MariaDB をインストールし、WordPress を動かす。


[お名前.com の VPS](http://www.onamae-server.com/vps/) の [メモリ 2G プラン](http://www.onamae-server.com/vps/kvm/order/#!plan=vps_check01) に標準 OS の CentOS 6.5 を使ってサーバーのセットアップをしています。

インフラ初心者が纏めているため、信用しないでください（笑）
この記事を参考にセットアップしたことによって被った損害・損失に対し、いかなる場合でも一切の責任を負いませんのでご了承ください。あくまでも自己責任でお願いします。

ツッコミやアドバイス、コメントでお待ちしています !

## CentOS のセットアップ

### アップデート

```bash
$ yum clean all && \
yum -y update && \
yum clean all && \
yum -y upgrade && \
yum clean all && \
cat /etc/redhat-release
```

### 日本語に対応

言語パッケージをグループインストール。

```bash
$ yum -y groupinstall "Japanese Support"
```

設定ファイルを編集。

```bash
$ vi /etc/sysconfig/i18n
```

下記のように変更。

```
LANG="ja_JP.UTF-8"
SUPPORTED="ja_JP.UTF-8:ja_JP:ja"
SYSFONT="latarcyrheb-sun16"
```

設定を反映させる。

```bash
$ source /etc/sysconfig/i18n
```

### vim をインストール

```bash
$ sudo yum -y install vim-enhanced && \
sudo mv /bin/vi /bin/vim-tiny && \
sudo ln -s /usr/bin/vim /bin/vi
```

#### エイリアスを追加

```bash
$ vi /etc/bashrc
# alias
alias vi='vim'

$ source /etc/bashrc
```

#### 行番号を表示

```bash
$ vi /etc/vimrc
```

下記を追加。

```
set number
```

`/etc/vimrc` はシステム設定なので、行番号を表示を追加くらいに留めておくのがよい。
設定ファイルの場所は、以下の通り。

```
   システム vimrc: "/etc/vimrc"
　   ユーザ vimrc: "$HOME/.vimrc"
第 2 ユーザ vimrc: "~/.vim/vimrc"
　    ユーザ exrc: "$HOME/.exrc"
```

#### Nginx ファイルを Syntaxhighlight するようにする

nginx.vim ファイルをダウンロードし、ファイルタイプを追加する。


```bash
$ sudo mkdir -p ~/.vim/syntax && \
cd ~/.vim/syntax && \
sudo wget https://raw.githubusercontent.com/evanmiller/nginx-vim-syntax/master/syntax/nginx.vim && \
vi ~/.vim/filetype.vim
```

下記をペースト。

```
au BufRead,BufNewFile /etc/nginx/*,/etc/nginx_old/*,/usr/local/nginx/conf/* if &ft == '' | setfiletype nginx | endif
```


### 作業用ユーザーを作成

```bash
$ useradd exampleuser && \
passwd exampleuser && \
usermod -G wheel exampleuser && \
id exampleuser
```

#### 作業用ユーザーの公開鍵ファイルの作成

ローカル PC で、秘密鍵と公開鍵のペアキーを作成。
※ conoha の部分は適当に読み替えてください。

```bash
# 秘密鍵を生成
$ openssl genrsa -des3 -out ~/.ssh/conoha_rsa 2048

# パーミッションの変更
$ chmod 600 ~/.ssh/conoha_rsa

# 公開鍵を生成
$ ssh-keygen -y -f ~/.ssh/conoha_rsa > ~/.ssh/conoha_rsa.pub

# 鍵を登録する
$ ssh-add -K ~/.ssh/conoha_rsa

# 公開鍵をクリップボードにコピー
$ pbcopy < ~/.ssh/conoha_rsa.pub
```

#### リモートサーバーに公開鍵を設置

```bash
$ sudo mkdir -p /home/exampleuser/.ssh/ && \
sudo vi /home/exampleuser/.ssh/authorized_keys
```

ここで、先ほどクリップボードにコピーした公開鍵をペーストし保存。
保存後、.ssh ディレクトリ、authorized_keys の所有権やアクセス権を変える。

```bash
$ sudo chown exampleuser:exampleuser /home/exampleuser/.ssh/ && \
sudo chmod 700 /home/exampleuser/.ssh/ && \
sudo chown exampleuser:exampleuser /home/exampleuser/.ssh/authorized_keys && \
sudo chmod 400 /home/exampleuser/.ssh/authorized_keys
```

### wheel グループのメンバーのみ root になれるようにする

```bash
$ vi /etc/pam.d/su
auth required pam_wheel.so use_uid <- コメントアウトを外す

$ vi /etc/login.defs
SU_WHEEL_ONLY yes                  <-最後の行に追加
```

### sudo コマンドの設定

```bash
$ visudo
# %wheel ALL=(ALL) ALL            <- sudo コマンドにパスワードを必要とする場合 # を外す
# %wheel ALL=(ALL) NOPASSWD: ALL  <- sudo コマンドにパスワードを必要としない場合 # を外す
```

### ログイン認証の方法と SSH ポート番号を変更

```bash
$ vi /etc/ssh/sshd_config
Port 1002                              # SSH のポート番号を任意に変更（ufw で指定したポート番号）
Protocol 2                              # SSH のプロトコルを SSH2 のみにする
SyslogFacility AUTHPRIV                 # /var/log/secure に sshd のログを出力
LogLevel VERBOSE                        # 出力するログの出力レベル
PermitRootLogin no                      # root でのログインを拒否
MaxAuthTries 2                          # 認証の試行回数を制限
PubkeyAuthentication yes                # 公開鍵での認証を許可
AuthorizedKeysFile .ssh/authorized_keys # 公開鍵の設置場所をユーザディレクトリ配下の .ssh/authorized_keys に変更
PasswordAuthentication no               # パスワード認証の可否
PermitEmptyPasswords no                 # パスワードが設定されていないアカウントの可否
ChallengeResponseAuthentication no      # チャレンジ/レスポンス認証を無効化
ClientAliveInterval 300                 # 5分間応答がなければ生存確認パケットを送信
ClientAliveCountMax 2                   # 2回連続で応答がなければセッションを切断
AllowTcpForwarding no                   # SSHポートフォワーディングの禁止
AllowStreamLocalForwarding no           # Unixドメインソケットフォワーディングを禁止
GatewayPorts no                         # リモートホストからフォワードされたポートへの接続をループバックアドレスのみに制限
PermitTunnel no                         # レイヤー2/3トンネリングを禁止
```

設定を反映させる。

```bash
$ service sshd restart
```

### ファイヤーウォールの設定（ポート番号の変更）

iptables がインストールされているか確認する。

```bash
$ rpm -qa iptables
バージョン情報が表示されればインストールされている
```

iptables をインストールする。

```bash
$ yum -y install iptables iptables-ipv6
```

#### iptables の設定

```bash
$ vi /etc/sysconfig/iptables
$ VGd
```

下記をペースト。

```
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP, SSL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443   -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT
```

設定を反映させる。

```bash
$ service iptables restart
```

#### ip6tables の設定

```bash
$ vi /etc/sysconfig/ip6tables
$ VGd
```

下記をペースト。

```bash
*filter :INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP, SSL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443   -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 546 --sport 547 -s fe80::/10 -d fe80::/10 -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited

COMMIT
```

設定を反映させる。

```bash
$ service ip6tables restart
```

### 新しく作成したユーザーでサーバーにログインできるか確認

この作業時は、ログイン中の root ユーザーは絶対にログアウトさせないこと。
ログアウトしてしまうと、今までの設定に誤りがあった場合に取り返しがつかなくなる。

* ssh or sftp ログインができる
* su or sudo コマンドが使用できる

上記 2 点を確認する。
失敗する場合は設定が間違っている。
2 点の確認が成功した場合、ログイン中だった root ユーザーをログアウトさせ
root ユーザーでログインできない事を確認する。

以降の作業は新規に作成したユーザーで作業を行う。

### 不要なデーモンを停止

下記コマンドで起動中のデーモンを確認し不要なサービスを停止させる。

```bash
$ chkconfig --list | grep 3:on
```

[acpid](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-2)
ホスト側からシャットダウンできなくなるので on にしておく。
また、カスタムOS をインストールした場合は acpid がインストールされているか確認する。
> [ConohaのカスタムOSにacpidをインストール](http://www.yubaz.com/?cat=4)

[blk-availability](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-5)

```bash
$ sudo service blk-availability stop && \
sudo chkconfig blk-availability off
```

[cpuspeed](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-6)

```bash
$ sudo service cpuspeed stop && \
sudo chkconfig cpuspeed off
```

[haldaemon](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-8)

```bash
$ sudo service haldaemon stop && \
sudo chkconfig haldaemon off
```

[mdmonitor](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-14)

```bash
$ sudo service mdmonitor stop && \
sudo chkconfig mdmonitor off
```

[messagebus](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-15)

```bash
$ sudo service messagebus stop && \
sudo chkconfig messagebus off
```

[netfs](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-17)

```bash
$ sudo service netfs stop && \
sudo chkconfig netfs off
```

[quota_nld](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-23)

```bash
$ sudo service quota_nld stop && \
sudo chkconfig quota_nld off
```

[rdisc](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-24)

```bash
$ sudo service rdisc stop && \
sudo chkconfig rdisc off
```

[svnserve](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-31)

```bash
$ sudo service svnserve stop && \
sudo chkconfig svnserve off
```

[udev-post](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-33)

```bash
$ sudo service udev-post stop && \
sudo chkconfig udev-post off
```

[yum-updateonboot](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-34)

```bash
$ sudo service yum-updateonboot stop && \
sudo chkconfig yum-updateonboot off
```

yum-updatesd
※ yum-cron を使用するため停止させる。

```bash
$ sudo service yum-updatesd stop && \
sudo chkconfig yum-updatesd off
```

### yum の自動アップデート

```bash
$ sudo yum -y install yum-cron
```

yum-cron 設定方法はこちらの記事で !
[yum を使って システムアップデートを行う (自動化も)](http://server-setting.info/centos/firststep.html)

#### アップデート不要なパッケージを指定

```bash
$ vi /etc/yum.conf
````

下記をペースト。

```bash
[main]
exclude=gcc* kde* openssh* kernel* php* mysql*
````

#### yum-cron の設定

```bash
$ vi /etc/sysconfig/yum-cron
```

#### yum-cron の起動

```bash
$ sudo service yum-cron start
$ sudo chkconfig yum-cron on
```

### TCP カーネルパラメータの変更

ipv6 が不要であれば、その辺りは各々調節してください。

```bash
sysctl -w vm.swappiness=0 && \
sysctl -w net.ipv4.ip_local_port_range="18000 65535" && \
sysctl -w net.ipv4.tcp_tw_reuse=1 && \
sysctl -w net.ipv4.tcp_fin_timeout=10 && \
sysctl -w net.ipv4.tcp_max_syn_backlog=1024 && \
sysctl -w net.core.somaxconn=65535 && \
sysctl -w net.ipv6.conf.all.disable_ipv6=1 && \
sysctl -w net.ipv6.conf.default.disable_ipv6=1 && \
sysctl -w net.ipv6.conf.lo.disable_ipv6=1
```

設定ファイルの編集。

```bash
$ sudo cp /etc/sysctl.conf /etc/sysctl.conf_old && \
sudo vi /etc/sysctl.conf
```

下記を最後の行に追加。

```
vm.swappiness = 0
net.ipv4.ip_local_port_range = 18000 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_syn_backlog = 1024
net.core.somaxconn = 65535
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
```

設定を反映させる。

```bash
$ sysctl -p
```

**参考**
[Nginxのパフォーマンスを極限にするための考察](http://qiita.com/iwai/items/1e29adbdd269380167d2)
[ローカルポートを食いつぶしていた話](http://d.hatena.ne.jp/download_takeshi/20091013/1255443592)
[Linuxカーネルパラメータ一覧・標準設定（CentOS 6）](http://hesonogoma.com/linux/kernel_parameter_list_centos6.html)

### prelink を無効化

```bash
$ sudo vi /etc/sysconfig/prelink
PRELINKING=no

$ sudo /usr/sbin/prelink -ua
```

### SELinux を無効化

```bash
$ sudo vi /etc/selinux/config
SELINUX=disabled
```

### root 宛のメールを転送する

```bash
$ sudo sed -i '/^root:/d' /etc/aliases && \
sudo vi /etc/aliases
```

「# Person who should get root's mail」の下にある「root:」の値を書き換える。

```bash
root: hoge@example.com
```

設定を反映させる。

```bash
$ sudo newaliases && \
sudo echo test | mail root
```

### レポジトリの追加

```bash
$ rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 && \
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

$ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi && \
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

$ rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB && \
vi /etc/yum.repos.d/mariadb.repo

# 以下を記述
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1.6/centos6-amd64
enabled=0
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

## ライブラリを諸々インストール

```bash
# $ yum -y install http://vault.centos.org/6.5/cr/x86_64/Packages/kernel-devel-2.6.32-504.el6.x86_64.rpm

# お名前.com VPS 標準OS CentOS6.5 では一旦 remove
$ yum -y remove libyaml libyaml-devel

$ yum -y install \
    boost-devel \
    cmake cmake-devel \
    gperf gperf-devel \
    git git-devel \
    libmemcached libmemcached-devel \
    libevent libevent-devel \
    libcurl libcurl-devel \
    libxml2 libxml2-devel \
    libxslt libxslt-devel \
    libicu libicu-devel \
    libcap libcap-devel \
    libedit libedit-devel \
    libgcc libgcc.i686 \
    libjpeg-turbo libjpeg-turbo-devel \
    libpng libpng-devel \
    libyaml libyaml-devel \
    gcc-c++ \
    glibc-devel glibc-devel.i686 \
    unixODBC unixODBC-devel \
    sqlite sqlite-devel \
    expat expat-devel \
    bzip2 bzip2-devel \
    openssl openssl-devel \
    openldap openldap-devel \
    readline readline-devel \
    elfutils-libelf elfutils-libelf-devel \
    binutils binutils-devel \
    freetype freetype-devel \
    ImageMagick ImageMagick-devel \
    gzip gzip-devel \
    tar tar-devel \
    perl perl-devel \
    zip zip-devel \
    unzip unzip-devel \
    wget wget-devel

$ yum -y --enablerepo=epel install \
    libmcrypt libmcrypt-devel \
    gperftools gperftools-devel

$ yum -y install http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm

$ yum -y install --enablerepo=epel,remi make pcre pcre-devel gd-devel zlib-devel GeoIP-devel libmemcache automake autoconf re2c

# 鬼車 のインストール
$ cd /tmp && \
sudo wget http://www.geocities.jp/kosako3/oniguruma/archive/onig-5.9.5.tar.gz -O onig-current.tar.gz && \
sudo mkdir onig-current && \
tar -zxvf onig-current.tar.gz -C /tmp/onig-current --strip-components=1 && \
cd ./onig-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/onig-current.tar.gz && \
rm -rf /tmp/onig-current/
```

## OPcache、Memcached、PHP をインストール

```bash
yum -y install --enablerepo=remi,remi-php56 \
    gd-last gd-devel \
    php php-devel \
    php-common \
    php-mbstring \
    php-pdo \
    php-cli \
    php-gd \
    php-fpm \
    php-mysql php-mysqlnd \
    php-xml \
    php-pear php-pear-DB php-pear-Auth-* php-pecl-crypto \
    php-odbc \
    php-xmlrpc \
    php-mcrypt \
    php-soap \
    php-tidy \
    php-opcache \
    php-pecl-memcached memcached
```

## APCu をインストール

```bash
$ cd /tmp/ && \
sudo wget https://github.com/krakjoe/apcu/archive/v4.0.7.tar.gz -O apcu-current.tar.gz && \
sudo mkdir apcu-current && \
sudo tar -zxvf apcu-current.tar.gz -C /tmp/apcu-current --strip-components=1 && \
cd /tmp/apcu-current && \
phpize && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/apcu-current.tar.gz && \
rm -rf /tmp/apcu-current/
```

## MariaDB をインストール

```bash
$ yum -y install --enablerepo=mariadb \
    MariaDB-devel \
    MariaDB-client \
    MariaDB-server
```

### MariaDB を起動

```bash
$ service mysql start
```

### MariaDB の初期設定

```bash
$ mysql_secure_installation

Enter current password for root (enter for none):  <- ENTER
Set root password? [Y/n]                           <- ENTER
New password:                                      <- パスワードを入力
Re-enter new password:                             <- パスワードを再入力
Remove anonymous users? [Y/n]                      <- ENTER
Disallow root login remotely? [Y/n]                <- ENTER
Remove test database and access to it? [Y/n]       <- ENTER
Reload privilege tables now? [Y/n]                 <- ENTER
```

### MariaDB を一旦終了させる

```bash
$ service mysql stop
```

### 設定ファイルの作成

サンプルファイルをコピーする。

```bash
$ sudo cp /usr/share/mysql/my-medium.cnf /etc/my.cnf.d/my.cnf
```

|サンプルファイルの場所|用途|
|:----|:----|
|/usr/share/mysql/my-small.cnf|64MB RAM 以下の小規模サーバー向け|
|/usr/share/mysql/my-medium.cnf|32〜64MB RAM の MySQL 専用サーバー、または 128MB RAM 程度のサーバー向け|
|/usr/share/mysql/my-large.cnf|512MB RAM 程度の MySQL 専用サーバー向け|
|/usr/share/mysql/my-huge.cnf|1～2GB RAM 程度の MySQL 専用サーバー向け|
|/usr/share/mysql/my-innodb-heavy-4G.cnf|4GB RAM 程度で InnoDB ストレージエンジンのみを使用する大規模 MySQL 専用サーバー向け|

#### カスタマイズ設定を追加

```bash
$ sudo mv /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf_old && \
sudo vi /etc/my.cnf.d/server.cnf
```

下記をペースト。

```
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#pid-file=/var/lib/mysql/mysql.pid
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8
explicit_defaults_for_timestamp=1
default-storage-engine=InnoDB

innodb_strict_mode
innodb_file_per_table
innodb_use_sys_malloc
innodb_buffer_pool_size=128M
innodb_write_io_threads=4
innodb_read_io_threads=4
innodb_thread_concurrency=16
innodb_log_file_size=16M
innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT
innodb_fast_shutdown=0
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1

query_cache_size=128M
query_cache_limit=2M
query_cache_min_res_unit=4k
query_cache_type=1

tmp_table_size=128M
max_heap_table_size=128M

table_open_cache=1024
max_allowed_packet=1M
sort_buffer_size=512K
read_buffer_size=256K
read_rnd_buffer_size=256K
join_buffer_size=256K
key_buffer_size=16M

max_connections=256
thread_cache_size=256

slow_query_log
slow_query_log_file=/var/log/mysqld-slow.log
long_query_time=1

log-error=/var/log/mysqld.log

wait_timeout=60

plugin-load=handlersocket.so

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

### データベースのチューニング

```bash
$ cd ~/
$ wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
$ perl <(wget -q -O - mysqltuner.pl)
```
[MySQLTunerでMySQLのチューニングを診断する方法](http://www.e-agency.co.jp/column/20121220.html)

### ヒント

```bash
# データベース一覧
MariaDB [(none)]> show databases;

# ユーザー一覧
MariaDB [(none)]> select Host, User, Password from mysql.user;

# 指定のデータベースのテーブル一覧
MariaDB [(none)]> SHOW TABLES FROM tablename;
```

## Nginx をインストール

Nginx をソースコードからインストールします。
執筆時点での最新安定版は、1.8.0です。

### Nginx ユーザーを作成

```bash
$ useradd --shell /sbin/nologin nginx && \
id nginx
```

### ソースコードのダウンロード
```bash
$ cd /tmp/ && \
sudo wget http://nginx.org/download/nginx-1.8.0.tar.gz -O nginx-current.tar.gz && \
sudo mkdir nginx-current && \
sudo tar -zxvf nginx-current.tar.gz -C /tmp/nginx-current --strip-components=1 && \
cd /tmp/nginx-current
```

### NGX Cache Purge

```bash
$ sudo wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz -O ngx_cache_purge.tar.gz && \
sudo mkdir ngx_cache_purge && \
sudo tar -zxvf ngx_cache_purge.tar.gz -C /tmp/nginx-current/ngx_cache_purge --strip-components=1 && \
sudo rm -rf ngx_cache_purge.tar.gz
```

### OpenSSL

```bash
$ sudo wget http://www.openssl.org/source/openssl-1.0.2d.tar.gz -O openssl.tar.gz && \
sudo mkdir openssl && \
sudo tar -zxvf openssl.tar.gz -C /tmp/nginx-current/openssl --strip-components=1 && \
sudo rm -rf openssl.tar.gz
```

### NGX PageSpeed

```bash
$ git clone https://github.com/pagespeed/ngx_pagespeed.git && \
rm -rf ./ngx_pagespeed/.git && \
cd ./ngx_pagespeed && \
sudo wget https://dl.google.com/dl/page-speed/psol/1.9.32.6.tar.gz && \
sudo tar -zxvf 1.9.32.6.tar.gz && \
sudo rm -rf ./1.9.32.6.tar.gz
```

### ビルド

```bash
$ cd /tmp/nginx-current && \
sudo ./configure \
--prefix=/etc/sysconfig/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/subsys/nginx \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-debug \
--with-http_spdy_module \
--with-openssl=/tmp/nginx-current/openssl \
--add-module=/tmp/nginx-current/ngx_cache_purge \
--add-module=/tmp/nginx-current/ngx_pagespeed && \
sudo make && sudo make install && \
sudo rm -rf /tmp/nginx-current/ && \
sudo rm -rf /tmp/nginx-current.tar.gz
```

### フォルダの作成

```bash
$ sudo mkdir -m 755 -p /var/cache/nginx/ngx_pagespeed/ && \
sudo mkdir -m 755 -p /var/cache/nginx/ngx_pagespeed/ && \
sudo chown -R nginx:nginx /var/cache/nginx && \
sudo mkdir -m 755 -p /var/run/nginx/ && \
sudo chown nginx:nginx /var/run/nginx/ && \
sudo mkdir -m 755 -p /var/log/nginx/ngx_pagespeed/ && \
sudo chown -R nginx:nginx /var/log/nginx/ && \
sudo mkdir -m 755 -p /var/run/hhvm/ && \
sudo chown nginx:nginx /var/run/hhvm/ && \
sudo mkdir -m 755 -p /var/log/hhvm/ && \
sudo chown -R nginx:nginx /var/log/hhvm/ && \
sudo mkdir -m 755 -p /var/log/php-fpm/ && \
sudo chown -R nginx:nginx /var/log/php-fpm/
```

### 起動スクリプトの作成

```bash
$ vi /etc/init.d/nginx
```

下記をペースト。

```
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

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

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

sysconfig="/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/nginx"
pidfile="/var/run/nginx/${prog}.pid"

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f $sysconfig ] && . $sysconfig


start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p $pidfile $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest_q || return 6
    stop
    start
}

reload() {
    configtest_q || return 6
    echo -n $"Reloading $prog: "
    killproc -p $pidfile $prog -HUP
    echo
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

configtest_q() {
    $nginx -t -q -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

# Upgrade the binary with no downtime.
upgrade() {
    local oldbin_pidfile="${pidfile}.oldbin"

    configtest_q || return 6
    echo -n $"Upgrading $prog: "
    killproc -p $pidfile $prog -USR2
    retval=$?
    sleep 1
    if [[ -f ${oldbin_pidfile} && -f ${pidfile} ]];  then
        killproc -p $oldbin_pidfile $prog -QUIT
        success $"$prog online upgrade"
        echo
        return 0
    else
        failure $"$prog online upgrade"
        echo
        return 1
    fi
}

# Tell nginx to reopen logs
reopen_logs() {
    configtest_q || return 6
    echo -n $"Reopening $prog logs: "
    killproc -p $pidfile $prog -USR1
    retval=$?
    echo
    return $retval
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest|reopen_logs)
        $1
        ;;
    force-reload|upgrade)
        rh_status_q || exit 7
        upgrade
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    status|status_q)
        rh_$1
        ;;
    condrestart|try-restart)
        rh_status_q || exit 7
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|reload|configtest|status|force-reload|upgrade|restart|reopen_logs}"
        exit 2
esac
```

実行権限を付与する。

```bash
$ chmod +x /etc/init.d/nginx
```

### 設定ファイルを用意

[Amimoto の Nginx 設定ファイル](https://github.com/megumiteam/amimoto/tree/master/etc/nginx) を参考にするとよいと思います。
独自に用意している場合は、git clone などでリモートサーバーに持ってくると楽かもですね。

```bash
$ mv /etc/nginx/ /etc/nginx_old/ && \
cd /etc/ && \
git clone https://github.com/YOUR_USERNAME/nginx.git --depth=1 && \
rm -rf /etc/nginx/.git
```

`nginx.conf` の `worker_processes` と `worker_cpu_affinity` は CPU のコア数を基に設定する。
CPU のコア数を確認するには、以下のコマンドで確認できる。

```bash
$ grep processor /proc/cpuinfo |wc -l
```

コア数が 3 の場合は以下、`nginx.conf` の `worker_processes` と `worker_cpu_affinity` は以下のようになる。

```
worker_processes     3;
worker_cpu_affinity  001 010 100;
```

### Nginx の起動

一番最後に行う。

### ヒント

特定の URL のキャッシュを削除する。

```bash
$ find /var/cache/nginx/ -type f -exec grep -l "KEY: http://192.168.30.10/.*$" {} \; | xargs rm -f
```

## HHVM のインストール

以下手順は HHVM Github Wiki [Building and installing HHVM on CentOS 6.6](https://github.com/facebook/hhvm/wiki/Building-and-installing-HHVM-on-CentOS-6.6) 記載の手順と基本的に同じです。

### gcc のインストール

著者は、この方法でインストールに成功したことがないです。

```bash
$ cd /tmp && \
sudo wget ftp://ftp.gnu.org/gnu/gcc/gcc-5.2.0/gcc-5.2.0.tar.gz -O gcc-current.tar.gz && \
sudo mkdir gcc-current && \
sudo tar -zxvf gcc-current.tar.gz -C /tmp/gcc-current --strip-components=1 && \
cd /tmp/gcc-current
```

#### gmp

```bash
$ sudo wget https://gmplib.org/download/gmp-6.0.0/gmp-6.0.0.tar.bz2 -O gmp-current.tar.bz2 && \
sudo mkdir gmp && sudo tar -jxvf gmp-current.tar.bz2 -C /tmp/gcc-current/gmp --strip-components=1
```

#### mpfr

```bash
$ sudo wget http://www.mpfr.org/mpfr-current/mpfr-3.1.3.tar.bz2 -O mpfr-current.tar.bz2 && \
sudo mkdir mpfr && sudo tar -jxvf mpfr-current.tar.bz2 -C /tmp/gcc-current/mpfr --strip-components=1
```

#### mpc

```bash
$ sudo wget http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz -O mpc-current.tar.gz && \
sudo mkdir mpc && sudo tar -zxvf mpc-current.tar.gz -C /tmp/gcc-current/mpc --strip-components=1
```

#### isl

```bash
$ sudo wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/infrastructure/isl-0.15.tar.bz2 -O isl-current.tar.bz2 && \
sudo mkdir isl && sudo tar -jxvf isl-current.tar.bz2 -C /tmp/gcc-current/isl --strip-components=1
```

#### cloog

```bash
$ sudo wget http://bastoul.net/cloog/pages/download/cloog-0.18.4.tar.gz -O cloog-current.tar.gz && \
sudo mkdir cloog && sudo tar -zxvf cloog-current.tar.gz -C /tmp/gcc-current/cloog --strip-components=1
```

#### ビルド

```bash
$ sudo mkdir /tmp/gcc-build && cd /tmp/gcc-build && \
sudo ../gcc-current/configure --enable-languages=c,c++,fortran --enable-multilib --prefix=/usr/local/gcc
$ sudo make && sudo make install
```

#### 新バージョンに入れ替える

```bash
$ yum remove -y gcc gcc-c++ cpp
$ sudo mv /usr/bin/g++ /usr/bin/g++_old && \
sudo mv /usr/bin/c++ /usr/bin/c++_old && \
sudo ln -s -f /usr/local/gcc/bin/gcc /usr/bin/gcc && \
sudo ln -s -f /usr/local/gcc/bin/g++ /usr/bin/g++ && \
sudo ln -s -f /usr/local/gcc/bin/c++ /usr/bin/c++ && \
sudo ln -s -f /usr/local/gcc/bin/cpp /usr/bin/cpp && \
sudo ln -s -f /usr/local/gcc/bin/gfortran /usr/bin/gfortran && \
sudo ln -s -f /usr/local/gcc/bin/gcov /usr/bin/gcov && \
sudo cp /usr/local/gcc/lib64/libstdc++.so.6.0.20 /usr/lib64/. && \
sudo mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak && \
sudo ln -s -f /usr/lib64/libstdc++.so.6.0.20 /usr/lib64/libstdc++.so.6
```

### gcc のインストールその 2

```bash
$ sudo wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo && \
sudo yum -y install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++ && \
sudo mv /usr/bin/g++ /usr/bin/g++_old && \
sudo mv /usr/bin/c++ /usr/bin/c++_old && \
sudo mv /usr/bin/c++filt /usr/bin/c++filt_old && \
sudo mv /usr/bin/cpp /usr/bin/cpp_old && \
sudo mv /usr/bin/cc /usr/bin/cc_old && \
sudo mv /usr/bin/gcov /usr/bin/gcov_old && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/c++ /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/c++filt /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/cpp /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/g++ /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcc /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcc-ar /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcc-nm /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcc-ranlib /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcov /usr/bin/ && \
hash -r
```

#### gmp

```bash
$ cd /tmp && \
sudo wget https://gmplib.org/download/gmp-6.0.0/gmp-6.0.0.tar.bz2 -O gmp-current.tar.bz2 && \
sudo mkdir gmp-current && sudo tar -jxvf gmp-current.tar.bz2 -C /tmp/gmp-current --strip-components=1 && \
cd /tmp/gmp-current && \
sudo ./configure --enable-cxx && sudo make && sudo make install && \
rm -rf /tmp/gmp-current.tar.gz && \
rm -rf /tmp/gmp-current/
```

#### mpfr

```bash
$ cd /tmp && \
sudo wget http://www.mpfr.org/mpfr-current/mpfr-3.1.3.tar.bz2 -O mpfr-current.tar.bz2 && \
sudo mkdir mpfr-current && sudo tar -jxvf mpfr-current.tar.bz2 -C /tmp/mpfr-current --strip-components=1 && \
cd /tmp/mpfr-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/mpfr-current.tar.gz && \
rm -rf /tmp/mpfr-current/
```

#### mpc

```bash
$ cd /tmp && \
sudo wget http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz -O mpc-current.tar.gz && \
sudo mkdir mpc-current && sudo tar -zxvf mpc-current.tar.gz -C /tmp/mpc-current --strip-components=1 && \
cd /tmp/mpc-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/mpc-current.tar.gz && \
rm -rf /tmp/mpc-current/
```

#### isl

```bash
$ cd /tmp && \
sudo wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/infrastructure/isl-0.15.tar.bz2 -O isl-current.tar.bz2 && \
sudo mkdir isl-current && sudo tar -jxvf isl-current.tar.bz2 -C /tmp/isl-current --strip-components=1 && \
cd /tmp/isl-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/isl-current.tar.gz && \
rm -rf /tmp/isl-current/
```

#### cloog

```bash
$ cd /tmp && \
sudo wget http://bastoul.net/cloog/pages/download/cloog-0.18.4.tar.gz -O cloog-current.tar.gz && \
sudo mkdir cloog-current && sudo tar -zxvf cloog-current.tar.gz -C /tmp/cloog-current --strip-components=1 && \
cd /tmp/cloog-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/cloog-current.tar.gz && \
rm -rf /tmp/cloog-current/
```

### libtool のインストール

```bash
$ cd /tmp && \
sudo wget http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz -O libtool-current.tar.gz && \
sudo mkdir ./libtool-current && \
sudo tar -zxvf libtool-current.tar.gz -C /tmp/libtool-current --strip-components=1 && \
cd ./libtool-current && \
sudo ./configure && sudo make && sudo make install && \
sudo rm -rf /tmp/libtool-current/ && \
sudo rm -rf /tmp/libtool-current.tar.gz
```

### HHVM のダウンロード

```bash
$ cd /usr/local && \
git clone git://github.com/facebook/hhvm.git --depth=1 && \
cd hhvm && \
export CMAKE_PREFIX_PATH=/usr/local
```

### curl のインストール

```bash
# 下記 URL 先から適当にミラーを選んでください
# http://curl.haxx.se/latest.cgi?curl=tar.gz
$ cd /tmp && \
sudo wget http://curl.mirror.anstey.ca/curl-7.44.0.tar.gz -O curl-current.tar.gz && \
sudo mkdir ./curl-current && \
sudo tar -zxvf ./curl-current.tar.gz -C /tmp/curl-current --strip-components=1 && \
cd ./curl-current && \
./configure --enable-libcurl-option && sudo make && sudo make install && \
sudo rm -rf /tmp/curl-current/ && \
sudo rm -rf /tmp/curl-current.tar.gz
```

### Boost のインストール

```bash
$ cd /tmp && \
sudo wget http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz -O boost-current.tar.gz && \
sudo mkdir ./boost-current && \
sudo tar -zxvf boost-current.tar.gz -C /tmp/boost-current --strip-components=1 && \
cd ./boost-current && \
sudo ./bootstrap.sh && \
sudo ./b2 --layout=system install
$ export PATH=/usr/local/boost/include:$PATH && \
export PATH=/usr/local/boost/lib:$PATH && \
sed -i '/export PATH/i PATH=$PATH:/usr/local/boost/include' ~/.bash_profile && \
sed -i '/export PATH/i PATH=$PATH:/usr/local/boost/lib' ~/.bash_profile

# 上記で Path が通らない場合は以下を追加
$ export BOOST_INCLUDEDIR=/usr/local/boost/include:$BOOST_INCLUDEDIR && \
export LD_LIBRARY_PATH=/usr/local/boost/lib

export BOOST_ROOT=/usr/local/boost/:$BOOST_ROOT

export CMAKE_INCLUDE_PATH=$CMAKE_PREFIX_PATH/boost/include && \
export CMAKE_LIBRARY_PATH=$CMAKE_PREFIX_PATH/boost/lib

# 後始末
$ sudo rm -rf /tmp/boost-current/ && \
sudo rm -rf /tmp/boost-current.tar.gz
```

### libmemcached のインストール

```bash
$ cd /tmp && \
sudo wget https://launchpad.net/libmemcached/1.0/1.0.9/+download/libmemcached-1.0.9.tar.gz -O libmemcached-current.tar.gz && \
sudo mkdir ./libmemcached-current && \
tar -xzvf ./libmemcached-current.tar.gz -C /tmp/libmemcached-current --strip-components=1 && \
cd ./libmemcached-current && \
./configure --prefix=$CMAKE_PREFIX_PATH && sudo make && sudo make install && \
sudo rm -rf /tmp/libmemcached-current/ && \
sudo rm -rf /tmp/libmemcached-current.tar.gz
```

### JEMalloc のインストール

```bash
$ cd /tmp && \
sudo wget http://www.canonware.com/download/jemalloc/jemalloc-3.5.1.tar.bz2 -O jemalloc-current.tar.gz && \
sudo mkdir ./jemalloc-current && \
tar -xjvf jemalloc-current.tar.gz -C /tmp/jemalloc-current --strip-components=1 && \
cd ./jemalloc-current && \
./configure --prefix=$CMAKE_PREFIX_PATH && sudo make && sudo make install && \
sudo rm -rf /tmp/jemalloc-current/ && \
sudo rm -rf /tmp/jemalloc-current.tar.gz
```

### sqlite のインストール

```bash
$ cd /tmp && \
sudo wget http://ftp.osuosl.org/pub/blfs/conglomeration/sqlite/sqlite-autoconf-3081101.tar.gz -O sqlite-current.tar.gz && \
sudo mkdir ./sqlite-current && \
tar -zxvf sqlite-current.tar.gz -C /tmp/sqlite-current --strip-components=1 && \
cd ./sqlite-current && \
./configure --prefix=$CMAKE_PREFIX_PATH && sudo make && sudo make install && \
sudo rm -rf /tmp/sqlite-current/ && \
sudo rm -rf /tmp/sqlite-current.tar.gz
```

### OCaml のインストール

```bash
$ sudo wget http://download.opensuse.org/repositories/home:/ocaml/CentOS_6/home:ocaml.repo -O /etc/yum.repos.d/ocaml.repo && \
yum -y install ocaml
```

### TBB のインストール

```bash
$ yum -y install ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/zgyarmati:/hhphp/CentOS_CentOS-5/x86_64/tbb-4.0-2.6.x86_64.rpm
$ yum -y install ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/zgyarmati:/hhphp/CentOS_CentOS-5/x86_64/tbb-devel-4.0-2.6.x86_64.rpm
```

### glog のインストール

```bash
$ cd /tmp && \
sudo wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O glog-current.tar.gz && \
sudo mkdir glog-current && \
tar -zxvf glog-current.tar.gz -C /tmp/glog-current --strip-components=1 && \
cd ./glog-current && \
./configure && sudo make && sudo make install && \
sudo rm -rf /tmp/glog-current/ && \
sudo rm -rf /tmp/glog-current.tar.gz
```

### libdwarf のインストール

```bash
$ cd /tmp && \
sudo wget http://www.prevanders.net/libdwarf-20150310.tar.gz -O libdwarf-current.tar.gz && \
sudo mkdir libdwarf-current && \
tar -zxvf libdwarf-current.tar.gz -C /tmp/libdwarf-current --strip-components=1 && \
cd ./libdwarf-current && \
./configure && sudo make && \
sudo cp ./libdwarf/libdwarf.a /usr/lib64/ && \
sudo cp ./libdwarf/libdwarf.h /usr/include/ && \
sudo cp ./libdwarf/dwarf.h /usr/include/ && \
sudo rm -rf /tmp/libdwarf-current/ && \
sudo rm -rf /tmp/libdwarf-current.tar.gz
```

### HHVM のインストール

```bash
$ cd /usr/local/hhvm && \
git submodule update --init --recursive
$ sudo cmake .
$ sudo sed -i -e 's/$/..\/..\/..\/lib\/libmemcached.so/g' hphp/hhvm/CMakeFiles/hhvm.dir/link.txt
$ sudo make
$ export PATH=/usr/local/hhvm/hphp/hhvm:$PATH && \
sed -i '/export PATH/i PATH=$PATH:/usr/local/hhvm/hphp/hhvm' ~/.bash_profile
```

### 設定ファイルの作成

```bash
$ sudo mldir /etc/hhvm/ && \
sudo vi /etc/hhvm/server.hdf
```

下記をペースト。

```
PidFile = /var/run/hhvm/hhvm.pid

Server {
  Type = fastcgi
  FileSocket = /var/run/hhvm/hhvm.sock
  User = nginx
  Group = nginx
}

Log {
  Level = Warning
  AlwaysLogUnhandledExceptions = true
  RuntimeErrorReportingLevel = 8191
  UseLogFile = true
  UseSyslog = false
  File = /var/log/hhvm/error.log
  Access {
    * {
      File = /var/log/hhvm/access.log
      Format = %h %l %u % t \"%r\" %>s %b
    }
  }
}

Repo {
  Central {
    # Path = /var/log/hhvm/.hhvm.hhbc
    Path = /var/tmp/hhvm.hhbc
  }
}

MySQL {
  TypedResults = false
}
```

```bash
$ sudo vi /etc/hhvm/config.hdf
```

下記をペースト。

```
Log {
  Level = Warning
  AlwaysLogUnhandledExceptions = true
  RuntimeErrorReportingLevel = 8191
}

MySQL {
  TypedResults = false
}

Eval {
  JitASize = 67108864
  JitAStubsSize = 67108864
  JitGlobalDataSize = 22554432
}
```

### 起動スクリプトの作成

```bash
$ sudo vi /etc/init.d/hhvm
```

下記をペースト。

```
#!/bin/bash
#
# /etc/rc.d/init.d/hhvm
#
# Starts the hhvm daemon
#
# chkconfig: 345 26 74
# description: HHVM (aka the HipHop Virtual Machine) is an open-source virtual machine designed for executing programs written in Hack and PHP
# processname: hhvm

### BEGIN INIT INFO
# Provides: hhvm
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop hhvm
# Description: HHVM (aka the HipHop Virtual Machine) is an open-source virtual machine designed for executing programs written in Hack and PHP
### END INIT INFO

# Source function library.
. /etc/init.d/functions

start() {
  echo -n "Starting hhvm: "
        /usr/local/hhvm/hphp/hhvm/hhvm --config /etc/hhvm/server.hdf --user nginx --mode daemon
  touch /var/lock/subsys/hhvm
}

stop() {
  echo -n "Shutting down hhvm: "
  killproc -p /var/run/hhvm/hhvm.pid hhvm
  rm -f /var/lock/subsys/hhvm
}

case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  status)
    status -p /var/run/hhvm/hhvm.pid hhvm
  ;;
  restart)
    stop
  start
  ;;
  reload|condrestart|probe)
  echo "$1 - Not supported."
  ;;
  *)
  echo "Usage: hhvm {start|stop|status|reload|restart[|probe]"
  exit 1
  ;;
esac
exit $?
```

実行権限を付与。

```bash
$ chmod +x /etc/init.d/hhvm
```

### php.ini を変更

```bash
$ sudo mv /etc/php.ini /etc/php.ini_old && \
sudo vi /etc/php.ini
```

下記をペースト。

```
[PHP]
engine = On
short_open_tag = On
asp_tags = Off
precision = 14
y2k_compliance = On
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 100
allow_call_time_pass_reference = Off
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = Off
max_execution_time = 90
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = Off
variables_order = "GPCS"
request_order = "GP"
register_globals = Off
register_long_arrays = Off
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 4M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

[Date]
date.timezone = "Asia/Tokyo"

[filter]

[iconv]

[intl]

[sqlite]

[sqlite3]

[Pcre]

[Pdo]

[Phar]

[Syslog]
define_syslog_variables  = Off

[mail function]
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = On

[SQL]
sql.safe_mode = Off

[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1

[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off

[MySQLi]
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off

[OCI8]

[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0

[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10

[bcmath]
bcmath.scale = 0

[browscap]

[Session]
;session.save_handler = files
session.save_handler = memcached
;session.save_path = "/var/tmp/php/session"
session.save_path = "tcp://localhost:11211"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = Off
session.bug_compat_warn = Off
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off

[Assertion]

[COM]

[mbstring]

[gd]

[exif]

[Tidy]
tidy.clean_output = Off

[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/var/tmp"
soap.wsdl_cache_ttl=86400

[sysvshm]

[apc]
extension=apcu.so

apc.enabled=1
apc.enable_cli=1
apc.shm_segments=1
apc.shm_size=64M
apc.num_files_hint=128
apc.user_entries_hint=8192
apc.ttl=3600
apc.gc_ttl=3600
apc.user_ttl=7200
apc.use_request_time=1
apc.cache_by_default=1
apc.filters=.*\.phar
apc.mmap_file_mask=/dev/zero
apc.file_update_protection=2
apc.max_file_size=1M
apc.stat=1
apc.stat_ctime=0
apc.canonicalize=0
apc.write_lock=1
apc.report_autofilter=0
apc.rfc1867=0
apc.rfc1867_prefix =upload_
apc.rfc1867_name=APC_UPLOAD_PROGRESS
apc.rfc1867_freq=0
apc.rfc1867_ttl=3600
apc.include_once_override=0
apc.lazy_classes=0
apc.lazy_functions=0
apc.coredump_unmap=0
apc.file_md5=0
apc.preload_path

[opcache]
;zend_extension=opcache.so

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
opcache.revalidate_freq=60
opcache.fast_shutdown=1

[memcached]
;extension=memcached.so
```

#### php.ini をコピーする

```bash
$ sudo cp -rf /etc/php.ini /etc/hhvm/php.ini
```

### memcached の設定

#### 設定を確認

```bash
$ cat /etc/php.d/50-memcached.ini
```

```bash
$ cat /etc/sysconfig/memcached
```

#### 起動

```bash
$ sudo service memcached start && \
sudo chkconfig memcached on
```

### PHP-FPM を設定

#### 設定ファイルを作成

```bash
$ sudo mv /etc/php-fpm.conf /etc/php-fpm.conf_old && \
sudo vi /etc/php-fpm.conf
```

下記をペースト。

```
include=/etc/php-fpm.d/*.conf

[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
```

設定ファイルを作成。

```bash
$ sudo mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf_old && \
sudo vi /etc/php-fpm.d/www.conf
```

以下をペースト。

```
[www]
listen = /var/run/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666

user = nginx
group = nginx

pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 4
pm.max_requests = 200

rlimit_files = 131072
rlimit_core = unlimited

request_terminate_timeout = 90
request_slowlog_timeout = 60

slowlog = /var/log/php-fpm/www-slow.log

php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_admin_value[upload_max_filesize] = 4M
php_admin_value[post_max_size] = 4M
php_admin_value[max_execution_time] = 60
```

#### 起動

```bash
$ sudo service php-fpm start && \
sudo chkconfig php-fpm on
```

### HHVM を起動

```bash
$ sed -i -e '$ahhvm --mode daemon --user nginx --group nginx --config /etc/hhvm/server.hdf -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/hhvm.sock' /etc/rc.d/rc.local && \
hhvm --mode daemon --user nginx --config /etc/hhvm/server.hdf -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/hhvm.sock

# このコマンドは要らない？
$ update-alternatives --install /usr/bin/php php /usr/local/hhvm/hphp/hhvm/hhvm 60
```

```bash
$ sudo service hhvm start && \
sudo chkconfig hhvm on 
```

## MySQL の起動

```bash
$ sudo service mysql start && \
sudo chkconfig mysql on
```

## ドキュメントルートの作成

```bash
$ sudo mkdir -m +w -p /var/www/vhosts/default/ && \
sudo chown -R nginx:nginx /var/www/vhosts/*
```

## WordPress のインストール

### WP CLI のインストール

```bash
$ sudo wget https://raw.github.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -O /usr/bin/wp && \
sudo chmod +x /usr/bin/wp
```

### WordPress 用の DB を作成

```bash
$ mysql -u root -p
$ create database wordpress_db default character set utf8 collate utf8_general_ci;
$ GRANT ALL PRIVILEGES ON wordpress_db.* TO wordpress_db@localhost IDENTIFIED BY 'wordpress_db' WITH GRANT OPTION;
```

### WordPress のインストール

root ユーザーだとエラーが出るので注意。

```bash
$ wp core download --locale=ja --path='/var/www/vhosts/default/'
$ cd /var/www/vhosts/default
$ wp core config --dbname='wordpress_db' --dbuser='wordpress_db' --dbpass='wordpress_db'
$ wp core install --url='192.168.30.10' --title='WordPress Test' --admin_name='admin' --admin_password='admin' --admin_email='admin@example.jp'
```

root ユーザーに戻り、各ディレクトリの所有者とグループを変更。

```bash
$ sudo chown -R nginx:nginx /var/www/vhosts/default/*
```

## Nginx の起動

```bash
$ sudo service nginx start && \
sudo chkconfig nginx on
```

## セキュリティ

### Exec-Shield を有効化

```bash
$ su - root
$ echo 2 > /proc/sys/kernel/exec-shield
$ exit
```

### LogWatch

ログ監視ツール。

```bash
$ sudo yum -y install logwatch &&\
sudo logwatch --print
```

必要に応じて logwatch の設定ファイル /etc/logwatch/conf/logwatch.conf を書き換える。

[Logwatch を CentOS にインストールする](http://www.websec-room.com/2014/01/18/1675)
[ログ監視ツール logwatch のインストールと設定 〜 CentOS6](http://easyramble.com/install-setup-logwatch.html)

### DenyHosts

SSH のブルートフォースアタック対策ツール。

```bash
$ sudo yum -y install denyhosts && \
sudo service denyhosts start && \
sudo chkconfig denyhosts on
```

### Clam AntiVirus

オープンソースで開発・運用されているウィルス対策ソフト。

```bash
$ sudo yum -y --enablerepo=epel install clamd && \
sudo vi /etc/clamd.conf
```

設定ファイルが開いたら、「User clam」を「User root」へ変更。

Clam AntiVirus を起動させる。

```bash
$ sudo service clamd start && \
sudo chkconfig clamd on
```

ウイルス定義ファイルをアップデート。

```bash
$ sudo freshclam
```

スケジュール設定ファイルを作成。

```bash
$ sudo vi /etc/cron.daily/virusscan
```

下記をペースト。

```
#!/bin/bash

PATH=/usr/bin:/bin

# clamd update
yum  --enablerepo=epel -y update clamd > /dev/null 2>&1

# virus scan
CLAMSCANTMP=`mktemp`
clamscan --recursive --remove  / > $CLAMSCANTMP 2>&1
[ ! -z "$(grep FOUND$ $CLAMSCANTMP)" ] && \

# when detect virus, send mail
grep FOUND$ $CLAMSCANTMP | mail -s "Virus Found in `hostname`" root
rm -f $CLAMSCANTMP
```

実行権限を付与。

```bash
$ sudo chmod +x /etc/cron.daily/virusscan
```

### WAF (Web Application Firewall)

Nginx の場合、ngx_pagespeed などのように、ソースコードからビルドしなくてはならない。

現在調査中。
（WordPress と仲良くやれるのだろうか・・・。）

* [CentOSにNginxとModSecurityをインストールする](http://qiita.com/tebora1969/items/4fb2463fe45621d1fec1)
* [ModSecurity を nginx + passenger で](http://tech.actindi.net/3576895793)

## バックアップ

```bash
$ sudo wget ftp://mondo.mirror.pclark.com/pub/mondorescue/rhel/6/x86_64/mondorescue.repo -O /etc/yum.repos.d/mondorescue.repo && \
sudo yum -y --enablerepo=mondorescue install mondo && \
sudo mkdir ~/backup
```

バックアップを実行。

```bash
$ sudo mondoarchive -Oi -s 10000m -d ~/.backup -E ~/.backup -S /tmp -T /tmp -p `hostname`_`date +%Y%m%d`
```

バックアップファイルをローカルにダウンロード。

```bash
$ scp -P 10022 -i ~/.ssh/conoha_rsa exampleuser@192.168.0.0:/home/exampleuser/.backup/v192-168-0-0.example.jp_20150829-1.iso Desktop
```

## SSL の設定

### CSR と秘密鍵の作成
CSR ファイルは SSL 証明書購入申請の際に使用します。

```
$ openssl req -nodes -newkey -sha256 rsa:2048 -nodes -keyout example.jp.`date +'%Y%m%d'`.key -out example.jp.`date +'%Y%m%d'`.csr -subj "/C=JP/ST=Tokyo/L=Shibuya-ku/O=OrganizationUnitName/OU=-/CN=example.jp"
```

### 証明書の作成
Nginx の場合 ssl_certificate に指定するファイルです。

```
$ cat example_jp.crt サーバー証明書.crt 中間証明書.crt クロスルート証明書.crt > example.jp.`date +'%Y%m%d'`.pem
```

### DH鍵交換に使用するパラメータファイルの作成
Nginx の場合 ssl_dhparam に指定するファイルです。

```
$ openssl dhparam 2048 -out example.jp.dhparam.`date +'%Y%m%d'`.pem
```

### TLS Session Ticket に使用する鍵の作成
Nginx の場合 ssl_session_ticket_key に指定するファイルです。

```
$ openssl rand 48 > example.jp.ticket.`date +'%Y%m%d'`.key
```

### OCSP Stapling に使用するパラメータファイルの作成
Nginx の場合 ssl_trusted_certificate に指定するファイルです。

```
$ cat 中間証明書.crt クロスルート証明書.crt ルート証明書.crt > example.jp.trusted.`date +'%Y%m%d'`.pem
```

### GeoTrust クイックSSLプレミアム
中間CA証明書
https://www.geotrust.co.jp/resources/repository/intermediate.html
ルートCA証明書
http://www.geotrust.com/resources/root-certificates/index.html

### 参考サイト
[Generate Mozilla Security Recommended Web Server Configuration Files](https://mozilla.github.io/server-side-tls/ssl-config-generator/)
[SSLチェックツール](https://sslcheck.globalsign.com/ja)
[SSL Server Test](https://www.ssllabs.com/ssltest/index.html)
[GeoTrust SSL ToolBox](https://ssltools.geotrust.com/checker/views/certCheck.jsp)
[Security/Server Side TLS](https://wiki.mozilla.org/Security/Server_Side_TLS)


## 参考サイト一覧
* [dogmap.jp](http://dogmap.jp/)
* [ConoHa ブログ](https://www.conoha.jp/blog)
* [レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/)
* [CentOS6にPHP5.6をyumでインストール](http://nob-log.info/2014/08/25/centos6-yum-install-php56/)
* [Linux標準教科書](http://www.lpi.or.jp/linuxtext/text.shtml)
* [評判のさくらのVPSを使うときに最初にやっておきたいこと(CentOS編)](http://server-setting.info/blog/sakura_vps_centos_first_setup.html)
* [最低限必要な CentOS セキュリティ設定](http://www.websec-room.com/2014/02/09/1822)