
レンタルしているVPSサーバーを引っ越す必要があったので、今後も簡単に移設できるようにサーバー構築からWordPressの移転まで一通りまとめておきたいと思います。
目次- 初期設定・セキュリティ設定
- nginxベースの高速なVPS環境を構築
- 最新版のphpMyAdminをインストール
- nginxにbasic認証を追加
- WordPress(サーバー)の移設方法
- CloudFlareを使ってDDos対策を行う
- おすすめレンタルVPSサーバー
※こちらの記事が見ることが出来なくなった時のミラーです。
初期設定・セキュリティ設定
VPSの設定は、PoderosaというWindows用SSHクライアントを使用して作業していきます。
Download: Poderosa - Browse /beta at SourceForge.net
さくらのVPSでWordPressを動かそう – 初期設定・セキュリティ設定編 - - UKLab開発者ブログ
こちらを参考に設定します。
サーバーに接続する
1.Poderosaを起動してサーバーに接続

ファイル→新規Telnet/SSH接続をクリック
VPS契約完了時に届いている情報をもとに、ホスト名、アカウントパスフレーズを埋めます。

- ホスト名:メールに書いてあるサーバーのIPアドレス
- プロトコル:SSH2
- ポート:SSH(22)
- アカウント:メールに記載のユーザ名(root)
- 認証方法:パスワード
- パスフレーズ:メールに記載の初期パスワード
「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アドレス
- アカウント:作業用ユーザー
- パスフレーズ:鍵生成時に設定したパスフレーズ
- 認証方法:公開鍵
- 鍵ファイル:…を押して保存した秘密鍵を選択する
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 の新しいバージョンが提供されています。アップグレードの検討をお奨めします。最新バージョンは 4.3.12 で、2015-03-14 にリリースされています。」
このメッセージは「4.3.12」をインストールしているので無視してOK
「You are using an incomplete translation, please help to make it better by contributing.」
このメッセージは「翻訳が不完全なので協力して下さい。」というものなので無視してOKです。
WordPress(サーバー)の移設方法
WordPressを他のVPSに移設する方法を説明します。
参考:WordPressで公開しているサイトのサーバーを変更する | WordPressならファーストサーバ
移行前のサーバーでの作業
1.移設元のVPSからMySQLのデータベースをエクスポート
「phpMyAdmin」にログインし、WordPressのDB(ここではwp)を選択します。
2.「エクスポート」メニューで詳細設定に切り替え、以下の設定をします。

- テーブルを全て選択
- 出力をファイルに保存する
- 「DROP TABLE/VIEW」を追加するオプションを選択
- 圧縮や文字コードの変換などは行わないように設定
移行後のサーバーでの作業
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
月額:972円(税込み)初期費用:1,620円 メモリ:1GB HDD:100GB CPU:2コア
メリット:比較的バランスの取れた料金とサポート、コンソールが操作しやすい
デメリット:スペックがやや劣る、DDosなどに弱い
GMOクラウドのVPS
月額:1,010円(税込み)初期費用:4,320円 メモリ:2GB HDD:100GB CPU:3コア
メリット:さくらVPSのようなI/O負荷による制限などがない、十分なスペックでアダルトもOK
デメリット:初期費用が高い、コンソールがJava 7にしか対応していない
お名前.com VPS
月額:1,420円(税込み)初期費用:1,728円 メモリ:2GB HDD:200GB CPU:3コア
メリット:スペックが一番高い、コンソールも操作しやすい、記事執筆時初期費用が無料
デメリット:月額が高い
ServersMan@VPS
月額:505円(税込み)初期費用:無料 メモリ:1GB HDD:50GB CPU:1コア(2コア?)
こちらは試していませんが、格安プランとして紹介します。
メリット:月額・初期費用ともに安い、上位プランにそのまま引き継げる
デメリット:スペックが低い(安いプランなので)、安定性に難ありとの評価が見受けられる
それぞれお試し期間があるので、自分が納得行くもので心機一転もしくはレンタルサーバーからの移転などしてみてはいかがでしょうか?
かなりのボリュームになりましたが、参考になれば幸いです。