さくらのVPSサーバー構築体験記

契約
初期設定、鍵認証、Apache、PHP、MySQL
スワップファイルの確保
JavaとTomcatのインストール
Javaサンプルアプリケーションのデプロイ
ApacheとTomcatの連携
phpmyadminの導入
週1回使用メモリ、使用ディスク容量を電子メール送信
毎日データベースをダンプし、整理して格納し、圧縮のうえ電子メール送信

戻る

契約

 さくらのVPS メモリ2GBコースを契約しました。 後日サーバー上で思考するゲームを開発する可能性があるため、 少しスペックの高いコースにしました。 それ以外にもSQLを導入する場合最低でも1GB、できれば2GBをお勧めします。

初期設定、鍵認証、Apache、PHP、MySQL

 初期設定し、鍵認証、Apache、PHP、MySQLをインストールしました。 こちらのサイトの通りに作業をすると、無事にすべてインストールできました。 「5.鍵認証の設定」で苦労したところが2点ありました。 1点目は、"authorized_keys"ファイルに公開鍵をペーストする際に、 viエディタでINSERTモードにしていなかったので、先頭の1文字が正しくペーストされずにいて、 鍵認証でログインできなっかっという点です。 もう一点は、"chmod 600 .ssh/authorized_keys"で鍵ファイルのアクセス権を変更していなかった点です。 これはセキュリティを上げるためのオプションで、 やっていなくてもログインできると思っていたのですが、 これをやらないとログインできないという必須の作業のようです。
「Can't connect to local MySQL server through socket '/tmp/mysql.sock'」 というエラーが出た場合、ソケットの問題ですので、 こちら を参考にしてください。

スワップファイルの確保

 スワップファイルはデフォルトで2GBですが、 余裕を持たせて、16GB確保することにしました。 デフォルトの2GBをオフしなかったため、スワップは18GBになってしまいましたが、 これでよいものとしました。 スワップファイル作成時にディスク書き込み速度が550MB/sくらいと表示されていて、 ディスクの速度は相当速いものと思われます。 尚、参考にしたウェブページは忘れてしまったので掲載しません。 ごめんなさい。

JavaとTomcatのインストール

 こちらのサイトの通りに作業しました。 Java 1.7はyumから、Tomcat7は圧縮ファイルからインストールしました。 この通り、無事にインストールできました。

Javaサンプルアプリケーションのデプロイ

 Windows上で、Javaサンプルアプリケーションをコンパイルし、デプロイ(配備)しました。 はじめてのJSP&サーブレット Eclipse 3.7 Indigo+Tomcat 7対応版 の6.2節の通りに、 サンプルアプリケーションを作成しました。 doGetの中身をこちらのように修正しました。 Windows上で動作を確認し、 「エクスポート-WARファイル」でwarファイルを出力しました。 出力されたwarファイルは、こちらです。
次に、 再びLinuxに戻り、Tomcatインストールフォルダにて、"tomcate-users.xml"を編集し、 <tomcat-users>と</tomcat-users>の間に、以下を追加します。
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="********" password="********" roles="manager-gui,admin-gui"/>

最後に、Tomcatのトップ(私の場合、"http://www.chariot-lab.com:8080/")から、"Manager App"を選択し、 「WARファイルの配備」の参照で、先ほど生成したwarファイルを選択し、 「配備」ボタンを押します。 このように、正しくウェブアプリが動作しています。 アップロード先のURLは、"http://www.chariot-lab.com:8080/06_Servlet/"ではなく "http://www.chariot-lab.com:8080/06_Servlet/HelloServlet"である点に注意が必要です。

ApacheとTomcatの連携

 JavaとTomcatのインストールの項目のときと同じく、 こちらのサイトを参考にしました。 ただし、httpd-proxy.confは、以下のように設定しました。
<Location /examples/>
ProxyPass ajp://localhost:8009/examples>
</Location>

<Location /06_Servlet/>
ProxyPass ajp://localhost:8009/06_Servlet/
</Location>

こちら の通り、うまく動いています。 URLは、"http://www.chariot-lab.com/06_Servlet/HelloServlet"です。

phpmyadminの導入

 こちら のサイトを参考にしてインストールしたらうまくいきました。 インストールすることにより100MBほど使用メモリが増えました。 sql関係は消費メモリが増えるので注意です。

週1回使用メモリ、使用ディスク容量を電子メール送信

 cronという技術を用います。 cronに関しては、 こちら を参考にしました。
この例では、毎週金曜日の19:03にメモリといディスクの空きを指定電子メールアドレスに送信します。
"crontab -e"コマンドで、cronを以下のように設定します。
1 19 * * 5 free -m > /var/www/aaaaaa/bbbbbb/status-memory.txt
2 19 * * 5 df -h > /var/www/aaaaaa/bbbbbb/status-disk.txt
3 19 * * 5 php /var/www/html/cccccc/dddddddddd.php

