CentOS 6にnginxとphpMyAdmin最新バージョンをサクッとインストールする方法

2015/03/17 18:46

レンタルしているVPSサーバーを引っ越す必要があったので、今後も簡単に移設できるようにサーバー構築からWordPressの移転まで一通りまとめておきたいと思います。


目次
  1. 初期設定・セキュリティ設定
  2. nginxベースの高速なVPS環境を構築
  3. 最新版のphpMyAdminをインストール
  4. nginxにbasic認証を追加
  5. WordPress(サーバー)の移設方法
  6. CloudFlareを使ってDDos対策を行う
  7. おすすめレンタルVPSサーバー
Contents

初期設定・セキュリティ設定

VPSの設定は、PoderosaというWindows用SSHクライアントを使用して作業していきます。

Download: Poderosa – Browse /beta at SourceForge.net
さくらのVPSでWordPressを動かそう – 初期設定・セキュリティ設定編 – – UKLab開発者ブログ

こちらを参考に設定します。

サーバーに接続する

1.Poderosaを起動してサーバーに接続
ファイル→新規Telnet/SSH接続をクリック

VPS契約完了時に届いている情報をもとに、ホスト名、アカウントパスフレーズを埋めます。

  • ホスト名:メールに書いてあるサーバーのIPアドレス
  • プロトコル:SSH2
  • ポート:SSH(22)
  • アカウント:メールに記載のユーザ名(root)
  • 認証方法:パスワード
  • パスフレーズ:メールに記載の初期パスワード
※お名前.comの場合、こちらを参照

「OK」ボタンをクリックして接続します。

接続出来るとこのような画面になります。

rootのパスワードを変更/作業用ユーザーの作成

passwd root
useradd ユーザー名
passwd 追加したユーザー名
usermod -G wheel 先ほど追加したユーザー名
vi /etc/pam.d/su
#auth required pam_wheel.so use_uid

auth required pam_wheel.so use_uid
:wq
Poderosaの操作Tips
  • 「Alt+c」でコピー
  • 「Alt+v」でペースト
  • 「ウインドウ」->「すべての分割を結合」で画面を一つにする
viコマンドのTips
  • 「i」キーで編集モードになる
  • 「Esc」キーで編集モード解除
  • 「u」キーで元に戻す
  • 「Ctrl+r」キーでやり直し
  • 「/」キーで文字列検索
  • 「Esc」キー「:wq」で保存
  • 「Esc」キー「:q」で保存せずに閉じる(編集していない場合)

鍵認証の設定

Poderosaのツール→SSH鍵作成ウィザードから鍵を作成します。

  • アルゴリズム:RSA
  • ビット数:2048
  • パスフレーズ:任意のパスワード
  • 確認入力:上記と同じパスワード
「次へ」をクリック

ウィンドウの中でバーが右端まで行くまでマウスを動かします。

生成が終わったら「次へ」をクリック

  • 秘密鍵を名前をつけて保存
  • OpenSSH形式で公開鍵を名前をつけて保存
cd /home/作業用ユーザー名
mkdir -p ./.ssh
chmod 700 .ssh
cd .ssh
vi authorized_keys
「iキー」を押して編集モードにしてから、Poderosaで作成した「OpenSSH形式の公開鍵(拡張子が.pubのもの)」の中身をテキストエディタで開き全てコピーして「Alt+v」で貼り付け
貼り付けたら「Escキー」を押してから上書き保存

:wq
chmod 600 authorized_keys
cd ../
chown -R 作業用ユーザー名:wheel .ssh
公開鍵認証で接続出来るか確認

  • ホスト名:VPSのIPアドレス
  • アカウント:作業用ユーザー
  • パスフレーズ:鍵生成時に設定したパスフレーズ
  • 認証方法:公開鍵
  • 鍵ファイル:…を押して保存した秘密鍵を選択する
ログイン出来ない場合、authorized_keysが上手く貼り付けできていない可能性が高いです。

SSHのポートを変更する

su
vi /etc/ssh/sshd_config

#Port 22
 ↓
Port xxxxx
※最大で65535まで(忘れないようメモ)
※お名前.comの場合、お試し期間中は変更しないこと

#PermitEmptyPasswords no

PermitEmptyPasswords no
Escキー
:wq
※rootでのログインを禁止する場合、FTPを導入して下さい。

【参考】
service sshd reload

言語環境を日本語にする

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

