MEMORVA

さくらのレンタルサーバ(スタンダードプラン)からエックスサーバーへ引越し

更新:

さくらインターネットのレンタルサーバ(スタンダードプラン)からXSERVER(エックスサーバー)へサイトを移したのでサーバーの違いをメモしておく。

さくらとエックスサーバーの違い

さくらで使えるRapidSSL(ラピッドSSL)は安価で良いが、1台のサーバーに複数のドメインを使い、それぞれSSLを導入する場合、ドメインごとに費用がかかる。 その点 Let's Encrypt ならドメインが複数あっても無料だ。 というわけで、今まで通りさくらも使うが、エックスサーバーX10(スタンダード)プランも併用することにした。 スペックが良くてもさくらと比べて料金が2倍になるのは痛いが、リスクの分散というか、急に別のレンタルサーバーが必要になったとき、使い慣れていれば慌てないで済む。

記事を書いた7月時点ではさくらも併用していたが、その後コアサーバーも Let's Encrypt に対応したため、新コアサーバーとエックスサーバーを併用する体制にし、10年以上使ってきたさくらを使うのを止めた。 ここではコアサーバーについて書かないが、エックスサーバーと同等の作業で、ほぼ変更なしで移行できた。

私のサイトはPHPを使った自作のプログラムで組んでいて、WordPressなどのCMSは使っていない。 また、MySQLなどのRDBMSも使っていない。 そういうサイトを引っ越す際の注意点や気づいた点をメモしておく。

ホスト名の取得と逆引き

$_SERVER['REMOTE_HOST'] でホスト名が取得できない

PHPでリモートホスト名を取得する場合、以下のように書く。

echo $_SERVER['REMOTE_HOST'];

ただし、サーバーによって取得できたりできなかったりする。 さくらのレンタルサーバでは取得でき、エックスサーバーではデフォルトでは取得できない。 これは Apache の http.conf に以下のような記述があり、これを On にすると取得できるようになる。

HostnameLookups On

ただ、レンタルサーバーでは http.conf が編集できない。 また、.htaccess に記述してもエラーになる。 そこで解決策として、PHP内では以下のように gethostbyaddr() 関数を使用することにした。

echo gethostbyaddr($_SERVER['REMOTE_ADDR']);

ここからが重要。 エックスサーバーにサイトをいくつか移設した後、$_SERVER['REMOTE_HOST'] でホスト名が取得できているサイトを見つけた。 同じ設定のはずなのに、サイトによってホスト名が取得できるものとできないものがある。 違いを探してみると、どうも以下のように .htaccess の deny from にドメイン名(ホスト名)を指定した行が1行でもあると、ホスト名を取得するようになるようだ。

deny from .example.com

この場合 gethostbyaddr() を使う必要はなくなる。 まあ、取得の可否に関わらず、制御文などで REMOTE_HOST が取得できない場合に gethostbyaddr() で取得するようにすれば良いだろう。

.htaccess にホスト名

上述のように deny from にドメイン名(ホスト名)を指定しても問題なく動作する。 試しに自分のプロバイダのホスト名を指定して確認すると良い。 エックスサーバーや新しいコアサーバーは Apache 2.4 系だが、Require だけでなく今まで通りの allow や deny も使えるので、.htaccess を書き換える必要はなかった。

deny from .kanagawa.ocn.ne.jp

ちなみに .htaccess は管理画面でも編集できるが、ローカルで編集してFTPなどでアップロードしても良い。

アクセスログにホスト名

エックスサーバーはさくらと同様、Apache のアクセスログを取得できるが、デフォルトではIPアドレスが記録され、ホスト名は記録されない。 これも上述のように .htaccess の deny from にドメイン名(ホスト名)を指定すると、ホスト名が取得(逆引き)できるものに関してはホスト名が記録されるようになる。

error_reporting のエラー表示

PHP の php.ini にある error_reporting は、エックスサーバーでは初期状態で以下の設定になっている。

E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

php.ini はエックスサーバーの管理画面(サーバーパネル)にログインして編集できる。 デバッグをするにはエラー表示は便利だが、サーバーで動かす前にローカルなどで確認するだろうし、サイトではエラーを表示したくない人もいるだろう。 その場合は、管理画面の error_reporting のテキストボックスに 0(ゼロ)を入力する。 そうすると php.ini には以下のように記録される。

error_reporting = 0

その他の違い

ドメインごとに設定できる

1台のサーバーに複数のドメインを設定した際、さくらは基本的に1台のサーバー共通の設定が各ドメインに適用されるが、エックスサーバーは基本的にドメインごとに設定できる。 例えば、同じサーバーでもドメインごとに使用するPHPのバージョンを指定できる。 php.ini の設定もドメインごとに指定できる。 この点はさくらより便利だ。 ただし、サブドメインは元のドメインと共通の設定になる。

変数 HTTP_HOST の www ありなし

さくらで RapidSSL 導入後、URL に www が付いても付かなくても変数 {HTTP_HOST} は www なしのアドレスが取れる。 これを一方に統一する場合 .htaccess だけではできず、管理画面で小細工する必要がある。

PHPによる表示
echo $_SERVER['HTTP_HOST'];

一方エックスサーバーは Let's Encrypt 導入後、{HTTP_HOST} で www ありとなしが区別できるので、.htaccess だけで一方に統一できる。 以下は .htaccess の記述例。

wwwなしに統一
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

wwwありに統一
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Let's Encrypt

エックスサーバーでの Let's Encrypt の設定については SSL設定 に書かれている。 ここの説明によるとページリダイレクトを設定している場合、自動更新に失敗する場合があると書かれている。 とりあえず、http の www ありなしを統一する設定のまま、Let's Encrypt を申請したところ特に問題なく設定が終わった。 その後、Let's Encrypt の更新時期がきたが、特に問題なく更新されていた。 私は www ありに統一しているサイトと www なしに統一しているサイト両方持っているが、どちらも問題なかった。

RewriteRule や GD

Apache や PHP は同じとはいえ、モジュールの有無や設定の違いがあると動作が異なる場合がある。 ただ、私のサイトに関しては変更が必要な箇所はなかった。 RewriteRule はさくらで使っていた記述のまま。 一部画像の出力に使っている GD も同じように動作している。

サブドメイン

さくらでマルチドメインにする場合は自分でディレクトリを作って指定する。 一方エックスサーバーではドメインを追加するごとに、ホームディレクトリの下にドメインのディレクトリが自動的に追加される。 さらにサブドメインを追加すると、元のドメインの public_html の下にサブドメインのディレクトリが追加される。 詳しくは サブドメイン設定 に書かれているが、http://abc.example.com/ は http://example.com/abc/ でもアクセスできてしまう。 http://abc.example.com/ のみアクセスできるようにする設定は、そのページにも書かれているが、この仕様は好みが分かれそうだ。

FTP(FTPS)

FTP については FTPソフトの設定 に書かれていて、左側のメニューに FFFTP や FileZilla の設定例がある。 FileZilla については、さくらではデフォルトでSSHが使えるので、転送プロトコルにSFTP(SSH)を使用している人もいるかもしれない。 エックスサーバーはデフォルトではSSHがオフで、管理画面でオンにできるが、オフのままの場合、FTP(FTP over TLS)を選んで転送することになる。 余計な穴を増やしたくない場合はオフのままが良いかもしれない。