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

      2017/03/17


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



目次
  1. 初期設定・セキュリティ設定
  2. nginxベースの高速なVPS環境を構築
  3. 最新版のphpMyAdminをインストール
  4. nginxにbasic認証を追加
  5. WordPress(サーバー)の移設方法
  6. CloudFlareを使ってDDos対策を行う
  7. おすすめレンタル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)
  • 認証方法:パスワード
  • パスフレーズ:メールに記載の初期パスワード
※お名前.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 [email protected] 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 [email protected] 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コア

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

デメリット:月額が高い

[email protected]


VPSならDTI|月額467円(税抜) メモリ1GB|[email protected]

月額:505円(税込み)初期費用:無料 メモリ:1GB HDD:50GB CPU:1コア(2コア?)

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

メリット:月額・初期費用ともに安い、上位プランにそのまま引き継げる

デメリット:スペックが低い(安いプランなので)、安定性に難ありとの評価が見受けられる

それぞれお試し期間があるので、自分が納得行くもので心機一転もしくはレンタルサーバーからの移転などしてみてはいかがでしょうか?

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

 

この記事が気に入ったら
いいね!しよう

最新情報をお届けします

Twitter でWillFeelTipsをフォローしよう!


  関連記事

WordPressなどのブログで自分のサイトがはてブされた時に通知される設定方法

はてなブックマークは、自分のためにブックマークしておくだけではなく、コメント(ブ ...

[WordPress]カスタムSNSボタンで画像付きツイートを行うTwitterボタンの作成方法

WordPressでカスタムSNSボタンを利用した「画像付きツイートを行うことが ...

Facebook「フィード購読」ボタンの設置方法

2011/12/09、Facebookの「フィード購読」ボタンが外部サイトに設置 ...

冬季限定!ブログに雪を降らせるScript「SnowParticle」を設置しました

[PHOTO:BRANIMIR JAREDIC - summers gone I ...

「この記事が気に入ったらいいね」をブログに設置する方法

記事の最後にFacebookページヘのいいね!やTwitterのフォローボタンを ...

 - WordPress