PECLのOAuthProviderとReverseProxyのメモ

このエントリーをはてなブックマークに追加

phpでPECLのOAuthライブラリを利用していた場合に、nginxでAPIサーバへReverseProxyで素直に転送するとSignatureが不正だと怒られちゃう時の対応方法をメモしとく。
一応ドキュメントはあるんだけど、説明がほとんどないのでprovider.cを見た方が早い。構成はフロントのnginxでHTTPSで受けて、バックエンドをコールするときはHTTPで呼び出す感じ。当然ながら署名のチェックはバックエンドで行われるのでフロントとバックエンドではhostやprotocolが異なり弾かれるので下記の対策が必要。

▽ nginxでX-Forwarded-*ヘッダーを追加しておく
下記みたいな感じで、追加しておく

server {
       listen 443;
       server_name サーバー名;
       省略
       proxy_set_header X-Forwarded-Proto https;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

▽ oauthチェックの処理を修正
下記のようにヘッダーチェックして転送されてきてるならチェック対象urlを自分で組み立てる。

$xForwardedProto=$_SERVER[‘HTTP_X_FORWARDED_PROTO’];
if($xForwardedProto){
       $url=$xForwardedProto.’://’.$_SERVER[‘HTTP_X_FORWARDED_HOST’]
              .$_SERVER[‘REQUEST_URI’];
       $this->provider->checkOAuthRequest($url);
}else{
       $this->provider->checkOAuthRequest();
}

この辺、拡張モジュール側でどのように処理しているかはPECLのoauthのprovider.c#oauth_provider_get_current_uriを見ると良い。1.0から1.2.2では結構判定処理が追加されてるけどHTTP_X_FORWARDED_HOSTは見てくれてない。

Ubuntu12.04でのnginx1.2のビルドメモ

このエントリーをはてなブックマークに追加

Ubuntu12.04でnginxをビルドする際のメモ、ミソはapt-getでインストールされる標準環境を踏襲できるあたり。
また今回はスピードの遅いファイルシステムに対するキャッシュ処理とキャッシュのパージ処理ができるモジュールを追加する。

ローカルファイルシステムに対するキャッシュを何に使うのかというとnfsとか、fuseで繋いだ外のファイルとかを想定してる。

▽ 下準備
ビルド用のライブラリ等のインストールを行う。

sudo apt-get install build-essential libpcre3-dev zlib1g-dev libssl-dev libgd2-xpm-dev libgeoip-dev

また、環境をうまく引き継ぐためにnginxも入れておく

sudo apt-get install nginx

なお、デフォルトでインストールされるnginxのビルドオプションを調べておくなら下記のコマンドを実行しておく

/usr/sbin/nginx -V

その後、設定ファイルのディレクトリに適当なファイルを作っておく

sudo touch /etc/nginx/dummy

さらにnginxを削除

sudo apt-get autoremove nginx

Continue Reading »

Cloud Foundry Open Tour, Shanghai 2 : 中国クラウド界隈

このエントリーをはてなブックマークに追加

Cloud Foundry Open Tour, Shanghai 1 : テクニカルセッション等ではCloudFoundry自体のテクニカルセッションについて書いたが、上海会場ということもあり企業ブースには中国において代表的なクラウド企業(IaaSの盛大雲、PaaSの新浪云计算)が出典をしておりつたない中国語ながら直接話を聞くことができた。また、テクニカルセッションや企業ブースにおいて受けた中国の開発者の印象についても感想を書いてみる。

▽ 中国クラウド事情
まず、中国クラウドを説明する前に中国特有のインターネット事情に触れる必要がある。
中国は周知のとおり情報規制と国内情報産業の保護を目的としてGreatFireWall(以下GFW)と言うものがあり国の気にくわない外国コンテンツはアクセスが制限されるというかタイムアウトされたり存在しないことにされてしまう。その為に中国国内向けのコンテンツは中国国内のサーバに配置しないと突然GFWによりアクセス制限をされてしまう可能性がある。さらに国内でコンテンツを公開する為にはICPと呼ばれる許可証を取得しなければならないが、このICPが国内サーバーでなければ取得できないのだ。(ただICPの取り消しだって役所の権限で決まるのだから回線の問題を抜きにすれば外国サーバーで良い気もするのではあるけど・・・)

上記の特殊性も有り、中国では開発者はサーバーが国外にあるためそもそもアクセスできない、アクセスできても国外のサーバーはいつアクセスブロックされるかわからないため実戦で採用できないなどハードルが異常に高かった。実際、AWSについてはアクセスは可能なものの、中国国内(香港を除く)リージョンやCDNのエッジサーバーがないためスピードも遅くインフラとして採用する必然性がどこにもなかったし、GoogleAppEngineにいたってはそもそも初期の頃をのぞいてもう恒常的にアクセスできないという絶望的な状況が続いている。では中国ではクラウドは利用できないのかというとそうでもなく、IaaSとして盛大云、PaaSとして新浪云计算がある。

▽ IaaS: 盛大云 Shèngdà yún
日本の漢字で書くと盛大雲(GrandCloud)となる。一言で言うとAWSの中国版と考えれば良く、提供されているサービスもそれに類するものである。ブースに出張っていた担当者に言わせると「盛大云は中国でのAWSです!」とのことであった。
ソリューションとしては2012年4月時点で下記が提供されている。

  • 云主机 ( Yún zhǔjī )
    仮想サーバー、EC2に相当、ただしAWSと異なり転送量ではなく 2/5/10/20/50/100/200Mの専用回線を1本あるいは2本別途借りる必要がある
  • 云硬盘 ( Yún yìngpán )
    仮想ハードディスク、EBSに相当、 料金は0.026元/G/日(現在は割引セールで0.016元)のみ
  • 云分发 ( Yún fēnfā )
    CDNサービス、AkamaiとかCloudFrontに相当、料金はリクエスト数(1万req単位)と流量(GB単位)によって決定され、通常のコンテンツ用と音声映像用があり後者の方が若干安い
  • 云存储 ( Yún chúcún )
    ストレージサービス、S3に相当、料金はリクエスト数(GET0.1元/1万req、GET以外0.1元/1千req単位)、データ保存量(1元/G/日)、データ転送量(インバウンドは無料、アウトバウンドが0.8元/Gから)によって決定される
  • 云监控 ( Yún jiānkòng )
    監視サービス、CloudWatchに相当、無料
  • MongoIC
    SimpleDBに相当するわけだが、普通にMongoDBを動かしている。 料金はデータ保存量、バックアップ回数、ミラーリング回数、データ転送量によって決定される
  • 数据库云 ( Shùjùkù yún )
    データベースサービス、RDSに相当するが、MySQLのみのRDSと異なり MySQL、mongoDB、redis、PostgreSQL、SQL Serverが提供されている。料金は稼働サーバー種別(超微/微型/小型/标准/大型/超大型)毎の利用時間(1時間単位のみ)、データ保存量(0.0025元/G/小时)で決定される、ちなみにストレージのサイズは5GB以上500GB未満と書いてある
  • 网站云 ( Wǎngzhàn yún )
    これはクラウドというよりはLAMPのホスティングサービスで価格は月、年単位で払う。一例として1コア/512MB/7.5GB/2M専用線のベーシックプラン(基本型)だと月126元、年1520元となる
ラインナップだけで言えば2年程前のAWSに近い、ただしAWSとは致命的に異なる部分として、ぱっと技術ドキュメントを見る限りにおいては云存储以外において管理APIを提供していない部分である。AWSはただの仮想サーバーサービスではなくCloudWatchの情報をベースに動的にサーバーの複製や追加など行動な管理をAPIによってコントロールでき、それが物理サーバーに対する大きなアドバンテージになっているため、AWSと比べると盛大云は真のIaaSクラウドとは言い難い気がする。ただ、APIが存在せず各サービスを有機的にコントロールできない事を除けば中国国内でCDNである云分发や、ストレージサービスとしての云存储がわかりやすく提供されているのは中国国内展開を図る企業にとっては検討に値するのではないだろうかと思う。
日本とは異なり携帯電話でのメールのやりとりはSMSが主流であり、実際AWSでもSimpleNotificationServiceとしてSMSの送信がサポートされているのだが、この点についてブースの担当者に聞くと
「現在は提供しておらず、予定もないため、どうしても必要なら淘宝(Taobao)あたりで安く売ってるからそれを使ってはどうでしょう?」
と、なんとも中国らしい回答だったw

Cloud Foundry Open Tour, Shanghai 1 : テクニカルセッション等

このエントリーをはてなブックマークに追加

InfoQの中国語版のメルマガで「Cloud Foundry云开发者大会」の参加者を募集していたので、語学的には多少不安があったが参加してきた。中国語で書くとなんかトーナメントみたいな印象を受けるのだが、英語での名称は「Cloud Foundry Open Tour,  Shanghai」となる。長くなるのでCloud Foundry自体のレポートと、中国クラウドの現状、中国の開発者におけるクラウドの認識の2本にわけて書くことにした。

一言で紹介すると、早い話PaaSクラウドであるCloudFoundry.comのサービス宣伝カンファレンスである。PaaSの概要や特性の解説に加え、スケーラブルなクラウドにおいて 有効な手法やアーキテクチャ、言語、データストレージに関して紹介をしてくれた。また企業ブースでは中国国内における代表的なクラウドプロバイダーが出展しており、担当者に直接話を聞くことができる稀有な機会ででもあった。

技術的な検証や調査に関しては別途記事を書くつもりなので、ここではカンファレンスの紹介と肌で直接感じた中国のクラウドシーン、開発者達に対する印象を書こうと思う。

▽ Cloud Foundryについて
最初CloudFoundryはVMWareが始めたPaaSであるが、はば広い業界の支持を受けて現在は一つのオープンソースプロジェクト CloudFoundry.orgとなっている。その思想の中心には「Avoid Lock-in」があり、標準技術やフレームワークを取り込むことによりPaaSにおけるプロバイダー固定問題(Lock-in)を回避できるようにすることを目標としている。
その、特徴としては下記の3つとなる。

  • インフラ層:  MicroCloud、PublicCloud、PrivateCloudに分類されるCloud Provider Interface
    わかりにくいのだが、CloudFoundry.comはPublicCloudの実装の一つであり、VMwareのCloud on a StickもMicroCloudの実装の一つであるため、それぞれ他のプロバイダーも出てくる可能性が高い
    ちなみにPrivateCloud(企業向けの非公開サーバーとか向け?)プロバイダはまだローンチしていないそうだ
  • DB層:  RabbitMQ、VMwareのvFabric、PostgreSQL、MySQL、MongoDB、RedisなどのOSS、3rdPartyによるApplication Service Interface
    簡単に言うとデータストアを中心としたミドルウェアサービスである、当然OracleやDB2、汎用系サービスなどもそのうち出てくるかもしれない
  • アプリケーション層:  Spring for Java、Ruby on RailsとSinatra、Node.js、Grails、Scala on Liftなどの豊富なフレームワークのサポート
    ちなみにPython、PHPなどもサポートに加えていくそうである

この特徴はそれぞれインフラ層、DB層、アプリケーション層をあらわしており、この3つの組み合わせにより一つのシステムを作り上げることになる。DB層とアプリケーション層の組み合わせについては細かく書かずともわかると思う。非常におもしろいのはインフラ層で、開発者はローカルのMicroCloudで開発を行った後にシームレスにPublicCloudへリリース、公開ができる。GoogleAppEngineも同様の仕組みを用意しているが、MicroCloudの場合はVMwareの実装(仮想化の応用)によりPublicCloudとほぼ同様のインフラを再現しているようである。開発者的に嬉しいのはGUIやWEBコンソールというマウス操作を必須としないコマンドラインツールの存在で、インスタンスの定義からリリース等までほぼ全てがコマンドラインから行える。

かなり端折ってしまったが、CloudFoundryの試みはクラウド開発時体を既存のPaaSにありがちなベンダー独自のKVSや、IaaSの独自VMなどの制約から開放するため、開発者はロックインを気にせずより自由にクラウド上での開発ができるようになる。極論になってしまうけど、既存のIaaS(AWSのEC2、Azure)やPaaS(GAE、AWSのSDB、Asure)すらもこの仕組みに取り込めちゃうなあとか思ったりとかする。

Continue Reading »