12 回の目次 - sicyamaken/docs/nw12.pdf · http request によるフェーズ管理 http request...
TRANSCRIPT
第 12回の目次
前回: RESTとマッシュアップ今回:
Apacheの基本TomcatのサーバーサイドプログラミングNode.js
1 / 29
本日のソースコード
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
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
apache のアーキテクチャ
以下は apache1.3の話 (apache 2ではない)
apacheの構成
apache core
複数の apache modules (coreから呼び出される)moduleのリストは http://httpd.apache.org/docs/2.4/mod/
4 / 29
Apache の全体構成
O.A.Dragoi, The Conceptual Architecture of the Apache Web Server, CS746G, Univ. of Waterloo.
Apache Core の構成
O.A.Dragoi, The Conceptual Architecture of the Apache Web Server, CS746G, Univ. of Waterloo.
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
フェーズとModule handler の呼び出し
O.A.Dragoi, The Conceptual Architecture of the Apache Web Server, CS746G, Univ. of Waterloo.
並列処理
クライアントにつき一つのプロセス
プロセスは予め作られていて (prefork),それを割り当てる
O.A.Dragoi, The Conceptual Architecture of the Apache Web Server, CS746G, Univ. of Waterloo.
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
apache prefork/worker vs lighttpd (1)
abを利用した性能評価
http://thinkit.co.jp/book/2008/07/31/150より引用11 / 29
apache prefork/worker vs lighttpd (2)
http loadを利用した性能評価
http://thinkit.co.jp/book/2008/07/31/150より引用
12 / 29
設定
/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
バーチャルホスト
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
Proxy
フォワードプロキシ
中のクライアント (ブラウザ)を外に出ていけるようにするため
キャッシュ機能も付いている.mod cacheを使う.
ブラウザ側で設定が必要
GET~や Hostはオリジン URL.パケットをプロキシに送る.プロキシから本来のサイトをアクセス.
ProxyRequests on
リバースプロキシ
中のサーバを外から見えるようにするため
負荷振り分けにも使える
キャッシュ機能も付いている
ブラウザ側の設定は不要.ブラウザは,リバースプロキシがターゲットのサイトそのものだと思っている.
ProxyPass /test http://localhost:3000/test
15 / 29
プロキシ経由アクセスのダンプ
[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
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
その他のさまざまなモジュール
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
CGI (Common Gateway Interface)
Webサーバー内でプログラムを動かす仕組み
http://www.example.com/cgi-bin/test.cgiなどと呼ぶと,test.cgiというページでなく,test.cgiというプログラムが実行される.
19 / 29
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
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
Tomcat
Tomcatとは
Servlet (全部を Javaで書く)
JSP (HTML埋め込み型)
Apacheと連係させることも単体も可
Servletは Java版の CGI毎回プロセス起動しないので軽い (Javaの VMの中の話)Javaのさまざまなライブラリを利用できる
22 / 29
Servlet のプログラム
【tomcat/src/WEB-INFの中】
web.xml => アクセスされた URLと呼び出すクラスの対応classes/* => クラスファイル置き場lib/* => ?
23 / 29
JSP (Java Server Pages)
HTML中に Javaのプログラムを埋め込める:
<body>
...
<% out.println(expr) %>
プログラムが印刷したものが,そのままページの一部になる.
<%= expr =%>
式 exprの値を HTMLに埋め込む.(toString()してるだけ)
<%@ ... %> page全体の宣言
<%! ... %> メソッドの宣言
セッション実装の機能も用意されている
24 / 29
実際の 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
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
高性能化
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
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?
課題提出について
課題: 本授業で説明した技術を用いた通信アプリ (新規性は問わない)例:
第 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