そして、 "/var/www/html/cccccc/dddddddddd.php"のソースコードを以下のように記述します。 <?php $contents = "memory (MB)\n"; $mem_file_name = "/var/www/aaaaaa/bbbbbb/status-memory.txt"; $fh = fopen($mem_file_name, "rt"); if (!$fh) { print "file open error:".$mem_file_name."<br>\n"; } do { $buffer = fgets($fh); $contents .= $buffer; } while ($buffer); fclose($fh); $contents .= "\n\n"; $contents .= "disk (GB)\n"; $disk_file_name = "/var/www/aaaaaa/bbbbbb/status-disk.txt"; $fh = fopen($disk_file_name, "rt"); if (!$fh) { print "file open error:".$disk_file_name."<br>\n"; } do { $buffer = fgets($fh); $contents .= $buffer; } while ($buffer); fclose($fh); mb_language("japanese"); mb_internal_encoding("UTF-8"); $to = "e-mail-address@so-net.ne.jp"; $from = "Chariot Lab. ".mb_encode_mimeheader("○○○")."<e-mail-address@so-net.ne.jp>"; $rp = "e-mail-address@so-net.ne.jp; $org = 'Chariot Lab.'; $head = ''; $head .= "Content-Type: text/plain \r\n"; $head .= "Return-Path: $rp \r\n"; $head .= "From: $from \r\n"; $head .= "Sender: $from \r\n"; $head .= "Reply-To: $rp \r\n"; $head .= "Organization: $org \r\n"; $head .= "X-Sender: $from \r\n"; $head .= "X-Priority: 3 \r\n"; if (mb_send_mail($to, date("Y-m-d(D)")."リソース情報(Chariot Lab.)".date("H:i"), $contents, $head)) { print("succeeded in sending e-mail<br>\n"); } else { print("sending e-mail error<br>\n"); }; ?>

毎日データベースをダンプし、整理して格納し、圧縮のうえ電子メール送信

 今回もcronを用います。
この例では、毎日の朝04:10に圧縮済みデータベースバックアップを電子メール送信する例です。
"crontab -e"コマンドで、cronを以下のように設定します。
0 4 * * * mysqldump -umysql_backup -peeeeeeee -hlocalhost -A > /var/www/aaaaaa/ffffffff/ggggggggg/current_database_backup.txt
10 4 * * * php /var/www/html/cccccc/dddddddddd.php

eeeeeeee は、データベースのパスワードです。

そして、 "/var/www/html/cccccc/dddddddddd.php"のソースコードを以下のように記述します。 <?php print "Database backup<br>\n"; $dir1 = "/var/www/aaaaaa/ffffffff/".date("Y"); if (!file_exists($dir1)) { if (mkdir($dir1)) { print "Succeeded in creating ".$dir1."<br>\n"; if(chmod($dir1, 0777)) { print "Succeeded in change access right of ".$dir1."<br>\n"; } else { print "Failed in change access right of ".$dir1."<br>\n"; } } else { print "Failed in creating ".$dir1."<br>\n"; }; } $dir2 = "/var/www/aaaaaa/ffffffff/".date("Y")."/".date("Ym"); if (!file_exists($dir2)) { if (mkdir($dir2)) { print "Succeeded in creating ".$dir2."<br>\n"; if(chmod($dir2, 0777)) { print "Succeeded in change access right of ".$dir2."<br>\n"; } else { print "Failed in change access right of ".$dir2."<br>\n"; } } else { print "Failed in creating ".$dir2."<br>\n"; }; } $file_org = "/var/www/aaaaaa/ffffffff/ggggggggg/current_database_backup.txt"; $file_dest_dir = "/var/www/aaaaaa/ffffffff/".date("Y")."/".date("Ym")."/"; $file_dest_file = "database_backup_".date("Ymd-D").".txt"; $file_dest = $file_dest_dir.$file_dest_file; if (copy($file_org, $file_dest)) { print "Succeeded in copying a file: ".$file_org."->".$file_dest."<br>\n"; } else { print "Failed in copying a file: ".$file_org."->".$file_dest."<br>\n"; } //chdir($file_dest_dir); $file_dest_zip = "/var/www/aaaaaa/ffffffff/".date("Y")."/".date("Ym")."/database_backup_".date("Ymd-D").".zip"; $zip = new ZipArchive(); $res = $zip->open($file_dest_zip, ZipArchive::OVERWRITE); if ($res) { $zip->addFile($file_dest, $file_dest_file); $zip->close(); } mb_language("japanese"); mb_internal_encoding("UTF-8"); $to = "e-mail-address@so-net.ne.jp"; $from = "Chariot Lab. ".mb_encode_mimeheader("○○○")."<e-mail-address@so-net.ne.jp>"; $rp = "e-mail-address@so-net.ne.jp; $org = 'Chariot Lab.'; $attachment = $file_dest_zip; $boundary = '__BOUNDARY__'.md5(rand()); $head = ''; $head .= "Content-Type: multipart/mixed;boundary=\"{$boundary}\"\n"; $head .= "Return-Path: $rp \r\n"; $head .= "From: $from \r\n"; $head .= "Sender: $from \r\n"; $head .= "Reply-To: $rp \r\n"; $head .= "Organization: $org \r\n"; $head .= "X-Sender: $from \r\n"; $head .= "X-Priority: 3 \r\n"; $body = "--{$boundary}\n"; $body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"; $body .= "\n{$plain_message}\n"; $filebase = basename($attachment); $body .= "--{$boundary}\n"; $body .= "Content-Type: {$attach_mime_type}; name=\"{$filebase}\"\n"; $body .= "Content-Disposition: attachment; filename=\"{$filebase}\"\n"; $body .= "Content-Transfer-Encoding: base64\n"; $body .= "\n"; $body .= chunk_split(base64_encode(file_get_contents($attachment)))."\n"; $body .= "--{$boundary}--"; if (mb_send_mail($to, date("Y-m-d(D)")."データベースバックアップ(Chariot Lab.)".date("H:i"), $body, $head)) { print("Succeeded in sending e-mail<br>\n"); } else { print("Sending e-mail error<br>\n"); }; ?>
ZipArchiveが使えるのはは、PHP5.2以降らしいので、ご注意ください。








太独立電源システムと過充電防止回路のChariot Lab.のページ-トップに戻る