Escキー
:wq

exit
exit
再度sshでログインすることで日本語が有効になります。

パッケージを最新の物にする/自動更新の設定

yum update
yum install yum-cron
vi /etc/sysconfig/yum-cron

CHECK_ONLY=no

DOWNLOAD_ONLY=no

確認後Escキー
:q
/etc/rc.d/init.d/yum-cron start
chkconfig yum-cron on
chkconfig --list yum-cron

cronの設定

yum install cronie-noanacron
yum -y remove cronie-anacron

root宛のメールを転送する

sed -i '/^root:/d' /etc/aliases
echo "root: メールアドレス" >> /etc/aliases
newaliases
echo test | mail root
※さくらVPSやお名前.comの場合、お試し期間中は送信されない

kernel panic時の自動再起動

vi /etc/sysctl.conf
# When kernel panic's, reboot after 10 second delay
kernel.panic = 10
Escキー
:wq
sysctl -p
cat /proc/sys/kernel/panic
10という表示が出ればOK

IPv6を無効にする

/etc/rc.d/init.d/ip6tables stop
chkconfig ip6tables off
echo "install ipv6 /bin/true" >> /etc/modprobe.d/disable-ipv6.conf

ログの保存期間を12週間に変更する

vi /etc/logrotate.conf

rotate 4を以下に変更
rotate 12

Escキー
:wq

logwatchをインストールする

