12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request...

29
12 回の目次 前回: REST とマッシュアップ 今回: Apache の基本 Tomcat のサーバーサイドプログラミング Node.js 1/29

Transcript of 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request...

Page 1: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

第 12回の目次

前回: RESTとマッシュアップ今回:

Apacheの基本TomcatのサーバーサイドプログラミングNode.js

1 / 29

Page 2: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

本日のソースコード

basic auth/: .htaccessと.htpasswdの例.htaccessにはもっといろいろ書ける.ただし,学情のWebサーバはこれを無視する設定になっているらしい.(前回のオフラインのMIME設定もうまく行かない.)

testcgi.c: CGIの環境変数を表示する

rest.rb: yahooに検索をかける CGI (written in ruby)tomcat/

testform.html: フォーム入力して form.jspを呼ぶform.jsp: PUTされた内容を表示する JSPform jsp.java: form.jspの javaへの展開結果test.jsp: <%や <%!の入った JSPtest jsp.java: 上の展開結果src/: servletの例 (HelloWorld.java, web.xml)

server.js: Node.jsによるサーバープログラム

2 / 29

Page 3: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

Webサーバーのソフト

Apache

The Apache Software Foundation

Apache HTTP Serverが正式

LAMP: Linux, Apache, MySQL, PHP/Perl

その他の有名なWebサーバ

IIS (Internet Information Server)

Nginx

Lighttpd

Node.js

GWS (Google Web Server)

3 / 29

Page 4: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

apache のアーキテクチャ

以下は apache1.3の話 (apache 2ではない)

apacheの構成

apache core

複数の apache modules (coreから呼び出される)moduleのリストは http://httpd.apache.org/docs/2.4/mod/

4 / 29

Page 5: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

Apache の全体構成

O.A.Dragoi, The Conceptual Architecture of the Apache Web Server, CS746G, Univ. of Waterloo.

Page 6: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

Apache Core の構成

O.A.Dragoi, The Conceptual Architecture of the Apache Web Server, CS746G, Univ. of Waterloo.

Page 7: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

http request によるフェーズ管理

http requestは以下の順序でフェーズを管理する

URI to filename translation

Check access based on host address, and other availableinformation

Get an user id from the HTTP request and validate it

Authorize the user

Determine the MIME type of the requested object(the content type, the encoding and the language)

Fix-ups (for example replace aliases by the actual path)

Send the actual data back to the client

Log the request

7 / 29

Page 8: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

フェーズとModule handler の呼び出し

O.A.Dragoi, The Conceptual Architecture of the Apache Web Server, CS746G, Univ. of Waterloo.

Page 9: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

並列処理

クライアントにつき一つのプロセス

プロセスは予め作られていて (prefork),それを割り当てる

O.A.Dragoi, The Conceptual Architecture of the Apache Web Server, CS746G, Univ. of Waterloo.

Page 10: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

Apache2

アーキテクチャをかなり変えた

MPM (Multi-processing module)moduleの一つではあるが入ってないと apacheが動かない.MPMには prefork (apache 1.3以前の方法),worker (スレッド)がある.

APR (Apache Portable Runtime)apache http serverの下に入ってOSの違いを吸収するレイヤー (http server以外にも使われているらしい)

10 / 29

Page 11: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

apache prefork/worker vs lighttpd (1)

abを利用した性能評価

http://thinkit.co.jp/book/2008/07/31/150より引用11 / 29

Page 12: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

apache prefork/worker vs lighttpd (2)

http loadを利用した性能評価

http://thinkit.co.jp/book/2008/07/31/150より引用

12 / 29

Page 13: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

設定

/etc/apache2/apache2.confDebianの場合はこれがメインで,ここから Includeで読みこむ:

