WebSocket(node + socket.io)をstunnel + HAProxyでプロキシする - その1 - HAProxyのインストールまで

WebSocketのステータスは、昨年12月にRFC6455としてproposed standard(標準化への提唱)のステータスになりました。

node.js+socket.ioやjetty(Java)を始めサーバーサイドの実装は既に多くあり、クライアントはGoogle ChromeSafariが実装しています。
FireFoxなどはMozWebSocketとして実装されており、リリースは標準化を待っている状態です。
2月にリリースされたFireFox 11より、proposed standardへの移行を受けてWebSocketを正式にリリースしました。
https://dev.mozilla.jp/2012/02/firefox11/

例えば、サーバーにnode.jsを利用するアプリケーションを構築していく場合、実際にはnode.js自体をスケールしたり、WebSocket以外の機能はnode.js以外で実装したい場合もあります。
その場合は、リバースプロキシサーバーが必要となりますが、現在、もっとも有力なのはHAProxyです*1 *2

これから数回に分けで、以下の図のように、node.jsとnginx配下にあるWebアプリケーションをHAProxyでまとめるサーバー構成のシステムを構築する手順についてまとめて行きます。

なお、この内容は以下のブログを参考に実際に、co-meetingで実装した内容*3をまとめ直した物になります。

Proxy socket.io and nginx on the same port, over SSL
Nginx, Websockets, SSL and Socket.IO deployment

まずは、HAProxyのインストールから

HAProxyのインストール

HAProxyは、OSとバージョンの組み合わせによってWebSocketが通ったり通らなかったりします。

CentOS5.5は、yumでインストールされる1.3系でもWebSocketが動きます。
Ubuntu10.04は1.3.22が入りますが、こちらはWebSocketが動かないので1.4系をインストールする必要があります。

*1:NginxはWebSocketに対応するプラグインがありますが、パスやヘッダによる振り分けなどができないため柔軟な構成は取れません

*2:WebSocketに対応したリバースプロキシサーバーは、他にPoundがあります。こちらの記事も大変参考になります:Railsの各種サーバーの速度ベンチマーク: Pound、Varnish、Nginx、Unicorn、Mongrel

*3:実際には、co-meetingはnode.jsの替わりにjettyを使っています

続きを読む

AWS Elastic Beanstalkの開発環境を構築してみた

発表されてから、1年ちょっとたったAWS Elastic Beanstalkについて調査してみました。

http://www.publickey1.jp/blog/11/amazonjavapaasbeanstalkruby_on_rails.html

Beanstalkは、Javaのアプリケーションがデプロイ可能なPaaSです。
現在もまだベータであり、この記事にあるようにデータベースは、SimpleDBまたはRDSなど外部サービスとの連携が必要です。

Beanstalkにデプロイするアプリケーションの開発には2つの手段があります。

1. Eclipseプラグインを使う
2. 既存のアプリケーションなど独自形式のプロジェクトの場合は、warファイルをManagement Consoleより直接アップロードする方法もあります

Eclipseプラグインを使った場合もプロジェクトの形式は自由に出きるのかもしれないですが設定までは調べていません。

この2つの方法について手順を追ってみました。

Eclipseプラグインによる開発

公式ドキュメントhttp://aws.amazon.com/jp/eclipse/に英語ですが動画があるので、それに沿って作業して行くのが分かりやすいです。

続きを読む

Ubuntu 10.04 LTSにSun Javaをインストール

いつも忘れるのでメモしておく

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:sun-java-community-team/sun-java6
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

情報元:http://stackoverflow.com/questions/3747789/how-to-install-the-sun-java-jdk-on-ubuntu-10-10-maverick-meerkat

Grails AuthenticationとEmailConfirmationプラグインでRailsのDeviseと同じ機能を実装する

Javaの実行環境で、Ruby on RailsプラグインDeviseのようにメール認証付きのログイン機構を簡単に実装できないかなあと思い調べてみました。

まず、Java実行環境で動くRoRスタイルのフレームワークは、最近のメジャーどころは以下のようなところかと思います。

