[nginx] WordPressでパーマリンク変更をした時のリダイレクト設定

WordPressのパーマリンク設定を変更したら、リダイレクトの設定をサーバー側(もしくはプラグイン)でする必要があります。

今回は、nginxでリダイレクト設定をする時の

目的:旧URLから新URLに301リダイレクトする

nginxのrewriteを使って301リダイレクト(恒久的なリダイレクト)をしてみます。

「数字ベース」から「カスタム構造」に変更した時などには、忘れずにリダイレクトしておきたいです。

記事ページに関しては、

(旧) http://web-tsukuru.com/archives/123
(新) http://web-tsukuru.com/123

また、タグを設定していたので、

(旧) http://web-tsukuru.com/archives/tag/tag-name
(新) http://web-tsukuru.com/tag-name

とリダイレクトするように設定します。

解決策:default.confにrewriteルールを追記

nginxの設定ファイルがある/etc/nginx/conf.dにあるdefault.conf(*1)に設定を追記します。

serverブロック内にlocationディレクティブを追記し、その中にrewriteルールを設定することでリダイレクトできます。

*変更する設定ファイルはサーバーによって変更してください。

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

Proxy Cacheを使っているので、ポート80のほうのserverブロックに以下のように追記します。

location ~ /archives/ {
    rewrite ^/archives/(.*)$ /$1 permanent;
}

locationで/archives/以下をリダイレクトするように設定。リライトルールは以下のように記述します。

rewrite リダイレクトするディレクトリ リダイレクト先 リダイレクトの種類;

今回、リダイレクトするディレクトリはarchives/%post_id%とarchives/tag/%tag%なので、^/archives/(.*)$とする。

()$で囲った部分は、$1のように変数として使用できます。リダイレクト先は今回ドメイン直下にしたので、/$1というように変数を使って指定します。

具体的には、/archives/123にアクセスがきた場合は$1変数には「123」がはいり、/123にリダイレクトされます。

追記したらnginxを再起動すればリダイレクトの設定は完了です。

service nginx restart

さくらのレンタルサーバーにSSH接続とファイル転送してみる

実は、「さくらのレンタルサーバー」にはSSH接続ができるんです。ファイル転送するのもいいですが、ターミナルを使いたい場合もありますよね。

「さくらのVPS」にSSH接続するのとは、少し違うの注意が必要です。

さくらのレンタルサーバーにSSH接続してみる

FTPサーバ名     : sample-account.sakura.ne.jp
FTPアカウント   : sample-account
FTP初期フォルダ : www
サーバパスワード: samplepassword

契約時にメールで送られてきたサーバ名、アカウント(FTPアカウントと同一)とサーバパスワードを使ってSSH接続してみます。

別に難しいことはなく、「ssh アカウント@サーバ名」で接続できます。

ただし、レンタルサーバーなのでroot接続ができないという点には注意です。

$ssh sample-account@sample-account.sakura.ne.jp
	The authenticity of host 'sample-account.sakura.ne.jp (11.222.33.44)' can't be established.
	RSA key fingerprint is dd:86:2e:b3:ee:0e:79:b1:7f:ae:86:85:b6:f9:5b:04.

	Are you sure you want to continue connecting (yes/no)? yes
	Warning: Permanently added 'sample-account.sakura.ne.jp' (RSA) to the list of known hosts.

	sample-account@sample-account.sakura.ne.jp's password: 
	
	Last login: Fri Apr 25 16:37:17 2014 from kd124213.ppp-bb.dion.ne.jp
	FreeBSD 9.1-RELEASE-p9 (SAKURA16) #0: Wed Jan  8 21:05:11 JST 2014

	Welcome to FreeBSD!
$ exit

秘密鍵と公開鍵をローカルで作成

次に公開鍵と秘密鍵を作り、レンタルサーバーに転送します。

これをすることで、ssh接続時にパスワードを入力しなくて済むようになります。

$ cd ~/.ssh
$ ssh-keygen
// id_rsaとid_rsa.pubができていることを確認
$ ls
  id_rsa id_rsa.pub
// レンタルサーバーに転送する
// この時、id_rsa.pubを/home/sample-account/.sshにauthorized_keys2とリネームして転送
$ scp id_rsa.pub sample-account@sample-account.sakura.ne.jp:/home/sample-account/.ssh/authorized_keys2
// ssh接続してみる
ssh sample-account@sample-account.sakura.ne.jp

sshのconfigファイルを編集

次にsshのconfigファイルを編集して、さらに楽にssh接続できるようにします。