モジュール設定:/etc/apache2/mods-enabled/*.load→読込みモジュールの指定/etc/apache2/mods-enabled/*.conf→各モジュールの設定

ユーザ設定:/etc/apache2/httpd.conf

ポート設定:/etc/apache2/ports.conf

一般的な追加:/etc/apache2/conf.d/

バーチャルホストやサイト固有の設定:/etc/apache2/sites-enabled/

13 / 29

Page 14: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

バーチャルホスト

IPアドレスとホスト名をさまざまに対応付けられる

同じ IPアドレスに複数の名前

NameVirtualHost *:80<VirtualHost *:80>ServerName www.example.comDocumentRoot /var/www1

</VirtualHost><VirtualHost *:80>ServerName www.example.orgDocumentRoot /var/www2

</VirtualHost>

同じホストに複数の IPアドレス

<VirtualHost 10.0.0.1>ServerName ~DocumentRoot ~

</VirtualHost>

ポートで分けることもできる<VirtualHost *:8080>

14 / 29

Page 15: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

Proxy

フォワードプロキシ

中のクライアント (ブラウザ)を外に出ていけるようにするため

キャッシュ機能も付いている.mod cacheを使う.

ブラウザ側で設定が必要

GET~や Hostはオリジン URL.パケットをプロキシに送る.プロキシから本来のサイトをアクセス.

ProxyRequests on

リバースプロキシ

中のサーバを外から見えるようにするため

負荷振り分けにも使える

キャッシュ機能も付いている

ブラウザ側の設定は不要.ブラウザは,リバースプロキシがターゲットのサイトそのものだと思っている.

ProxyPass /test http://localhost:3000/test

15 / 29

Page 16: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

プロキシ経由アクセスのダンプ

[proxy.de.shibaura-it.ac.jp へのパケット]

GET http://www.google.co.jp/ HTTP/1.1Host: www.google.co.jpProxy-Connection: keep-aliveAccept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.84 Safari/534.13Accept-Encoding: gzip,deflate,sdchAccept-Language: ja,en-US;q=0.8,en;q=0.6Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.3Cookie: PREF=ID=3e5f9~

[proxy.de.shibaura-it.ac.jp からのパケット]

HTTP/1.0 200 OKContent-Type: text/html; charset=UTF-8Date: Thu, 10 Feb 2011 07:12:13 GMTExpires: Thu, 10 Feb 2011 07:12:13 GMTCache-Control: private, must-revalidate, max-age=0Last-Modified: Thu, 10 Feb 2011 07:12:13 GMTETag: 7869640352321481114Set-Cookie: IGTP=LI=1:LM=1297321933; expires=Sat, 09-Feb-2013 07:12:13 GMT; path=/ig; domain=www.google.co.jpSet-Cookie: SID=DQAAA~; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.co.jpX-Content-Type-Options: nosniffServer: igfeContent-Encoding: gzipX-Cache: MISS from proxyyi01.sic.shibaura-it.ac.jpVia: 1.0 proxyyi01.sic.shibaura-it.ac.jp:10080 (squid/2.7.STABLE9)Connection: close

16 / 29

Page 17: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

mod alias

Aliasと Redirectのモジュール

Alias /foo/bar /baz

Redirect "/example" "http://www2.example.com/new/location"

さらに正規表現も使える

Redirect "example(/.*)" "http://www2.example.com/new/location"

より強力な Rewriteという機能もある

17 / 29

Page 18: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

その他のさまざまなモジュール

moduleのリストは http://httpd.apache.org/docs/2.4/mod/

mod proxy: プロキシ設定のためのモジュール

mod ssl: httpsのためのモジュール

mod cache: コンテンツのキャッシュmod disk cacheかmod mem cacheと組み合わせて使う

mod rewrite: URLを正規表現ベースで任意の形に書き換え自分のサイト外の URLにすることもできる.その場合は自動的に redirectしてくれる.

mod deflate: コンテンツの圧縮

mod perl, mod php: perlや php

18 / 29

Page 19: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

CGI (Common Gateway Interface)

Webサーバー内でプログラムを動かす仕組み

http://www.example.com/cgi-bin/test.cgiなどと呼ぶと,test.cgiというページでなく,test.cgiというプログラムが実行される.

19 / 29

Page 20: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

cgi の設定

/etc/apache2/sites-enabled/000-defaultの中:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

<Directory "/usr/lib/cgi-bin">

AllowOverride None

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

Order allow,deny

Allow from all

</Directory>

20 / 29

Page 21: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

cgi プログラムの例

testcgi.c: GETで動かした時の例.主な環境を返す.最初の 3行が重要

testform.c: POSTの出力.このプログラムはどうでもいいが,結果は,name=yamazaki&birthday=10

のようになる.

method="GET"にすると,QUERY_STRINGが上のようになるだけ.apacheからの情報は環境変数に入っているので,getenv()を使う.httpのヘッダは,HTTP_で始まる環境変数に入っている.例えば,Last-event-idは HTTP_LAST_EVENT_IDに入っている.

rest.rb: rubyの例

21 / 29

Page 22: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

Tomcat

Tomcatとは

Servlet (全部を Javaで書く)

JSP (HTML埋め込み型)

Apacheと連係させることも単体も可

Servletは Java版の CGI毎回プロセス起動しないので軽い (Javaの VMの中の話)Javaのさまざまなライブラリを利用できる

22 / 29

Page 23: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

Servlet のプログラム

【tomcat/src/WEB-INFの中】

web.xml => アクセスされた URLと呼び出すクラスの対応classes/* => クラスファイル置き場lib/* => ?

23 / 29

Page 24: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

JSP (Java Server Pages)

HTML中に Javaのプログラムを埋め込める:

<body>

...

<% out.println(expr) %>

プログラムが印刷したものが,そのままページの一部になる.

<%= expr =%>

式 exprの値を HTMLに埋め込む.(toString()してるだけ)

<%@ ... %> page全体の宣言

<%! ... %> メソッドの宣言

セッション実装の機能も用意されている

24 / 29

Page 25: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

実際の JSPのプログラム

src/tomcat/

testform.html: これを submitすると,form.jspを呼ぶ.method=は PUTでも POSTでも JSPプログラムは同じ.

form.jsp

test.jsp

form_jsp.java: form.jsp から自動生成されたコードtest_jsp.java: test.jsp から自動生成されたコード

25 / 29

Page 26: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

Node.js

サーバーサイド JavaScriptで書かれたWeb Server

Web Serverに対してプラグインやモジュールを入れていくのではなく

Web Serverを自分でプログラムする→ server.js

すべてをイベント駆動の形で記述する→高速http://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests

(ただし JavaScript自身はシングルスレッドなので,うまく書かないと駄目)

クライアントと同じ書き方ができる.JSONも当然得意.

WebSocketなど最新の機能が早く導入される

26 / 29

Page 27: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

高性能化

C10K Problem: クライアントを 10000接続処理することの難しさ解決法

select/poll +非同期 IO (AIO) [nginx, lighttpd, node.js]通信の待ちと IOの待ちからどう逃げるか

軽量スレッド [Apache]

select/poll使っても,例えば checksumエラーのパケットが来ると偽陽性になる.非同期 IOは必須.もちろんファイルのリードでも.

ロードバランサ: サーバをスケールアウト

ハード: Citrix Netscalerなど (数十Gbpsまで行けるが高価)

ソフト: Linux LVSなど

通常構成と DSR (Direct Server Return)構成

セッションが入ると大変

27 / 29

Page 28: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

The fastest web server in the world?

引用元 http://seravo.fi/2012/the-fastest-web-server-in-the-world

Speed of individual requests

Average total time in milliseconds

How long did it take to deliver 414000 files?

Page 29: 12 回の目次 - SICyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request は以下の順序でフェーズを管理する URI to filename translation Check

課題提出について

課題: 本授業で説明した技術を用いた通信アプリ (新規性は問わない)例:

第 3 者サイトの API を使ったアプリ

HTML5 の新機能を使ったアプリ

サーバーで何か工夫したアプリ (Web サーバ立てました,は駄目)

実装方法:

自分で環境を設定できる場合:Apache/Tomcat/Node.js を立てて何かする

大学の PC だけで何とかする場合:

無料の外部サーバを使うIaaS:例えば Amazon EC2PaaS:例えば HerokuMyVolume 上の public html にページを作ってブラウザで開くJS で (google や Twitter などの) API を呼び何かを作る

提出方法:

第 15 回 (2014 年 1 月 23 日)に概要と全体構成を発表パワーポイント使用 (発表しなかったら不可)

数日以内に以下を提出 (正確な〆切りは当日指定)上記パワポ +ソースコード +詳細説明またはソース中のコメント

29 / 29