こんにちは。イッシーです(๑°⌓°๑)!今回は前回の続きでAWSで立てたサーバーを簡単に複製できるようAMIを作成したいと思います。社内ドキュメントをHTMLで記録しておこう的なノリです。ちなみにAmazon Linuxを使用しております。

そういえば、前回書き忘れていたので以下のコマンドでルートのパスワードを設定しましょう。

sudo passwd root

■証明書の取得

管理画面にアクセスして、「X 509証明書」で「秘密鍵」と「証明書」をダウンロードしましょう。

サーバ上でamazon コマンドを実行していく感じですね!

■証明書の転送

上述でダウンロードした2ファイルをサーバ上に転送しましょう。scpでもgitでもOKです。

■AMIの作成

Account Activityにアクセスして右上にある口座番号(ハイフン付き)をメモってください。それではAMIを作成します。

su
ec2-bundle-vol -d /mnt --privatekey [秘密鍵ファイルパス] --cert [証明書ファイルパス] --user [口座番号] --fstab /etc/fstab

使用している容量によりますが、僕は10分くらい時間がかかりました。

■S3へ転送

管理画面にアクセスして、「アクセスキーID」と「シークレットアクセスキー」をメモしてください。次に以下のコマンドを実行しs3のバケットに転送します。

ec2-upload-bundle --bucket [バケット名] --manifest image.manifest.xml --access-key[アクセスキーID] --secret-key [シークレットアクセスキー]

僕は1時間くらい時間がかかりました。ネットサーフィンでもして・・・違った、別のタスクをこなして終了を待ちましょう。

■AMIの登録

s3に転送したファイルからEC2を起動できるようにします。以下のコマンドでAMIを登録しましょう。

ec2-register [バケット名]/image.manifest.xml

もしくは以下のコマンドで登録します。

ec2-register [バケット名]/image.manifest.xml --privatekey [秘密鍵ファイルパス] --cert [証明書ファイルパス]

実行するとIDが出力されるのでメモっておいてください。

登録したAMIを確認

ec2-describe-images -o self

登録したAMIを削除

ec2-deregister [AMIのID]

個人的な感想ですが、AWSは他のサービスよりも柔軟性も高く機能も豊富です。そのため固有の操作というものが少なからずありますが、インフラを0から構築するよりははるかに楽なので頑張って覚えていきたいところです。‎(๑╹ڡ╹)

こんにちは。イッシーですʕ→ᴥ←ʔ キュンキュン!世の中ドキュメントはHTMLという流れですね。オフィスで残すのも管理が大変なので、ちゃっかりブログに載せちゃえ主義を貫こうと思います。

さて、プラスアールではクラウドを利用してサービスを運営しています。そこで本日はAWSでサーバをたてます。硬派なインストール方法(ソースからビルド)をせず、yumしまくってますがご了承ください。m(__)m

※Amazon Linuxの32bitを使用しております。

■Apache

いわゆるWebサーバです。

sudo yum install httpd
sudo chkconfig httpd on

インストール及びマシン起動時の設定が完了しました。特にサーバーとしては問題なく動作するのですがセキュリティ上望ましくない部分もありますので設定を変更します。

設定

以下のコマンドで設定ファイルを編集します。

sudo vi /etc/httpd/conf/httpd.conf
HTTPヘッダ内のApacheのバージョン

特定のバージョンに存在する未知の脆弱性というものも存在するかもしれません。以下の部分を

ServerTokens OS

以下のように編集しバージョンを隠すようにしましょう。

ServerTokens ProductOnly
サーバーネームの変更
#ServerName www.example.com:80

以下のように変更する。

ServerName hogehoge.com:80
ディレクトリの一覧表示を禁止

ディレクトリの中身が見えてしまうというのはセキュリティ上好ましくありません。以下の部分を

Options Indexes FollowSymLinks

以下のように変更して一覧を表示させないようにしましょう。

Options -Indexes FollowSymLinks
htaccessの使用を許可

これは用途によりますが大概のWebアプリケーションはhtaccessファイルを使用しているのではないかと思います。<Directory “/”>内の以下の部分を

AllowOverride None

以下のように変更します。

AllowOverride All

