第 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
© Copyright 2024 Paperzz