yum install logwatch
vi /etc/logwatch/conf/logfiles/http.conf
LogFile = nginx/*access.log
Archive = nginx/*access.log.*.gz
*ExpandRepeats
*ApplyhttpDate
nginxのログファイルが/var/log/nginxにある際の設定になる。

Escキー
:wq

リポジトリの追加

yum -y install yum-plugin-priorities
vi /etc/yum.repos.d/CentOS-Base.repo
[base]
[updates]
[extras]
[centosplus]
[contrib]
「iキー」を押してそれぞれすぐ下の行に以下を追加
priority=1
Escキー
:wq
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
vi /etc/yum.repos.d/remi.repo
[remi]
[remi-test]

「iキー」を押してそれぞれすぐ下の行に以下を追加
priority=1
Escキー
:wq
rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
(「既にインストールされています。」と表示されればOK)

iptablesの設定

vi iptables.sh
#!/bin/bash

#---------------------------------------#
# 設定開始 #
#---------------------------------------#

# インタフェース名定義
LAN=eth0
#---------------------------------------#
# 設定終了 #
#---------------------------------------#

# 内部ネットワークのネットマスク取得
LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`
# 内部ネットワークアドレス取得
LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK


# ファイアウォール停止(すべてのルールをクリア)
/etc/rc.d/init.d/iptables stop
# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
iptables -P INPUT DROP # 受信はすべて破棄
iptables -P OUTPUT ACCEPT # 送信はすべて許可
iptables -P FORWARD DROP # 通過はすべて破棄
# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT
# 内部からのアクセスをすべて許可
iptables -A INPUT -s $LOCALNET -j ACCEPT
# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf

# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done

# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done

# フラグメント化されたパケットはログを記録して破棄
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A INPUT -f -j DROP
# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP
# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH
# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP
# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
# ACCEPT_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成
ACCEPT_COUNTRY_MAKE(){
for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
do
iptables -A ACCEPT_COUNTRY -s $addr -j ACCEPT
done
}

# DROP_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成
DROP_COUNTRY_MAKE(){
for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
do
iptables -A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : '
iptables -A DROP_COUNTRY -s $addr -j DROP
done
}

# IPアドレスリスト取得
. /root/iptables_functions
IPLISTGET

# 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成
iptables -N ACCEPT_COUNTRY
ACCEPT_COUNTRY_MAKE JP
# 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する

# 中国・台湾・ロシア※からのアクセスをログを記録して破棄
# ※全国警察施設への攻撃元上位3カ国(日本・アメリカを除く)
# http://www.cyberpolice.go.jp/detect/observation.htmlより
iptables -N DROP_COUNTRY
DROP_COUNTRY_MAKE CN
DROP_COUNTRY_MAKE TW
DROP_COUNTRY_MAKE RU
iptables -A INPUT -j DROP_COUNTRY
#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから) #
#----------------------------------------------------------#

# 外部からのTCP22番ポート(SSH)へのアクセスを日本からのみ許可
# ※SSHサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 22 -j ACCEPT_COUNTRY
iptables -A INPUT -p tcp --dport ポート番号 -j ACCEPT_COUNTRY
# 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可
# ※外部向けDNSサーバーを運用する場合のみ
#iptables -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -A INPUT -p udp --dport 53 -j ACCEPT
# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 外部からのTCP443番ポート(HTTPS)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 外部からのTCP21番ポート(FTP)へのアクセスを日本からのみ許可
# ※FTPサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT_COUNTRY
# 外部からのPASV用ポート(FTP-DATA)へのアクセスを日本からのみ許可
# ※FTPサーバーを公開する場合のみ
# ※PASV用ポート60000:60030は当サイトの設定例
#iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT_COUNTRY
# 外部からのTCP25番ポート(SMTP)へのアクセスを許可
# ※SMTPサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# 外部からのTCP465番ポート(SMTPS)へのアクセスを日本からのみ許可
# ※SMTPSサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 465 -j ACCEPT_COUNTRY
# 外部からのTCP587番ポート(サブミッションポート)へのアクセスを日本からのみ許可
# ※SMTP AUTHサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 587 -j ACCEPT_COUNTRY
# 外部からのTCP110番ポート(POP3)へのアクセスを日本からのみ許可
# ※POP3サーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 110 -j ACCEPT_COUNTRY
# 外部からのTCP995番ポート(POP3S)へのアクセスを日本からのみ許可
# ※POP3Sサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 995 -j ACCEPT_COUNTRY
# 外部からのTCP143番ポート(IMAP)へのアクセスを日本からのみ許可
# ※IMAPサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 143 -j ACCEPT_COUNTRY
# 外部からのTCP993番ポート(IMAPS)へのアクセスを日本からのみ許可
# ※IMAPSサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 993 -j ACCEPT_COUNTRY
# 外部からのUDP1194番ポート(OpenVPN)へのアクセスを日本からのみ許可
# ※OpenVPNサーバーを公開する場合のみ
#iptables -A INPUT -p udp --dport 1194 -j ACCEPT_COUNTRY
# VPNインタフェース用ファイアウォール設定
# ※OpenVPNサーバーを公開する場合のみ
#[ -f /etc/openvpn/openvpn-startup ] && /etc/openvpn/openvpn-startup


#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここまで) #
#----------------------------------------------------------#

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
for ip in `cat /root/deny_ip`
do
iptables -I INPUT -s $ip -j DROP
done
fi

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP
# サーバー再起動時にも上記設定が有効となるようにルールを保存
/etc/rc.d/init.d/iptables save
# ファイアウォール起動
/etc/rc.d/init.d/iptables start



SSHのポートだけは自分で設定したものに変更する必要がある
※お名前.comの場合、お試し期間中は22のみ

/iptables -A INPUT -p tcp --dport ポート番号 -j ACCEPT_COUNTRY
ポート番号を変更する

これを入力しないで以降進めるとエラーになる、またはSSHクライアントからは繋がらなくなるため注意!
Escキー
:wq
vi /root/iptables_functions
# IPアドレスリスト取得関数定義
IPLISTGET(){
# http://nami.jp/ipv4bycc/から最新版IPアドレスリストを取得する
wget -q http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip cidr.txt.gz
# 最新版IPアドレスリストが取得できなかった場合
if [ ! -f cidr.txt ]; then
if [ -f /tmp/cidr.txt ]; then
# バックアップがある場合はその旨をroot宛にメール通知して処理を打ち切る
echo cidr.txt was read from the backup! | mail -s $0 root
return
else
# バックアップがない場合はその旨をroot宛にメール通知して処理を打ち切る
echo cidr.txt not found!|mail -s $0 root
exit 1
fi
fi
# 最新版IPアドレスリストを /tmpへバックアップする
/bin/mv cidr.txt /tmp/cidr.txt
}
Escキー
:wq
vi /etc/cron.daily/iplist_check.sh
#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 新旧IPLIST差分チェック件数(0を指定するとチェックしない)
# ※新旧IPLIST差分がSABUN_CHKで指定した件数を越える場合はiptables設定スクリプトを実行しない
# ※新旧IPLIST差分チェック理由はhttp://centossrv.com/bbshtml/webpatio/1592.shtmlを参照
SABUN_CHK=9999
[ $# -ne 0 ] && SABUN_CHK=${1}

# チェック国コード
COUNTRY_CODE='JP CN TW RU'

# iptables設定スクリプトパス
IPTABLES=/root/iptables.sh
# iptables設定スクリプト外部関数取り込み
. /root/iptables_functions
# IPアドレスリスト最新化
rm -f IPLIST.new
IPLISTGET
for country in $COUNTRY_CODE
do
if [ -f /tmp/cidr.txt ]; then
grep ^$country /tmp/cidr.txt >> IPLIST.new
else
grep ^$country /tmp/IPLIST >> IPLIST.new
fi
done
[ ! -f /tmp/IPLIST ] && cp IPLIST.new /tmp/IPLIST
# IPアドレスリスト更新チェック
diff -q /tmp/IPLIST IPLIST.new > /dev/null 2>&1
if [ $? -ne 0 ]; then
if [ ${SABUN_CHK} -ne 0 ]; then
if [ $(diff /tmp/IPLIST IPLIST.new | egrep -c '<|>') -gt ${SABUN_CHK} ]; then
(
diff /tmp/IPLIST IPLIST.new
echo
echo "$IPTABLES not executed."
) | mail -s 'IPLIST UPDATE' root
rm -f IPLIST.new
exit
fi
fi
/bin/mv IPLIST.new /tmp/IPLIST
sh $IPTABLES > /dev/null
else
rm -f IPLIST.new
fi
Escキー
:wq
chmod +x /etc/cron.daily/iplist_check.sh
sh iptables.sh
ファイアーウォール設定スクリプトを実行
sh iptables.sh
これにより設定したルールが適応されます。
※時間がかかるので気長に待ちます

一度ログアウトして、再度きちんとログイン出来るかチェックします。

※もし設定ファイルの不備なでSSHでログイン出来なくなった場合、VPSのコンソールからiptablesをOFF
service iptables stop
大抵の場合iptables.shの記述ミスなので、一度削除して再度コピペ後にポート番号を変更してみてください。
rm iptables.sh
vi iptables.sh
sh iptables.sh
chkconfig iptables on

denyhostsのインストール

ログを監視して不正ログインを試みた痕跡があった場合、自動的に/etc/hosts.deny (TCP wrapper によるアクセス規制リスト) に規制する IP を自動で追加してくれるパッケージ。
yum install denyhosts
/etc/init.d/denyhosts start
chkconfig denyhosts on
reboot
以上で初期設定・セキュリティ設定が完了です。


nginxベースの高速なVPS環境を構築

nginxベースの高速なWordPress環境をお名前.comのVPSで構築 | SourceForge.JP Magazine

こちらを参考に導入します。

yum install httpd mysql-server php php-mysql wget
Apacheを起動して、80番ポートに外部からアクセスできるか、Webサーバーとして機能しているかを確認。
/etc/init.d/httpd start
VPSサーバーのURLにブラウザでアクセスして、Apacheの画面が出ればOK
/etc/init.d/mysqld start
chkconfig mysqld on

WordPressを動作させるための最低限必要なMySQLの設定

mysql -u root

mysql> update mysql.user set password=password('root用の任意パスワード') where user = 'root';
mysql> flush privileges; ← 変更を反映
mysql> \q
mysql -u root -p
Enter password:
mysql> CREATE DATABASE wp;
mysql> GRANT ALL PRIVILEGES ON wp.* TO wp@localhost IDENTIFIED BY "設定したrootのパスワード";
セキュリティを考慮して匿名ユーザーを削除します。
mysql> DELETE FROM mysql.user WHERE User = '';
mysql> flush privileges;
mysql> SELECT Host, User,Password FROM mysql.user where User = '' and Host = 'localhost';
mysql> select Host, User, Password from mysql.user;
mysql> \q(quitかexit、Ctrl+cでもOK)

WordPressのインストール

http://ja.wordpress.org/releases/』を確認し、wgetコマンドで取得します。

cd /var/www
wget http://ja.wordpress.org/wordpress-4.1.1-ja.tar.gz
tar zxvf wordpress-4.1.1-ja.tar.gz
rm wordpress-4.1.1-ja.tar.gz
※サーバーの移設の場合、元のサーバーにある『WordPress』のディレクトリをtar.gzで圧縮後に「/var/www/」ディレクトリに展開して下さい。

cd /var/www
tar cvzf wordpress.tar.gz wordpress
「wordpress.tar.gz」をダウンロードし、移設先のサーバー「/var/www/」ディレクトリにアップロードします。
cd /var/www
tar zxvf wordpress.tar.gz
rm wordpress.tar.gz
※Web上に公開してるディレクトリが[wordpress]の場合
(バックアップとしてローカルに保存しておいてもいいでしょう)

vi /etc/httpd/conf/httpd.conf
以下の3か所を修正

DocumentRoot “/var/www/html"

DocumentRoot “/var/www/wordpress"
<Directory "/var/www/html">

<Directory "/var/www/wordpress">
AllowOverride None

AllowOverride All
chown -R apache wordpress
/etc/init.d/httpd restart
この状態でVPSのURLにアクセスし、WordPressの初期画面になればOK

新規にWordPressをインストールする場合は、そのまま設定を行って下さい。

移転する場合は、画面を閉じて次のステップに進みましょう。

nginxのインストール

vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
yum install nginx
/etc/init.d/httpd stop
/etc/init.d/nginx start
chkconfig nginx on
chkconfig --list nginx
VPSサーバーのURLにブラウザでアクセスして、nginxの画面が出ればOK

PHP-FPMのインストールと設定

yum --enablerepo=remi install php php-fpm
vi /etc/php-fpm.d/www.conf
listen = 127.0.0.1:9000

listen = /var/run/php-fpm/php-fpm.sock
user = apache
group = apache

user = nginx
group = nginx
pm.max_children = 50

pm.max_children = 15
pm.min_spare_servers = 5

pm.min_spare_servers = 2
pm.max_spare_servers = 35

pm.max_spare_servers = 5
chown -R nginx /var/www/wordpress
/etc/init.d/php-fpm start
chkconfig php-fpm on

nginxの設定

vi /etc/nginx/nginx.conf
user  nginx;
worker_processes 2;
worker_cpu_affinity 0101 1010;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
server_tokens off;
client_max_body_size 20M;
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_http_version 1.0;
gzip_vary on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable "MSIE [1-6]\.";
gzip_disable "Mozilla/4";
gzip_proxied any;
gzip_buffers 16 8k;
include /etc/nginx/conf.d/*.conf;
}
rm /etc/nginx/conf.d/default.conf
vi /etc/nginx/conf.d/default.conf
root /var/www/wordpress;
index index.php index.html index.htm;

proxy_cache_path /var/cache/nginx/cache1 levels=1 keys_zone=cache1:128m;
proxy_cache cache1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_valid 200 404 30m;
server {
listen 80 default_server;
gzip on;
gzip_disable msie6;
gzip_types text/css application/x-javascript;
location ~ /\. {deny all; access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location = /favicon.ico { access_log off; log_not_found off; }
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
log_not_found off;
proxy_pass http://unix:/var/run/nginx.sock;
}

set $do_not_cache 0;
if ($uri ~* "\.php$") {
set $do_not_cache 1;
}

set $proxy_cache_key "$scheme://$host$request_uri";
if ($http_user_agent ~* "iPhone") {
set $do_not_cache 1;
set $proxy_cache_key "iphone::$proxy_cache_key";
}
if ($http_user_agent ~* "Android") {
set $do_not_cache 1;
set $proxy_cache_key "android::$proxy_cache_key";
}
if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
set $proxy_cache_key "$2::$proxy_cache_key";
}

location / {
proxy_no_cache $do_not_cache;
proxy_cache_bypass $do_not_cache;
proxy_cache_key $proxy_cache_key;
proxy_pass http://unix:/var/run/nginx.sock;
}
}

server {
listen unix:/var/run/nginx.sock;
try_files $uri $uri/ /index.php;
include /var/www/wordpress/nginx.conf;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 24h;
log_not_found off;
}

location ~* \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
『502 Bad Gateway』となる場合
tail -f /var/log/nginx/error.log
このようなエラーがありました

/var/run/php-fpm/php-fpm.sock failed (13: Permission denied)
「Ctrl+c」でtailコマンドを抜ける
cd /var/run/php-fpm
chmod 666 php-fpm.sock
vi /etc/php-fpm.d/www.conf
listen.mode = 0666(先頭の";"を外し、このように設定する
/etc/init.d/mysqld restart
/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
これで接続できるようになればOKです。

vi /var/www/wordpress/wp-includes/class-wp.php
/nocache_headers(); で検索
// nocache_headers();
nocache_headers()をコメントアウトすることで、nginxのプロキシでキャッシュされるようになります。

プロキシキャッシュを削除できるようにする

vi /var/www/wordpress/wp-admin/clear-cache.php
<?php
require_once( './admin.php' );
system( "/bin/rm -rf /var/cache/nginx/cache1/*" );
?>
clear cache
「http://VPSのURL/wp-admin/clear-cache.php」にブラウザでアクセスすることで、プロキシのキャッシュを削除することができます。

最新版のphpMyAdminをインストール

yumでインストールすると最新版のphpMyAdminがインストール出来ないため手動でインストールします。
Link: phpMyAdmin – Download
こちらで最新バージョンの『phpMyAdmin』が確認できます。
(記事公開時:phpMyAdmin 4.3.12)
cat /etc/redhat-release
CentOS release 6.6 (Final)

php -v
PHP 5.4.38 (cli) (built: Feb 18 2015 16:46:56)
mysql --version
mysql Ver 14.14 Distrib 5.5.42, for Linux (x86_64) using readline 5.1

CentOSにMySQL 5.5、PHP 5.5をインストール

yum remove mysql*
yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
vi /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.5
[mysql55-community]
name=MySQL 5.5 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/6/$basearch/
enabled=1 #ここを1に
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=0 #ここを0にする
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
vi /etc/yum.repos.d/remi.repo
[remi-php55]
priority=1
yum install --enablerepo=remi,remi-php55 php php-opcache php-devel php-mbstring php-mcrypt php-mysql php-phpunit-PHPUnit php-pecl-xdebug php-cli php-common
yum install mysql mysql-devel mysql-server mysql-utilities
service mysqld start
chkconfig mysqld on
cp /etc/php.ini /etc/php.ini.bak
vi /etc/php.ini
expose_php = Off
error_reporting = E_ALL & ~E_STRICT
error_log = /var/log/php.log
default_charset = "UTF-8"
date.timezone = Asia/Tokyo
session.save_path = "/var/lib/php/session"
session.cookie_secure = 1
session.cookie_httponly = 1
session.hash_function = 1

WordPressのアップロードファイルの容量上限を上げる(例.80MB)
memory_limit = 128M
post_max_size = 100M
upload_max_filesize = 80M
数値は「memory_limit」が一番大きく、「upload_max_filesize」が一番小さい値にする必要があります。
diff /etc/php.ini /etc/php.ini.bak
366c366
< expose_php = Off
---
> expose_php = On
452c452
< error_reporting = E_ALL & ~E_STRICT
---
> error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
577c577
< error_log = /var/log/php.log
---
> ;error_log = syslog
663c663
< post_max_size = 100M
---
> post_max_size = 8M
683c683
< default_charset = "UTF-8"
---
> ;default_charset = "UTF-8"
795c795
< upload_max_filesize = 80M
---
> upload_max_filesize = 2M
873c873
< date.timezone = Asia/Tokyo
---
> ;date.timezone =
1344c1344
< session.save_path = "/var/lib/php/session"
---
> ;session.save_path = "/tmp"
1359c1359
< session.cookie_secure = 1
---
> ;session.cookie_secure =
1390c1390
< session.cookie_httponly = 1
---
> session.cookie_httponly =
1483c1483
< session.hash_function = 1
---
> session.hash_function = 0
chown -R root.nginx /var/lib/php/session
chmod 777 /var/lib/php/session
yum install yum-cron
/etc/rc.d/init.d/yum-cron start
chkconfig yum-cron on
vi /etc/php-fpm.d/www.conf
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0666
user = nginx
group = nginx
pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 5
vi /etc/php.d/opcache.ini
opcache.enable_cli=1
opcache.revalidate_freq=60
opcache.fast_shutdown=1
yum install php-pecl-apcu --enablerepo=remi-php55,remi
vi /etc/php.d/apcu.ini
apc.enable_cli=1
apc.shm_size=32M
apc.ttl=3600
apc.gc_ttl=3600

phpMyAdminの設定

Link: phpMyAdmin – Download
こちらの最新バージョンの『phpMyAdmin』を確認し「wget」で取得(記事公開時:phpMyAdmin 4.3.12)
wget http://jaist.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/4.3.12/phpMyAdmin-4.3.12-all-languages.tar.gz
tar xvzf phpMyAdmin-4.3.12-all-languages.tar.gz
rm phpMyAdmin-4.3.12-all-languages.tar.gz
mv phpMyAdmin-4.3.12-all-languages phpMyAdmin
名前を「phpMyAdmin」としていますが、セキュリティ上自分の好みの名前に書き換えて下さい。
cd phpMyAdmin
cp config.sample.inc.php config.inc.php
chmod 660 config.inc.php
mkpasswdコマンドをインストールしてランダムな文字列を生成できるようにする
yum install expect
mkpasswd -l 46
uipkqlvbdMqjexYwzbc8kqyebnsac}xoufdtaxfksp9tbt ← 設定ファイルの編集で使用
vi config.inc.php
$cfg['blowfish_secret'] = 'uipkqlvbdMqjexYwzbc8kqyebnsac}xoufdtaxfksp9tbt';
先頭のコメントを削除し「pmaのパスワードを設定」
/*
* phpMyAdmin configuration storage settings.
*/
/* User used to manipulate with storage */
$cfg['Servers'][$i]['controlhost'] = '';
$cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'pmaのパスワードを設定';
/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
/* Contrib / Swekey authentication */