vi ~/.ssh/config

以下の内容を書き加えます。Hostの部分は任意の文字なので、sampleとしてもOKです。

Host sample-acount
  User sample-acount
  HostName sample-acount.sakura.ne.jp
  Port 22
  IdentityFile ~/.ssh/id_rsa

上書き保存したら「ssh [設定したHOST名]」で接続できます。

ssh sample-account

今回はこれで接続できれば完了です。

さくらのレンタルサーバーにファイル転送する

さっき使ったscpコマンドを使って、ファイル転送をします。ひとつずつファイル転送するのは面倒なので、ディレクトリごと回帰的に転送してしまいましょう。

sudo scp -i ~/ssh/id_rsa -r [転送元] [アカウント名]@[ホスト名]:[転送先]

というコマンドになります。

今回は、WordPressのwpex-prontoというテーマを転送することにします。

$ sudo scp -i ~/.ssh/id_rsa -r ~/vagrant/wordpress/wordpress/wp-content/themes/wpex-pronto sample-account@sample-account.sakura.ne.jp:/home/sample-account/www/wp/wp-content/themes

これで転送が完了です。

あとは、bashrcなどにエイリアスや関数を設定すればさらに便利になります。

AWSにscpでファイル転送したらPermission deniedされてググった

AWSにWordpressをインストールできたので今回はEC2サーバーにファイル転送をするところまで。

少しつまずいたので、その解決策も含めてご紹介します。

EC2にssh接続をしてみる

まずはダウンロードしたpemファイルを任意のディレクトリにコピー。

$ cp blog_sample.pem ~/.ssh/blog_sample.pem

ssh接続をしてみます。

「ssh -i {.pemファイル} ec2-user@{Public DNS}」で接続できます。

Public DNSはAWSのコンソールの以下の赤枠のところで確認できます。

$ ssh -i ~/.ssh/blog_sample.pem ec2-user@ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com

The authenticity of host 'ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com (54.199.188.193)' can't be established.
RSA key fingerprint is 1b:10:ae:e5:9e:60:ad:01:83:32:ca:ef:97:0a:68:93.
Are you sure you want to continue connecting (yes/no)?

このような画面が出るので、yesと入力してEnterします。
すると以下の様なエラーが出てしまいました。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/yuichi.iwayama/.ssh/blog_sample.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /Users/yuichi.iwayama/.ssh/blog_sample.pem
Permission denied (publickey).

pemファイル(Private Key Files)のアクセス権限がオープンすぎると怒られてしまいました。

なので、chmodでアクセス権限を変更して再度ssh接続します。

$ chmod 400 ~/.ssh/blog_sample.pem
$ ssh -i ~/.ssh/blog_sample.pem ec2-user@ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/

↑のような表示が出てssh接続ができました。

ssh接続できることが確認できたので、一旦接続を切ります。

$ exit

sshのconfigに設定を追加
毎回長いコマンドを打つのは面倒なので、設定をします。

sudo vi ~/.ssh/config

viで以下のように追記します。

Host blog_sample
  User ec2-user
  HostName ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com
  Port 22
  IdentityFile ~/.ssh/blog_sample.pem

これで上書き保存すると、

ssh blog_sample

とするだけでssh接続ができるようになります。

問題:EC2にscpでファイル転送するとpermission deniedとなる

ここまでできたところで、ファイル転送をしてみます。
Macの場合は、ターミナルからscpコマンドでファイル転送をすることができます。

AWSの公式マニュアルどおりにターミナルからscpでファイル転送をしてみます。
インストールしたWordPressのthemes以下に新しいテーマ(sampleディレクトリ)を転送してみましょう。

$ sudo scp -i ~/.ssh/blog_sample.pem -r sample ec2-user@ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com:/var/www/vhosts/i-fefef5f8/wp-content/themes

scp: /var/www/vhosts/i-fefef5f8/wp-content/themes/sample: Permission denied

* i-fefef5f8はインスタンスID

Permission deniedととなり転送ができない。

解決策:chmodで権限を変更する

ただの権限のエラーだったので、chmodコマンドですべてのユーザーがアクセスできるように権限を変更してexit。

$ ssh blog_sample
$ cd /var/www/vhosts/
$ sudo chmod -R 777 i-fefef5f8
$ exit

これでもう一度ファイル転送をしてみると。

$ sudo scp -i ~/.ssh/blog_sample.pem -r sample ec2-user@ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com:/var/www/vhosts/i-fefef5f8/wp-content/themes
sample.txt   100%   0   0.0KB/s   00:00 

転送できた!