.htaccessファイルは外から見られるとセキュリティリスクになります。以下の記述が見つからない場合は追記しましょう。

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>
エラーページにおけるサーバ情報の表示禁止

これは一番最初の設定項目と同様の理由です。不要な情報は極力表示させないようにしましょう。以下の部分を

#ServerSignature On

以下のように変更します。

ServerSignature Off

起動

以下のコマンドで起動します。

sudo /etc/init.d/httpd start

ちなみに初期設定の場合は以下のディレクトリのファイルが参照されます。

/var/www/html/

従ってそこにindex.htmlを設置すれば参照できますね。Webサーバーσ°▽°)σ ゲッツ!

■MySQL

いわゆるDBです。Amazon RDSを使用しても良いのですが今回は同マシン内でMySQLも動かしてみます。

sudo yum install mysql mysql-server mysql-devel
sudo chkconfig mysqld on

設定

以下のコマンドで設定ファイルを編集します。

sudo vi /etc/my.cnf
文字コード

MySQLのデフォルトの文字コードはコンパイルオプションで指定しないとlatin1です。試しに以下のコマンドで確認します。

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

マルチバイト圏に生まれて凹みますね。でも大丈夫。以下の記述を設定ファイルに加えましょう。

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8

以下のように生まれ変わります!

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

僕はunicode以外の文字コードは嫌いです(●´⌓`●)

パスワード

インストール直後のMySQLはrootのパスワードがありません。セキュリティを考えて必ず設定しておきましょう。

myql -u root

以下のSQLを実行します。

SET PASSWORD FOR root@localhost=PASSWORD('fugafuga');
exit;

実はもっと沢山の設定項目がありますが本題から外れてしまいそうなのでサクっと終わらせます。

起動

以下のコマンドで起動します。

sudo /etc/init.d/mysqld start

MySQLサーバーσ°▽°)σ ゲッツ!

■PHP

みんな大好き”ゆとり言語”PHPです!必要に応じてパッケージは追加してください。

sudo yum install php php-devel php-pdo php-pear php-mcrypt php-mysql php-mbstring

Amazon LinuxリポジトリのPHPバージョンは5.3.6。キュンキュンするバージョンですね。ʕ→ᴥ←ʔ キュンキュン!

PHP設定

以下のコマンドを実行し設定ファイルを編集します。

sudo vi /etc/php.ini
文字コード

以下の項目を探して下記を例に変更しましょう。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8

※携帯サイトの場合はSJISかもしれません。

PHPのバージョン表示

PHPには特定のバージョンに存在する脆弱性が存在します。以下の部分を

expose_php = On

以下のように変更し

expose_php = Off

バージョン情報をクライアントに送信しないようにしましょう。

タイムゾーンの設定

以下の部分を

;date.timezone =

以下のように書き換えましょう。

date.timezone = Asia/Tokyo

動作確認

sudo /var/www/html/index.php

以下のように記述します。

<?php
phpinfo();

キタ━━━━。゚+.ヽ(´∀`*)ノ ゚+.゚━━━━!!ドキュメント化に30分くらいかかってしまいましたが、上述の作業だけだったら10分でできるかと思います。自分で書いたタイトルですが「普通のウェブアプリケーション」って何をもってして普通なんでしょうね・・・

こんにちは!イッシーです。最近はnode.jsにキュンキュンしてますʕ→ᴥ←ʔ キュンキュン!

最近、空メールの処理をする機会がありました。以前、やったことがあったんですがすっかり忘れてしまっていたのでちゃんとメモっておくことにします。特にキュンキュンするようなトピックスでもないので、サクっと片付けて皆でnodeにキュンキュンする時間を作りましょう!

では、本題に入りますが、メールサーバに何を使用しているかによって設定ファイルの場所と方法が若干違います。

■qmail

以下のコマンドを実行し設定ファイルを編集します。

vi /var/qmail/mailnames/[domain]/[mailaddress]/.qmail

以下のように記述されていると思います。

| true
| /usr/bin/deliverquota ./Maildir

以下のように記述する事でプログラム(スクリプト)に処理を渡すことができます。

| /usr/bin/php /var/www/vhosts/[domain]/subdomains/[sub]/register.php
| true
| /usr/bin/deliverquota ./Maildir

register.phpの内容については後述します。

■postfix

以下のコマンドを実行し設定ファイルを編集します。

