第12回 Webサーバーの基本

第 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 された内容を表示する JSP
form jsp.java: form.jsp の java への展開結果
test.jsp: <% や <%!の入った JSP
test 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 available
information
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.conf
Debian の場合はこれがメインで,ここから 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.com
DocumentRoot /var/www1
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.org
DocumentRoot /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.1
Host: www.google.co.jp
Proxy-Connection: keep-alive
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,i
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.3
Cookie: PREF=ID=3e5f9∼
[proxy.de.shibaura-it.ac.jp からのパケット]
HTTP/1.0 200 OK
Content-Type: text/html; charset=UTF-8
Date: Thu, 10 Feb 2011 07:12:13 GMT
Expires: Thu, 10 Feb 2011 07:12:13 GMT
Cache-Control: private, must-revalidate, max-age=0
Last-Modified: Thu, 10 Feb 2011 07:12:13 GMT
ETag: 7869640352321481114
Set-Cookie: IGTP=LI=1:LM=1297321933; expires=Sat, 09-Feb-2013 07:12:13 GMT; path
Set-Cookie: SID=DQAAA∼; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.g
X-Content-Type-Options: nosniff
Server: igfe
Content-Encoding: gzip
X-Cache: MISS from proxyyi01.sic.shibaura-it.ac.jp
Via: 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?
Speed of individual requests
How long did it take to deliver 414000 files?
Average total time in milliseconds
引用元 http://seravo.fi/2012/the-fastest-web-server-in-the-world
課題提出について
課題: 本授業で説明した技術を用いた通信アプリ (新規性は問わない)
例:
第 3 者サイトの API を使ったアプリ
HTML5 の新機能を使ったアプリ
サーバーで何か工夫したアプリ (Web サーバ立てました,は駄目)
実装方法:
自分で環境を設定できる場合:
Apache/Tomcat/Node.js を立てて何かする
大学の PC だけで何とかする場合:
無料の外部サーバを使う
IaaS: 例えば Amazon EC2
PaaS: 例えば Heroku
MyVolume 上の public html にページを作ってブラウザで開く
JS で (google や Twitter などの) API を呼び何かを作る
提出方法:
第 15 回 (2014 年 1 月 23 日) に概要と全体構成を発表
パワーポイント使用 (発表しなかったら不可)
数日以内に以下を提出 (正確な〆切りは当日指定)
上記パワポ + ソースコード + 詳細説明 または ソース中のコメント
29 / 29