初めまして、日本システム技研のおかじまと申します。
新卒2年目のぺーぺー(死語)です。
仕事内容に踏み込んだ記事を、ということで、
今回は先日私が行った弊社ホームページのサーバー移行作業について書いていこうかと思います。
突然毛色の違いすぎる技術ブログみたいな話になってしまいますが大丈夫でしょうか?
不安ですが気にせずいきます。
作業内容
・Amazon Web Services (以下AWS)のEC2サーバをAWSの新アカウントへ移行。
・webサーバをApacheからNginxへ移行。
・証明書をLet's Encryptを用いたものに更新、自動更新の設定。
サーバー移行ついでにwebサーバーと証明書周りもリニューアルしちゃいます。
早速具体的な作業内容について書いていきます。
1.EC2インスタンスのアカウント移行
EC2の現在のサーバインスタンスを新アカウントへ移行します。
既存のインスタンスを選択し、イメージ>イメージの作成でイメージを作成します。
新アカウントへ作成したインスタンスイメージを共有するため、移行先の新アカウントのAWSアカウント番号を控えます。
ここで移行元のAWSアカウントに戻り、EC2のAMIメニューのイメージ一覧から作成したイメージを選択し、イメージのパーミッションの変更で移行先のAWSアカウント番号を入力。
これで移行先アカウントと作成したイメージの共有ができます。
移行先のAWSアカウントのAMIメニューで共有イメージを選択し、作成ボタンを押すとインスタンス作成が開始。旧アカウントのインスタンスと同様の設定をしていけば、EC2インスタンスの新アカウント移行は完了です。
セキュリティグループの設定やElasticIPの取得もしておきます。
2.サーバ切り替え準備
httpサーバの切り替え、証明書の更新に当たって必要なものを新サーバへインストールしていきます。
まずはNginxのインストール。
$ sudo yum install nginx
php,php-fpmのインストール。
$ sudo yum install php56 php56-fpm
Let's Encryptのクライアントcertbotの準備を進めます。
まずはopensslのアップデート。
$ sudo yum update openssl
virtualenvのインストール。
$ sudo yum install python-virtualenv
certbotのインストールと権限の変更。
$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
$ sudo chmod 700 /usr/bin/certbot-auto
これで必要なもののインストールは完了です。
続いてNginxの設定を変更します。
nginx.conf (/etc/nginx/nginx.conf) を修正します。
WordPressでカスタムパーマリンクを用いている場合はそれに合わせた設定が必要になります。
Nginxのconfファイルのserverに以下の一文を追加します。
try_files $uri $uri/ /index.php?q=$uri&$args;
この設定を行わないとどのリンクを踏んでも404 Not Foundが返ってきてしまいます。
次にSSL通信を行うためポート80からSSL通信のポートを用いるように変更し、
listen 443 ssl;
httpはhttpsにリダイレクトするように設定します。
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
最後にNginxとphp-fpmをsocketで接続するため、
Nginxのphp設定に以下の一文を追加
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
php-fpmの設定ファイルwww.conf(/etc/php-fpm-5.5.d/www.conf)には以下の一文を追加
listen = /var/run/php-fpm/php-fpm.sock
これで再起動を行えばnginx + php-fpmで wordpressを動かすことができます。
ただしこのままではメディアのアップロードができません。
/wp-content/uploadsの所有者と権限を変更する必要があります。
今までApacheで運用していたため/wp-content/uploadsの所有者はapacheさんになっています。
これからはnginxさんが操作するのでnginxさんを所有者に追加し権限を変更します。
sudo chown -R nginx wp-content/uploads/
sudo chmod 700 -R wp-content/uploads/
ここで一旦nginxは停止させ、
$ sudo service nginx stop
新サーバでの作業はストップです。
3.DNSの切り替え
まだ証明書の用意などしていませんがドメインの切り替えを行います。
旧アカウントからインスタンスをそのまま移行したので現在運用中のApacheや証明書の設定は健在です。
なのでApacheで動かしたまま裏で証明書やNginxの更新を行い、ダウンタイムを極力減らせるようにサーバの切り替えを行います。
DNSの切り替えの細かい作業内容については割愛します。
4.証明書作成
DNSの切り替えが終了次第新サーバでLet's Encryptを用いて証明書の作成を行います。
Let's Encryptとは無料で証明書の作成ができる証明局で、コマンドラインから簡単に証明書の発行、更新を行うことができます。
手順2でインストールしたcertbotで証明書を発行します。
$ sudo certbot-auto certonly --webroot -w /var/www/html -d example.com -m hoge@example.com
-wオプションの後にドキュメントルートのパスを指定、-dオプションの後にドメイン名を指定、
-mオプションの後にメールアドレスを指定します。簡単ですね。
--webrootオプションを用いると起動中のサーバで証明書を作成することができます。--standaloneオプションではcertbotに内蔵されているwebサーバを用いるため、利用するポートの関係で実行するにはサーバを停止する必要があります。
作成した証明書は /etc/letsencrypt/live/ドメイン名/ フォルダに配置されます。
作成した証明書をNginxの設定ファイルで指定します。
ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
Nginxの設定ファイルの構文チェックをし、サーバの切り替えを行います。
$ sudo nginx -t
$ sudo service httpd stop
$ sudo service nginx start
これでNginxへの切り替えと証明書の更新は完了です。あっという間です。
無事Let's Encryptの証明書に切り替わりました。
ですがまだ終わりではないです。
5.自動起動、自動更新の設定
サーバ動作に必要な物の自動起動設定を行います。
Apacheの自動起動設定を停止し、
$ sudo chkconfig httpd off
Nginxとphp-fpmの自動起動設定します。
$ sudo chkconfig nginx on
$ sudo chkconfig php-fpm on
続いて証明書の自動更新を設定します。Let's Encryptはrenewコマンドを使うことで発行済の証明書の更新を行うことできます。
まずは--dry-runオプションをつけてrenewの動作確認を行います。
$ sudo certbot-auto renew --dry-run
無事動作の確認ができたらcrontabの設定をします。
renewでは証明書の有効期限が30日以内に期限が切れるものを自動的に更新します。
--force-renewal という期限に関係なく全ての証明書の更新を行うオプションがありますが、何度も更新を行うと使用量制限にかかって一定時間使えなくなる可能性があるのでcronでの利用はやめます。
--post-hookオプションを用いることでrenew成功後に実行するコマンドを指定することが出来ます。
下記のようにcron設定をし、定期的に証明書の更新。更新が完了した場合は、Nginxの再起動を行うようにします。
00 00 * * 1 sudo certbot-auto renew --post-hook "sudo service nginx restart"
以上でサーバ移転、ApacheからNginxからの切り替え、証明証の変更、自動更新の設定は完了です。
Let's Encrypt便利ですね。
果たしてこんな記事でいいんでしょうか。
インフラ周りをやることは少なめですが、こういった業務を行うこともあります。
少しでもやっていることが伝われば、あわよくばサーバ移転をしようと思っている方やLet's Encryptを使おうと思っている方の手助けになればと思います。
参考文献
Let's Encrypt 総合ポータル
Nginx+PHP-FPMでWordPressを動かすときの設定(パーマリンク・アクセスログ対策)