vi /etc/aliases

以下の記述を最後尾に加えます。

user: "| /usr/bin/php /var/www/vhosts/[domain]/subdomains/[sub]/register.php"

以下のコマンドを実行し設定を反映させます。

postalias /etc/aliases

以上でメールサーバの設定が完了しました。register.phpでメールの処理をする準備が整いました。

■register.php

まず、以下のコマンドでログファイルを準備します。

touch /var/www/vhosts/[domain]/subdomains/[sub]/log.txt
chmod 0777 /var/www/vhosts/[domain]/subdomains/[sub]/log.txt

ブラウザでデバッグできないので、まず以下のようにログファイルにエラーを出力するように設定しましょう。

$file = '/var/www/vhosts/[domain]/subdomains/[sub]/log.txt';
$date = date('Y-m-d H:i:s');
file_put_contents($file, "\nreceived - {$date}", FILE_APPEND);

ini_set('log_errors', 'On');
ini_set('error_log', $file);

次にメールの文言を取得します。面倒なのでPEARを使いましょう。パスは環境に応じて置き換えてください。

require_once('/usr/share/PEAR/Mail/mimeDecode.php');

$source = file_get_contents("php://stdin");//標準入力からメールデータをゲットだぜ!
if(!$source){
    echo "fail!\n";
    exit();
}

// メールデータをパースする
$decoder   = new Mail_mimeDecode($source);
$structure = $decoder->decode(array(
    'include_bodies' => true,
    'decode_bodies'  => true,
    'decode_headers' => true,
));
$from = mb_convert_encoding(
    mb_decode_mimeheader(
        $structure->headers['from']
    ),
    'UTF-8'
);
if(preg_match('/<([^>]+)>$/', $from, $regs)){
    $from = $regs[1];
}

$from    = strtolower($from);
$title   = mb_convert_encoding($structure->headers['subject'], 'UTF-8', 'ISO-2022-JP');
$context = ($structure->body)? $structure->body : $structure->parts[0]->body;
$context = mb_convert_encoding($context, 'UTF-8', 'ISO-2022-JP');

この後で取得したデータをDBに格納したりします。ログを確認できるようにすることがいかなる場合も大切ですね。(●´ω`●)

みなさんこんにちはこんばんは。イッシーですʕ→ᴥ←ʔ。前回はSubversionでのバージョン管理でしたが世はすっかりGitムードです。プラスアールでも使い方を学びつつ四苦八苦しながらGitに移行してます。そこで今回はGitでの環境構築の部分をまとめてみました。

  • 解説は、プロジェクト名:sample.plusr.biz、ユーザ名:ishimotoとしてます
  • ルート権限で作業します

■サーバ側

【step1】グループを作る

プロジェクト名と同じ名前のグループを作りましょう。重複を防ぐためにもドメイン名が良いかと思います。

/usr/sbin/groupadd sample.plusr.biz

【step2】グループにユーザを追加

グループにプロジェクトユーザを加えます。

gpasswd -a ishimoto sample.plusr.biz

以下のコマンドでも同様の操作が可能ですが、今まで追加したグループを列挙しなければなりません。

/usr/sbin/usermod -G sample.plusr.biz,hoge.plusr.biz,fuga.plusr.biz ishimoto

【step3】新規リポジトリの作成

以下のコマンドで新規リポジトリをサーバー上に作成します。

mkdir sample.plusr.biz
cd sample.plusr.biz

【step4】リポジトリの作成

以下のコマンドで新規リポジトリをサーバー上に作成します。

git --bare init

※bareとは作業ファイルがないからのリポジトリです。

vi description

以下のように任意のプロジェクト名を記述します。

sample.plusr.biz.repository

※リポジトリ名を記述しなかった場合、push時に以下のエラーが発生します。

*** Project description file hasn't been set
error: hooks/update exited with error code 1
error: hook declined to update refs/heads/master

【step5】権限設定

グループのユーザに書き込み権限を与えます。

chmod -R 0775 /usr/local/development/repos/sample.plusr.biz
chmod -R g+s /usr/local/development/repos/sample.plusr.biz    #(1)
chgrp -R sample.plusr.biz /usr/local/development/repos/sample.plusr.biz

※上述の(1)がない場合、pushをしたときに以下のエラーが発生する。

error: failed to push some refs to 'ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz'

■クライアント側

まず、環境に合わせて以下をインストールします。

Mac
Git for Mac OS X
Win
msysgit

【step1】準備

プロジェクト用のディレクトリを作り、配下で以下ののコマンドを実行します。

mkdir sample.plusr.biz
cd sample.plusr.biz
git init

【step2】初期状態を準備

フレームワークなどのファイルを配置した後に以下のコマンドを実行します。

git add .
git commit -m “import :)
git remote add origin ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz
git push origin master

※ちなみに間違えてリモートをセットしたときは以下のコマンドで再設定できます。

git remote set-url origin ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz

リモートを確認するには以下のコマンドを使用します。

git remote -v

※さらにちなみにですが僕はコメントに顔文字を入れたりします。(。・ω・)ノ゙

【参考】

いかがでしょうか?率直なところ、まだ僕はSubversionからGitに乗り換えた恩恵を授かっていません。しかし、開発人数が増加すれば分散リポジトリの恩恵を授かれるはずです。次回は、実際のGit環境での開発について書いてみたいと思います。。。あ、WinのGit環境がわからないな・・・(●´⌓`●)