上記3つを簡単に調べた印象ですが、まずJRubyは最新版ではDeviseがすんなり動いてくれませんでした。
次に、Play! frameworkですが、軽くしか調べてないですがメールのコンファームまでできるプラグインが見つかりませんでした。まだプラグインなどは充実していない印象を受けたので今回は調査を見送り。

そこで、昔から在るGroovyのRailsであるGrailsを見てみたら目的のプラグインが見つかったので、Grailsのインストールからメールのコンファームを組み込んだ認証機構を実装する手順をメモしておきます。

Grailsとは

Grailsは最初のバージョンが2006年にリリースされたRoR Likeなフレームワークで、開発言語はJavaで動くスクリプト言語の元祖であるGroovyを使います。GはGroovyのGです。
今はSpringSourceのプロジェクトにもなり、VMWareがバックに居るため将来のメンテナンスについても安心して使うことができそうです。
マニュルもかなり充実しています。
http://grails.org/doc/latest/guide/

Grailsのインストール

インストールは、http://grails.org/Installationに書いてある通り、解凍してパスを通すだけです。

続きを読む

s3sync メモ(ruby 1.9で使う、US Eash以外だとPermanent redirect receieved.)

ruby 1.9で動かす

公式のs3syncはまだruby1.9で動かない。
対応しているモジュールがgithubにありました。
https://github.com/aproxacs/s3sync
s3syncコマンドがbinにあるので実行は以下の通り

/bin/s3sync  

US East 以外で使うときの注意

以下のエラーになる。

Permanent redirect received. Try setting AWS_CALLING_FORMAT to SUBDOMAIN
S3 ERROR: #
Permanent redirect received. Try setting AWS_CALLING_FORMAT to SUBDOMAIN

AWS_CALLING_FORMATを"SUBDOMAIN"に指定する

export AWS_CALLING_FORMAT="SUBDOMAIN"

参考: http://d.hatena.ne.jp/rx7/20100519/p1

Rails3 runnerを利用してでバッチプログラムを実行するサンプル

Rails3でバッチプログラムを実行する方法は公式ガイドでは以下のように記載されています
http://guides.rubyonrails.org/command_line.html#rails-runner

$ rails runner "Model.long_running_method"

runnerの使い方に付いてぐぐってみましたがRailsの構成まで含めたいい説明ページが無かったので、まとめてみました。

サンプルについて

今回のサンプルでは、認証にdeviseを利用したアプリケーションで、ユーザの招待を一度に行うバッチプログラムを作成しました。
ユーザ一覧はCSVファイルから読み込みます。

deviseの基本的な機能と招待の仕組みの追加に付いては以下の記事を参考にしてください。

プログラムの置き場所の準備

今回バッチプログラムはlib/tasksというディレクトリに配置したいと思います。
lib以下のファイルを読み込むようにconfig/application.rbに以下を追加します。

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

参考:http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/

lib/tasksディレクトリにinvitation_task.rbを作成して、以下のようにクラスを定義しました。

class Tasks::InvitationTask
end

メソッドの実装

以下は、メールアドレスをCSVから読み出し、devise inviteを利用して招待メールを送信するバッチプログラムです。
引数にファイル名をとります。

require "csv"

class Tasks::InvitationPrivateBetaTask
  def self.execute(csv_file_name)
    CSV.foreach(csv_file_name) do |row|
      address = row[0]
      User.invite!(:email => address)
    end
  end
end

プログラムの実行

引数にCSVのファイル名をしています。

$ rails runner Tasks::InvitationPrivateBetaTask.execute\(\"test_invite.csv\"\)

Railsでfavicon.icoを表示する設定

通常はフロントのWebサーバーに画像を置くのであまり使わないかもしれないですが、Railsのpublicフォルダにfavicon.icoを置いた場合にサイトのアイコンとして設定する方法が分からなかったのでメモしておきます。

public/imagesにfavicon.icoを置いた場合以下の行をheadに記述するだけです。

<%= favicon_link_tag 'favicon.ico' %>

以下のようにレンダリングされます。


参考: http://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html