日本語環境にする
//$cfg['DefaultLang'] = 'en';
//$cfg['DefaultLang'] = 'de';
$cfg['DefaultLang'] = 'ja-utf-8';
$cfg['Lang'] = 'ja-utf-8';
$cfg['DefaultCharset'] = 'utf-8';
cd ../
chown -R root.nginx phpMyAdmin
mv phpMyAdmin /var/www/wordpress/
以上で設置完了です。


nginxにbasic認証を追加

yum install httpd-tools
cd /etc/nginx
htpasswd -c .htpasswd ユーザー名
New password: パスワード
Re-type new password: パスワード

phpMyAdminにbasic認証を掛ける

vi /etc/nginx/conf.d/default.conf
server {

###### 中略 ######

location /phpMyAdmin {
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
if ($uri ~ \.(gif|jpg|png|ico|js|css)$) {
access_log off;
}
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}

location ~ /phpMyAdmin/.*\.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

phpMyAdmin用のデータベースを作成

mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON phpmyadmin.* TO pma@localhost IDENTIFIED BY 'pmaのパスワード';
mysql> \q
/etc/init.d/mysqld restart
/etc/init.d/php-fpm restart
/etc/init.d/nginx restart
http://VPSのURL/phpMyAdmin にアクセスしてみましょう。
phpMyAdminのログイン画面が表示され、rootでログインしてエラーがなければ成功です。
「 phpMyAdmin 環境保管領域が完全に設定されていないため、いくつかの拡張機能が無効になっています。理由についてはこちらをご覧ください。Or alternately go to 'Operations’ tab of any database to set it up there.」「お使いになっている PHP の MySQL ライブラリのバージョン が MySQL サーバのバージョン と異なります。これは予期しない不具合を起こす可能性があります。」
このようなエラーがある場合、設定を見なおしてみましょう。

vi /var/www/wordpress/phpMyAdmin/config.inc.php
自分の場合、このエラーが出てたので「create_tables.sql」をインポートして解決しました。
/var/www/wordpress/phpMyAdmin/examples/create_tables.sql
こちらをダウンロードして、phpMyAdminでインポートします。
「インポート」メニューをクリック

「インポートするファイル」の箇所にある「ファイルを選択」ボタンを押して先程の「create_tables.sql」を選択
「フォーマット」が「SQL」になっていることを確認して、画面下部に表示されている「実行する」ボタンをクリック

「phpmyadmin」というデータベースが作成されました。
設定を有効にするために一度phpMyAdminからログアウトして、再度ログインして下さい。
これでエラーが消えていれば設定は完了です。

「phpMyAdmin の新しいバージョンが提供されています。アップグレードの検討をお奨めします。最新バージョンは 4.3.12 で、2015-03-14 にリリースされています。」
このメッセージは「4.3.12」をインストールしているので無視してOK

「You are using an incomplete translation, please help to make it better by contributing.」
このメッセージは「翻訳が不完全なので協力して下さい。」というものなので、時間のある方は協力してください。


WordPress(サーバー)の移設方法

WordPressを他のVPSに移設する方法を説明します。

参考:WordPressで公開しているサイトのサーバーを変更する | WordPressならファーストサーバ

移行前のサーバーでの作業

1.移設元のVPSからMySQLのデータベースをエクスポート
「phpMyAdmin」にログインし、WordPressのDB(ここではwp)を選択します。
2.「エクスポート」メニューで詳細設定に切り替え、以下の設定をします。
  • テーブルを全て選択
  • 出力をファイルに保存する
  • 「DROP TABLE/VIEW」を追加するオプションを選択
  • 圧縮や文字コードの変換などは行わないように設定
3.実行をクリック「(ファイル名).sql」というファイルをダウンロード

移行後のサーバーでの作業

1.「phpMyAdmin」にログインし、WordPressのDB(ここではwp)を選択
2.「操作」から「データベースの削除」
「データベースを削除する (DROP)」で「wp」を削除します。
3.データベースを新規作成
左側の「New」をクリックし「wp(以前と同じ名前)」を作成します。
照合順序は「utf8-general-ci」を選択

4.作成したデータベースを選択し「インポート」メニューを選択
・「参照」からインポートするデータベースのファイル選択。
・文字コードの変換は「なし」を選択。

5.実行するとデータベースに各種データがインポートされます。
「413 Request Entity Too Large」となる場合は、「/etc/nginx/nginx.conf」の設定を確認して下さい。

エラーが出る場合、再度行うことで上手く行ったりします。

WordPressのドメイン設定の変更

mysql -u root -p
mysql> use wp;
mysql> SELECT option_name, option_value FROM wp_options WHERE option_name IN ('home', 'siteurl');
http://newdomain.com が新しいURLの場合(末尾にスラッシュを付けない)
mysql> UPDATE wp_options SET option_value='http://newdomain.com' WHERE option_name IN ('home', 'siteurl');
mysql> SELECT option_name, option_value FROM wp_options WHERE option_name IN ('home', 'siteurl');
mysql> \q
/etc/init.d/mysqld restart
/etc/init.d/php-fpm restart
/etc/init.d/nginx restart
サイトにアクセスし、画像やリンクが正しく表示されているか確認。

以上で移転は終了です。


CloudFlareを使ってDDos対策を行う

Link: Home | CloudFlare | The web performance & security company
そのままですと、サーバーの生IPがすぐわかります。標的にされないように『CloudFlare』の「DNS Settings」でIP流出を阻止します。

すべてを「CloudFlare」経由にします。MXレコードを設定するとそこから漏れてしまうのでメールは使用しません。あとは、契約しているドメインの会社で「CloudFlare」で割り当てられたネームサーバを設定すればOKです。

細かい設定などは「CloudFlare 設定」などで検索すれば出てくるので省略します。

おすすめレンタルVPSサーバー

今回の記事を作成するにあたって、様々なVPSを試しました。その中でおすすめのものをピックアップして紹介いたします。自分が運営しているサイトのアクセス量から同じくらいのプランを選別しています。

さくらインターネットのVPS

VPS(仮想専用サーバ)|さくらインターネット – 無料お試し実施中
月額:972円(税込み)初期費用:1,620円 メモリ:1GB HDD:100GB CPU:2コア

メリット:比較的バランスの取れた料金とサポート、コンソールが操作しやすい
デメリット:スペックがやや劣る、DDosなどに弱い

GMOクラウドのVPS

GMOクラウドのVPSサーバー 月額934円から
月額:1,010円(税込み)初期費用:4,320円 メモリ:2GB HDD:100GB CPU:3コア

メリット:さくらVPSのようなI/O負荷による制限などがない、十分なスペックでアダルトもOK
デメリット:初期費用が高い、コンソールがJava 7にしか対応していない

お名前.com VPS

お名前.com VPS|月額896円(税抜)からのVPS(KVM・Hyper-V)
月額:1,420円(税込み)初期費用:1,728円 メモリ:2GB HDD:200GB CPU:3コア

メリット:スペックが一番高い、コンソールも操作しやすい、記事執筆時初期費用が無料
デメリット:月額が高い

ServersMan@VPS

VPSならDTI|月額467円(税抜) メモリ1GB|ServersMan@VPS
月額:505円(税込み)初期費用:無料 メモリ:1GB HDD:50GB CPU:1コア(2コア?)

こちらは試していませんが、格安プランとして紹介します。

メリット:月額・初期費用ともに安い、上位プランにそのまま引き継げる
デメリット:スペックが低い(安いプランなので)、安定性に難ありとの評価が見受けられる
それぞれお試し期間があるので、自分が納得行くもので心機一転もしくはレンタルサーバーからの移転などしてみてはいかがでしょうか?

かなりのボリュームになりましたが、参考になれば幸いです。