こんにちは。先日のブログで以下のような発言をしたイッシーです。(●´ω`●)

僕は生産設備を持っていませんので食料をはじめとした物流における支援は難しいのかもしれません。しかしながらシステムエンジニアとして間接的な支援や情報における支援はできます。僕は、天災における「破壊」を修復するのは人々の「生産」と考えるとともに、その「生産」の一部分を担う者として頑張っていきたいと思います。

有言実行ということで緊急地震速報をお知らせするChrome用の拡張機能を作ってみました。そこで今回は技術的な部分をまとめておきます。

■仕様

クライアント側

Web Notifications

お知らせを表示する小窓です。一番はじめのブログの題材にしました。

WebSocket

双方向通信の規格。これを使うとサーバ側から情報をプッシュできます。

Audio API

お知らせ音を鳴らす際に使用しました。

サーバ側

node.js

サーバサイドJavaScript。一言では表せない存在。同時接続ユーザ数が増えた場合のパフォーマンスがapacheと比べて非常に良いと思います。

■困ったこと1

node-websocket-serverの接続数が1024以上にならない。

解決策

node serverを立ち上げる前に以下のコマンドを実行することで解決しました。

ulimit -n 2048

デフォルトでファイルディスクリプタの数が1024になっているので、1プロセスあたり1024個の接続がリミットになっていたわけです。twitterで教えてくださった方に感謝です!

■困ったこと2

30分以上のスリープ状態から復帰すると接続が切れているが、イベントが発火せずプロパティにも特に変化がない。

解決策

以下のようなコードを使用することで回避しました。

var reload  = 600000;
var before = new Date();
setInterval(function(){
    var current = new Date();
    if((current - before) > (reload + 15000)){
        connect();// 再接続
    }
    before = current;
},reload);

タイマーを利用してスリープを検知しています。通常はcurrentとbeforeの差は殆どreloadと等しくなりますが、スリープした場合に差が大きくなります。それを利用して再接続をしているわけです。ヒラメキに感謝!

コードが美しくないのでhtml5-developers-jpに質問してみたところ、「NATやFireWallがあり通信が一定期間無い場合、リソース節約のためにそのセッションテーブルを切ってしまうため、readyStateなどは変化しない」とアドバイスを頂きました。教えてくださった方ありがとうございます!

■困ったこと3

千人くらい使ってくれるかなと考えていましたので、一万人を超えた時は正直焦りました。急激にトラフィックが制限に近づいてます。ソーシャルゲームとは違いユーザ間でデータの共有はしてませんので、サーバさえあれば分散は容易になってます。また、協力してくださる方もいますので協力してくださる方に感謝です!

■まとめ

当初、不具合がありまして多くの皆様に迷惑をかけたにもかかわらず、温かい言葉をかけてくださいまして大変励みになりました。また、個人で制作したものではありますが、サーバーなど会社のバックアップがあってこそ運営できているものです。改めて周囲の皆様に感謝し今後も頑張っていきたいと思うとともに、震災にあわれた地域のいち早い復興を願っております。