1ページのロードに3秒以上かかるようになってしまったBLOGをお名前.com上に引っ越そうと考えています。選択基準は他のサイトの運用で2年強利用しており、満足度が高い為です。まずは、この投稿ではVPSを借りてwordpressをインストールするところまで進めます。セキュリティについても配慮して設定します。
対象としているインストール方法
- WordPressの新規インストール
- WordPress運用サーバの移転(この投稿では、インストールまでしか実施していません)
申し込み
単純に、お名前.comレンタルサーバーから申し込みを行います。迷う所は特にありません。メモリ1Gのプランだと、少々性能に不安が残るので、今回は何時も借りている2Gのプランにしました。支払方法は、毎月、6か月、1年とありますが、GMOインターネットの株主優待を使うつもりなので、6か月で申し込んでいます。
Ubuntu14.04 LTSのセットアップ
デフォルトですとCentOS 6.2と言う古いディストリビューションが使われているため、wordpress以外の用途で使おうとした場合に、古いパッケージしかパッケージ管理ソフトのyumでダウンロードできない事も考えられます。今回は折角なので、2019年4月までの長期サポート版であるUbuntu 14.04 LTSに入れ替えてセットアップします。
お名前.comのVPS上への手順は下記の通り
- デフォルトでインストール可能なCentOSをセットアップする(お名前.comのシステム上、必ずセットアップしなくてはいけないらしい)
- VPSにマウントするディスクイメージをUbuntu14.04にする
- VPS再起動
- Ubuntu14.04のセットアップディスクからブートされる
- Ubuntu14.04を普通にインストールする
VPSの契約完了後に、サーバーNAVIへのログインURLが送られてくるので、ログインします。
契約したVPSのプランを選んで、コントロールパネルにログインします。
ログインしたら、サーバーリストより、対象サーバを選びます。
OS再インストールのタブから、OSイメージとして、Ubuntu14.04 LTSを選びます。
ディスク構成はそのままでOK。
実行を押す。
再インストールの準備が出来たと表示されたら、サーバーリストに戻ります。
おそらく、お名前.com契約時のデフォルトのCentOSが起動しているので、再起動します。再起動すれば、先ほどマウントしたCDイメージからインストーラが立ち上がるので。
インストーラが立ち上がったら、普通にインストールを始めます。
言語は日本語で。
多少、英語表記の箇所が残っているだけです。はいを選びます。
地域。日本ですよね。
キーボードの設定をします。
普通は日本語を選んでください。当方は英語版キーボードなので、USを選びました。
ホスト名を設定します。好きな名前を入れてください。『.(ドット)』区切り等はやめて普通に入れた方が良いです。後でドット表記を直すのが面倒なので・・・
アーカイブミラー。日本です。
jp.archive.ubuntu.comを選択。
HTTPプロキシは必要ありません。そのままenterで。
一般ユーザーをセットアップします。好きなアカウント名を入力してください。
パスワード。
パスワード再入力。
ホームディレクトリの暗号化。いいえで。
ディスク全体を使うを選択。
仮想ディスク1を選択します。仮想ディスク2は、今度、DBが肥大化するならDBへ。画像や動画置き場が肥大化するようならそれらの格納先に割り当てられるように、取りあえずは使わずにおいておきます。(これ、多分お名前.comでのディスク使用効率の問題から、このまま進めた方が運営側といてはうれしいんだと思います。)
削除します。どうせ何もデータは入っていないので。
書き込み。はいを選択。
そのまま、enterキーで。
はいを選択。
自動的にアップデートでも良いですが、自動的にアップデートさせずに、必要に応じて手動でアップデートした方が良いです。
アップデートは、apt-get updateと、apt-get upgradeコマンドを叩くだけなので。
openSSHのみインストールしておきます。
GRUBをインストールします。
そのままはいで。
続けるを押します。ただ、お名前.comのCD、勝手に取り出してくれないようで、再起動後にまたインストーラが実行されます。なので、下記の順番で捜査してください。ボタンは下図の赤枠の所です。
- シャットダウン
- 『取り出す』
- 起動(起動が押せない場合には、30秒ほど待ってから、他の画面に移動してから、再度画面を読み込み直せばいいと思います。)
以上でインストール完了です。
ブラウザ上から、VPSにVNCでアクセスして操作できるようになっています。マウスクリックすれば利用できます。
こんな感じにログイン画面が表示されます。
ファイアウォールの設定と、ウェブサーバ、DBサーバの用意
VPSにOSをインストールした後は、下記のような設定をします。
- IPアドレスを設定する(DHCPで契約しているサーバにIPをふってくれているので、何もしなくてOK)
- IPv6の無効化
- SSHの設定
- ファイアウォールの設定
- パッケージの更新
IPv6の無効化
IPv6を意識していなかったために、IPv4の方はファイアウォールをきっちり設定したにも関わらず、IPv6を忘れていて、そちらが全通信を許可していた等の悲しいことにならないように無効化しておきます。
※ まだIPv6の移行期で、対応するメリットは無く、逆に対応時の設定ミスによるセキュリティ上のデメリットの方が大きいと判断しています。
sudo su - echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf reboot
SSHの設定
SSHの設定も早めに実施しておきます。
sudo vi /etc/ssh/sshd_config
デフォルトの設定値から、最低限変更すべき設定。
# 0.0.0.0とする事で、IPv4のみを待ち受けるようになる ListenAddress 0.0.0.0 # rootログインと空パスワードの禁止 PermitRootLogin no PermitEmptyPasswords no # X11転送はしないのでnoにしておく X11Forwarding no
ファイアウォール(iptables)の設定
ファイアウォールの設定にはポリシーがあります。
- 原則許可・・・有害な通信をはじく設定をし、最後まではじかれなかったパケットを許可する設計です。このポリシーは選んではいけません。理由は有害な通信パターンを完全に把握する事は出来ない為、必ず抜け・漏れが出てしまうからです。
- 原則拒否・・・通信を許可していいルールを明示し、それ以外を全部拒否する設計です。
原則拒否のルールで設定します。SSH(22番ポート)については、少し悩みどころで、wordpressの入ったサーバがクラックされるリスクを極小にしつつ、SSHも使いたい場合には、固定IPを使えるプロバイダを契約し、その固定IPからしか接続を受け付けないようにするのが良いと思います。そうでない場合には、SSHのポート番号を2012等の適当な番号に変更し、SSHでのログインには公開鍵を使う事で、ある程度のセキュリティを確保できます。また、セットアップ完了後、お名前.comのコントロールパネルからのみコンソールにアクセスできるようにし、SSHを無効化してしまうのも手です。
# local(127.0.0.1)通信は通す。 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # SSHでログインする場合、<管理用PCのIP>に自分のIPを入れてコメントアウトを外して実行してください。 # 管理用PCが動的IPの場合は苦肉の策で、コントロールパネルからのアクセスしか使わないようにするか、 # SSHの待ち受けポート番号をずらし、公開鍵認証にするかの何れかでセキュリティを高めます。 # iptables -A INPUT -i eth0 -s <管理用クライアントのIP> -p tcp -m multiport --dport 22 -j ACCEPT # iptables -A OUTPUT -o eth0 -d <管理用クライアントのIP> -p tcp -m multiport --sport 22 -j ACCEPT # 下記、<管理用クライアントのIP>のSSH設定を使えない場合に使います。 # ただし、どこからでもSSHを許可してしまっているので、セットアップが完了したら削除してください。 # 削除するときは、/etc/iptables.rulesの該当行を消して、再起動すればOKです。 iptables -A INPUT -i eth0 -p tcp -m multiport --dport 22 -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sport 22 -j ACCEPT # サーバから外側へのTCP通信を許可する。DNS、HTTP、HTTPSを許可しています。 iptables -A INPUT -i eth0 -p tcp -m multiport --sport 53,80,443 -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --dport 53,80,443 -j ACCEPT # サーバから外側へのDNS通信を許可する。 iptables -A INPUT -i eth0 -p udp -m multiport --sport 53,67,68,123 -j ACCEPT iptables -A OUTPUT -o eth0 -p udp -m multiport --dport 53,67,68,123 -j ACCEPT # 外からサーバへのHTTP、HTTPS通信を許可する。wordpressを公開する為に必要です。 # multiportを使う場合、エフェメラルポートが異なるOS同士での仕様差なのか、 # 通信がブロックされるケースがあったので、全部のポートを指定して通信を許可した。 # iptables -A INPUT -i eth0 -p tcp -m multiport --dport 80,443 -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp -m multiport --sport 80,443 -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 80 -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 --sport 80 -j ACCEPT # SSLは必要なら通す。 iptables -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 443 -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 --sport 443 -j ACCEPT # ICMPは0と8だけでPINGは通るのですが、その他関係ありそうなものを通す。 # -N ICMPとしているのは、新しいICMPと言うテーブルを定義しています。 # その下で、icmpパケットのみ -j ICMPとして、そのテーブルに処理を渡しています。 # こうすることで、処理負荷を軽減しています。 iptables -N ICMP iptables -A ICMP -p icmp --icmp-type 0 -j ACCEPT iptables -A ICMP -p icmp --icmp-type 3 -j ACCEPT iptables -A ICMP -p icmp --icmp-type 4 -j ACCEPT iptables -A ICMP -p icmp --icmp-type 5 -j ACCEPT iptables -A ICMP -p icmp --icmp-type 8 -j ACCEPT iptables -A ICMP -p icmp --icmp-type 11 -j ACCEPT iptables -A ICMP -p icmp --icmp-type 13 -j ACCEPT iptables -A ICMP -p icmp --icmp-type 14 -j ACCEPT iptables -A INPUT -p icmp -j ICMP iptables -A OUTPUT -p icmp -j ICMP # 上記の全部のルールに該当しなかった場合には拒否する。 # こうする事で、iptablesの設定を短く出来る。 iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # iptablesのルールを/etc/iptables.rulesにセーブします。 sudo sh -c "iptables-save > /etc/iptables.rules" # インターフェースの起動時にファイアウォールのルールを自動的に適用するように設定します。 echo "pre-up iptables-restore < /etc/iptables.rules" >> /etc/network/interfaces
nginx、mysql、php5-fpmのインストール
今回は、Apacheの代わりにnginxを使います。nginxとwordpressで検索してもらうと、『爆速』や『○倍の速度になった』等がヒットすると思います。つまり、速いんです。
sudo apt-get update sudo apt-get upgrade sudo apt-get install nginx php5-fpm php5-cli mysql-server mysql-client php5-mysql vim ntp sudo apt-get clean # php.iniのすべてに対して、disable_functionsのコメントアウトと、date.timezoneの設定を行う。 # findでphp.iniを検索して、他にも該当ファイルがあればそれらも修正してください。 sudo find /etc/php5 -name php.ini sudo cp /etc/php5/fpm/php.ini /etc/php5/fpm/php.ini.bak sudo sed -i 's/;date.timezone =/date.timezone = "Asia/Tokyo"/g' /etc/php5/fpm/php.ini sudo cp /etc/php5/cli/php.ini /etc/php5/cli/php.ini.bak sudo sed -i 's/;date.timezone =/date.timezone = "Asia/Tokyo"/g' /etc/php5/cli/php.ini # MySQLのデフォルトのロケールをUTF-8にしておく sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak sudo sed -i 's/[client]/[client]ndefault-character-set=utf8/g' /etc/mysql/my.cnf sudo sed -i 's/[mysqld]/[mysqld]ncharacter-set-server=utf8/g' /etc/mysql/my.cnf sudo service mysql restart # MySQL上にデータベースを作成して、ユーザー登録しておく。'yourpassword'は # WordPressがMySQLに接続する為のパスワードです。適度に変更してください。 mysql -uroot -p create database wp; grant all on wp.* to wp@localhost identified by 'yourpassword'; flush privileges;
nginxの設定
/etc/nginx/sites-available/defaultの内容を下記のように修正してください。これは最小限の構成です。サーバ全体の動作確認が終わった後に、WordPress用のnginxの設定を『WordPress用nginxの設定 with SSL』を参照して詰めます。
server { listen 80 default_server; # IPv6は使わない。 #listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/wordpress; index index.html index.htm index.php; # 適宜、名前を変えてください。defaultでも良いです。 server_name eco.senritu.net; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }
nginxを再起動させる。
sudo service nginx restart
WordPressのセットアップ
ここから、WordPressのセットアップです。WordPressは頻繁にバージョンアップする為、オフィシャルサイトから、最新版のURLをコピペしてwgetのファイル名は適宜置き換えてください。
sudo apt-get install unzip cd /usr/share/nginx sudo wget http://ja.wordpress.org/wordpress-3.9.1-ja.zip sudo unzip wordpress-*.zip sudo chown -R www-data wordpress cd /usr/share/nginx/wordpress sudo mv wp-config-sample.php wp-config.php sudo vi wp-config.php
wp-config.phpの中身は下記のように修正する。
..... define('DB_NAME', 'wp'); define('DB_USER', 'wp'); define('DB_PASSWORD', 'yourpassword'); define('DB_HOST', 'localhost'); define('DB_CHARSET', 'utf8'); define('DB_COLLATE', ''); ...... # キーは、openssl rand -hex 10を実行するとランダムな値が取得できるので、 # それを設定すれば良いでしょう。キーボードをガチャガチャやるだけでも良いです。 define('AUTH_KEY', 'e8e1c133ff9728788497'); define('SECURE_AUTH_KEY', '87c43c2781797f7555b0'); define('LOGGED_IN_KEY', '19898bd1aa54b6f2f412'); define('NONCE_KEY', 'f25a15103e446a5e4ea4'); define('AUTH_SALT', '8374c586b622fc141fcb'); define('SECURE_AUTH_SALT', '1c1af97d58f455b4590c'); define('LOGGED_IN_SALT', '74361cf1e0c1c3006885'); define('NONCE_SALT', 'dcbd7eb3c5cd8de056f7'); ......
IPアドレスを確認して、ブラウザでアクセスする。
ifconfig
ウェブブラウザでWordPressの初期設定を行う
http://IPアドレス/
にアクセスすれば、WordPressの初期設定画面が出てくるはずです。下記のような画面が出たら、設定を済ませましょう。
画像をアップロードしてみる。
適当なブログを投稿して、画像のアップロードをしてみてください。
ファイアウォールの設定やSSH、MySQLで許可している通信を確認する
これは大事です。再起動し、設定内容が再起動後も適切である事を確認し、余計なポートが空いていないかなども確認します。
# まずは再起動します。 sudo reboot
再起動後、iptables の設定内容を確認します。本投稿の通りに実施していれば、SSHの設定以外は下記のようになっているはずです。
sudo iptables -L -n # Chain INPUT (policy DROP) # target prot opt source destination # ACCEPT all -- 管理用PC 0.0.0.0/0 multiport sports 22 # ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport sports 53,80,443 # ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 multiport sports 53,67,68,123 # ICMP icmp -- 0.0.0.0/0 0.0.0.0/0 # # Chain FORWARD (policy DROP) # target prot opt source destination # # Chain OUTPUT (policy DROP) # target prot opt source destination # ACCEPT all -- 0.0.0.0/0 管理用PC multiport dports 22 # ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 53,80,443 # ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 53,67,68,123 # ICMP icmp -- 0.0.0.0/0 0.0.0.0/0 # # Chain ICMP (2 references) # target prot opt source destination # ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 0 # ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 3 # ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 4 # ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 5 # ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 # ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 11 # ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 13 # ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 14
次に、iptablesのルールが格納されているファイルを見ます。
sudo vi /etc/iptables.rules
/etc/iptables.rulesの中身
管理用PCとなっている個所(もしくは、sports/dportsが22となっている個所)は、SSHの通信の許可ルールです。お名前.comのコントロールパネルからウェブブラウザでコンソールにアクセスする場合には、削除して再起動してください。そうでなければそのままでOKです。
*filter :INPUT DROP [273:14174] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] :ICMP - [0:0] -A INPUT -s 管理用PC/32 -p tcp -m multiport --sports 22 -j ACCEPT -A INPUT -i eth0 -p tcp -m multiport --sports 53,80,443 -j ACCEPT -A INPUT -i eth0 -p udp -m multiport --sports 53,67,68,123 -j ACCEPT -A INPUT -p icmp -j ICMP -A OUTPUT -d 管理用PC/32 -p tcp -m multiport --dports 22 -j ACCEPT -A OUTPUT -o eth0 -p tcp -m multiport --dports 53,80,443 -j ACCEPT -A OUTPUT -o eth0 -p udp -m multiport --dports 53,67,68,123 -j ACCEPT -A OUTPUT -p icmp -j ICMP -A ICMP -p icmp -m icmp --icmp-type 0 -j ACCEPT -A ICMP -p icmp -m icmp --icmp-type 3 -j ACCEPT -A ICMP -p icmp -m icmp --icmp-type 4 -j ACCEPT -A ICMP -p icmp -m icmp --icmp-type 5 -j ACCEPT -A ICMP -p icmp -m icmp --icmp-type 8 -j ACCEPT -A ICMP -p icmp -m icmp --icmp-type 11 -j ACCEPT -A ICMP -p icmp -m icmp --icmp-type 13 -j ACCEPT -A ICMP -p icmp -m icmp --icmp-type 14 -j ACCEPT COMMIT
netstatコマンドで待ち受けているアドレス、ポート番号を確認します。
netstat -an # 稼働中のインターネット接続 (サーバと確立) # Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 # SSHを受け付けています。ただし、iptablesでフィルタしてれば問題ありません。 # tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN # ローカルホスト経由のみ、3306番ポートでMySQLにアクセス可能。問題なし。 # tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN # nginxによるHTTPサービスの提供。問題なし。 # tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN # ESTABLISHEDは接続中と言う意味です。これは、SSHでログインしているので表示されています。 # tcp 0 サーバIP:22 管理用PC:62720 ESTABLISHED # 下記の2つはDHCPCで利用しています。35752となっている方は、環境によって違います。 # lsof # udp 0 0 0.0.0.0:35752 0.0.0.0:* # udp 0 0 0.0.0.0:68 0.0.0.0:*
次の投稿に続きます。
本投稿ではお名前.comレンタルサーバーに申し込んでUbuntu14.04 LTSをインストールし、その上にnginx、MySQL、WordPressをインストールするところまでを解説しました。あまりにも投稿が長くなってしまうので、続きは『WordPress用nginxの設定 with SSL』でご紹介しています。