ブログ

  • 【VALUE DOMAIN】サブドメインを別サーバーに設定【DNS】

    VALUE DOMAIN のDNS設定で、サブドメインを別サーバーに設定する方法の覚書です。

    サーバーは、CORESERVERを利用していますが、XREAでもバリューサーバーでも同様だと思います。

    なお、お約束ですが、作業は自己責任でお願いします。DNS設定は、デリケートなので、あくまでも慎重に。

    それでは、本題に。

    今回、実現したいことは、通常ドメインとサブドメインを別サーバーに振り分けて運用を行うことです。

    【具体例】
    ■ 通常ドメイン: example.com ・・・ x111.coreserver.jp
    ■ サブドメイン: blog.example.com ・・・ x222.coreserver.jp

    このように、サブドメインを通常ドメインとは異なるサーバーで運用するための方法です。

    このためには、VALUE DOMAINの「DNS情報変更」ページにて設定を行います。なお、今回は、ドメイン管理が、eNomの場合です。

    ドメインの自動設定をした場合、通常だと、次のようになっています。

    【元の自動ドメイン設定】
    (ホスト名) (ターゲット) (タイプ) (MX設定)
    *  /  202.172.67.112  /  A  /  10
    @  / mail.example.com. / MX  /  10

    サブドメインを別サーバーに設定するため次のようにします。

    【変更後のドメイン設定】
    (ホスト名) (ターゲット) (タイプ) (MX設定)
    @  /  202.172.67.112  /  A  /  10
    blog /  202.172.67.223  /  A  /  10
    mail /  202.172.67.112  /  A  /  10
    @  / mail.example.com. / MX  /  10
    簡単に説明しておきます。

    【変更前】
    変更前のドメイン設定については、説明は不要でしょう。ただ、サーバーのipアドレスについて、ご利用のサーバーの仕様を必ず確認してください。

    【変更後】
    1行目。ホスト名を@にしていますが、これは、「ホスト名無し」にする設定です。
    つまり、example.comでの運用です。wwwとかblogとか付かない形式です。なお、変更前の*はワイルドカードで「すべて」に適用されてしまいます。

    2行目。ホスト名をblogにして、運用したい別サーバーのipをターゲットに設定しています。つまり、blog.example.comのための設定です。必ず、別サーバーのipアドレスを仕様により確認してください。また、サーバー側では、ドメインウェブの設定を忘れずにしておきます。

    3行目。ホスト名をmailにして、mail.example.com. で運用できるようにするための設定です。これは、変更前が * のワイルドカードでホスト名「mail」にも適用されていたものを外したため必要になる設定です。つまり、1行目が@になった関係によるものです。

    4行目。変更前と変わらず。ただ、3行目とセットにならないとメールの運用ができないので注意が必要です。こうしないとメールが届きません。なお、変更前と同様、最後はピリオドがついています。

    (注意)上記の行数は、設定の際に入れ替わることがあります。

    一応、自分の場合には、これで、サブドメインを別サーバーに設定することができました。DNSの浸透には、だいたい、30分くらいかかった感じがします。15分から30分おきくらいに、DNSが反映されているか確認すると良いでしょう。

    ここまでで基本の作業は終了です。以下は単なる確認の作業です。

    【PINGで確認】

    SSHでログインして、pingコマンドを発行します。

    > ping -c 5 blog.example.com

    DNSが浸透している場合、次のレスポンスがあります。
    赤字のように新IPに変わっているのが確認できます。

    PING blog.example.com (202.172.67.223) 56(84) bytes of data.
    64 bytes from x222.coreserver.jp (202.172.67.223): icmp_seq=1 ttl=64 time=0.020 ms
    --- blog.example.com ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4011ms
    rtt min/avg/max/mdev = 0.020/0.029/0.043/0.009 ms

    DNSが浸透していない場合には、次のようになるか、又は、旧IPが表示されます。

    ping: unknown host blog.example.com

    【最後に】
    作業終了後は、複数の別のブラウザで、主ドメイン、サブドメインともに表示されるか確認します。また、ブラウザを開いたまま作業を続けると、DNSの変更がブラウザに反映されないことがあるので、一度、ブラウザを閉じると良いでしょう。

    さらに、両方のドメインにおいて、メールの送受信が可能かも確認します。

    最後にもう一度お約束ですが、この覚書について、当サイトでは責を負いません。自己責任でお願いします。また、もし間違っていたら、ご指摘くださるとありがたいです。

    以上です。

  • 【Linux】MySQLをgzipからインポートする方法【CORESERVER】

    MySQLのデータをgzip形式でエクスポートした場合、今度は、逆にインポート処理が必要になる場合があります。

    そこで、ここでは、gzip形式のバックアップファイルから、MySQLデータをリストアしてインポートする方法を覚書しておきます。

    なお、使用サーバーは、CORESERVERです。また、お約束ですが、ご利用は、自己責任でお願いします。あと、もちろん、phpMyAdminからインポートする方法等もありますが、ここでは取り上げません。

    ■ SSHでコマンドラインから実行する方法

    まず、SSHログインしていて、コマンドラインから実行するには次のコマンドでインポートが可能です。

    zcat /virtual/yours/backup/sample.gz |
    mysql -h localhost -u user --password=pass your_db

    上記スクリプトは、実質1行です。また、赤字は、ユーザー依存のデータであり、適当な値に置き換えが必要です。

    簡単に解説しておくと、zcatコマンドで、gzファイル(絶対パス)を開き読み込みます。その後、パイプ(|)でmysqlコマンドに渡し、読み込んだデータ(SQL)を処理します。

    SSHでコマンドラインからインポートすると処理が軽いので短時間でインポートが済むメリットがあります。

    ■ CRONから自動実行する方法

    次に、上記スクリプトを改良して、CRONから、実行できるようにしたスクリプトを紹介します。使い方としては、毎日バックアップしたデータから、日毎の最新データを毎日、自動的にインポートする処理等が考えられます。

    なお、これもCORESERVERで実行する場合です。shファイルとして保存し、CRON設定画面で処理ができるようにしておきます。例えば、import.shと保存して、CRON設定画面でファイル等を指定します。

    #!/bin/sh
    
    DATE=`date -d '1 days ago' +'%Y%m%d'` 
    EXT=.gz
    
    zcat /virtual/yours/db_backup/$DATE$EXT | 
    /usr/local/mysql/bin/mysql -h localhost
      -u user --password=pass your_db
    
    exit

    ピンクの文字は、bashの変数となっています。変数の前後にはスペースは入れません。また、gzファイルは、20140227.gzのように日付をファイル名にしておきます。

    ここでは、1日前のデータを利用したいので、’1 days ago’を指定していますが、これを消せば、当日のデータがインポートされます。

    最初のスクリプトと異なるのは、mysqlコマンドが絶対パスになっていることです。CORESERVERでは、CRONから実行する場合、絶対パスにしないと動作しませんでした。パスを解決できないからと思われます。

    なお、コマンドのパスを調べるには、whichコマンドで確認することができます。

    以上、MySQLをgzipからインポートする方法の覚書でした。

  • 【CORESERVER】共有SSLの注意点【HTTPS】

    かねてから、運営サイトのログイン機能をSSLで運用したいと考えており、本日、CORESERVERの共有SSLの導入に挑戦してみました。

    しかし、結論から言うと、失敗に終わりました。
    その顛末を覚書しておきます。

    失敗した最大の要因は、SSLページと非SSLページ間でのセッションの持ち回しが、ほぼ不可能だったからです。

    まず、前提です。例として、運営サイトのURLを下記のようにすると、SSLのURLは次のようになります。(CORESERVERの場合)

    http://example.com
    https://ss1.coressl.jp/example.com

    上記の運用で、ログインページをSSL接続して、認証に成功したら、非SSLページに遷移する方法を採用したかったのですが、駄目でした。

    理由は、先にも述べたように、SSLページと非SSLページ間でのセッションの持ち回しが、できなかったからです。

    なぜ、セッションの持ち回しができないのか?それは、ドメインが異なるため、セッションIDのクッキー(セッションクッキー)が、SSLと非SSLで引き継げないから。

    たとえ、SSLページで認証に成功して必要な情報をセッションに格納しても、非SSLページに遷移すると、そのセッションは使うことが出来ず、非SSLページにおける、セッションの中身は、空になっていました。

    言語は、PHPを使っていたのですが、そもそもクッキーの利用では、別ドメイン間で使用できなのは、仕様上、仕方ないようです。いわゆるクロスドメイン間のクッキー利用の制限。

    この対策として、裏技的に、非SSLページに遷移する際、クッキーのセッションIDを、GETパラメーター等として、送ることも出来ますが、これでは、SSLの意味がなくなってしまいます。むしろ、セッションIDがURLに露見することで、却って、セキュリティ上有害ともいえます。

    また、共有のSSLには、共有であるが故に、他の利用者とのクッキーの重複の問題や、なりすまし等の問題も少なからずあるようです。

    正当な対策としては、共有や共用でない、独自のSSL証明書を購入して、httpとhttpsでドメインが異ならない運用をするしかないようです。

    運営サイトで利益が十分にあれば、独自のSSL証明書の購入もできますが、そうでないと中々難しいですね。いずれにしても、遠くないうちに、独自SSLの導入を果たしたいと思います。

  • 【PHP】昨日・今日・合計カウンターのスクリプト【改訂版】

    PHPで作る「昨日・今日・合計カウンター」のスクリプトです。

    なお、以前、掲載したものの改定版です。
    http://webmaster.chielog.com/php/121.html

    この改訂版では、昨日より前にアクセスがない場合でも正常に処理できるようになっています。

    一応、自分の管理するサイトでは正常に動いているので問題の無いスクリプトだとは思うのですが、動かない人のために少々ですがヒントを。

    【ヒント】
    ・ ログファイルからログの行を取得する時、正しく取得してるかを出力して確認
    ・ ログファイルにログの行を出力する時、正しく出力してるかをログを見て確認
    ・ 入出力がおかしい時には、スクリプトの行ごとに変数の中身を確認してみる
    ・ 日付が適切な日付として記録されているか

    <?php
    
    //ログ形式は 日付け|昨日のカウント|今日のカウント|合計カウント
    
    $now_date = date('Ymd'); // 今日の日付
    $ydy_date = date('Ymd', strtotime('-1 day')); // 昨日の日付
    
    // カウンタ記録ファイル
    $count_log = dirname(__FILE__) .'/count.log';
    
    $dat = file($count_log); //ログを配列に読み込む
    
    if (!empty($dat)) {
    
        //変数を展開(比較用日付、昨日、今日、総合)
        list($key_date, $ydy, $tdy, $ady) = explode('|', $dat[0]);
    
        if ($key_date === $now_date) { //ログの日付が今日ならカウントアップ
            $tdy++;
    
        } elseif ($key_date === $ydy_date) { //日付が変わったら昨日に今日を、今日に1を入れる。
            $ydy = $tdy;
            $tdy = 1;
    
        } else { //ログの日付が今日でも昨日でもない場合(昨日以前最近のアクセスが0)
            $ydy = 0; //昨日のアクセスは0となる
            $tdy = 1; //今日の最初のアクセス
        }
    
        $ady++; //合計カウントアップ
    
        //桁数整形
        $ydy = sprintf('%05d', $ydy); //昨日
        $tdy = sprintf('%05d', $tdy); //今日
        $ady = sprintf('%08d', $ady); //合計
    
        //ファイル更新
        $new_dat = implode('|', array($now_date, $ydy, $tdy, $ady));
    
        $fp = fopen($count_log, 'r+');
        flock($fp, LOCK_EX);
        fputs($fp, $new_dat);
        fclose($fp);
    }
    
    //htmlとして出力
    echo $ydy.'|' ;
    echo $tdy.'|' ;
    echo $ady     ;
    
    //end

    一応、こんな感じですが、カウントの動作がおかしいなどの不具合がありましたら、コメントしていただけるとありがたいです。

    なお、スクリプトのご利用は自己責任でお願いします。

  • GoogleにAjaxページをインデックスしてもらう方法

    WEBサイトを運営していて、Ajaxページを作成した場合、そのページは、Ajaxの未適用の状態でGoogleにインデックスされることがあります。

    しかし、サイト運営者としては、Ajaxを適用した状態でインデックスして欲しい場合もあります。

    そこで、GoogleにAjaxページをインデックスしてもらう方法について覚書しておきます。(お約束ですが、以下の方法の採用は自己責任でお願いします。)

    まずは、Googleの公式ページをよく読む必要があります。あまり難しくはないので必読です。

    【AJAX クロール: ウェブマスターおよびデベロッパー向けガイド】
    https://support.google.com/webmasters/answer/174992

    上記ページでは、主に2つの方法が述べられていますが、ここでは、3.の「ハッシュ フラグメントを使用せずに処理する」を採用します。

    まずは、コンテンツとなるページに、次のmetaタグを含ませます。

    <meta name="fragment" content="!">

    次に、URLをフラグメントに対応するようにします。

    www.example.com?_escaped_fragment_=

    ?以降がAjaxページであることのパラメーターとなります。

    そして、?_escaped_fragment_=がある場合には、PHPなどで、Ajax適用状態のページをレスポンスとして返すようにします。

    ここまでは、とても簡単です。

    ここで問題となるのが、動的にURLを構成するページではどうするかです。

    たとえば、一見、次のURLは、静的に見えます。

    www.example.com/foo/bar

    しかし、実際は、次のように動的にURLを処理している場合もあるでしょう。

    www.example.com?category=foo&page=bar

    こうした場合には、mod_rewrite などを使って処理しているはずなので、「?_escaped_fragment_=」についても動的に処理します。

    .htaccess に次のように記述します。最後の2行は実質1行です。

    RewriteEngine on
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$ 
    RewriteRule ^([a-z]{10})/([a-z]{10})$  
    page.php?category=$1&page=$2&_escaped_fragment_= [L]

    上記の.htaccessの肝は、次の条件文です。クエリに、「_escaped_fragment_=」を含む場合のみRewriteRuleを実行します。

    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$

    そして、次行で実行するRewriteRuleでは、&_escaped_fragment_= を末尾に付けるようにします。

    なお、RewriteRule については、ご自身のサイト構成にあわせて適切に変更してください。

    これで、「きれいな URL を対応する汚い URL に一時的にマッピングします」ということを、mod_rewriteを使って動的に処理することができるようになります。

    (注意点)

    1.mod_rewriteの条件文(RewriteCond)は、続く1行にのみ作用します。そのため、その後の行には影響しません。

    2.RewriteRuleのみを使って処理できるようにも思えますが、RewriteRuleは、?以降のパラメーターを無視するため、RewriteCondで条件を判定しないと処理ができません。

    今回は、この2番でつまづいて、大変でしたが、何とか作業が終了しました。

    【追記】

    一応、上記の設定をした後には、サイトのアクセスログを分析してロボットがAjaxページをきちんと取得したかを確認した方が良いと思います。

    ちなみに、自分の場合には、設定後、数時間ほどで、botがきて、
    「?_escaped_fragment_=」付きのページを取得していきました。
    下は、そのときのログの一部です。(一部伏字及び改変)

    **.249.77.** – – [14/Dec/2013:19:17:48 +0900] “GET /abc/xyz?_escaped_fragment_= HTTP/1.1″ 200 3117 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)”

    なお、googlebot以外に、Bingのボットも確認できました。

    以上です。