本格的なWebサイトを立ち上げるなら、インターネットの基幹技術およびWebサーバの動作や仕組みを理解しておく必要がある。そこで、名前解決やURLの処理方法からWebサーバの仮想ディレクトリ、MIMEまで、ここで基礎的な知識を再確認しておこう。
第1回でApacheの特徴について紹介したところ、思いのほか多くの方に見ていただいたと聞き、Apacheへの注目度の高さを再認識している。本来ならば、ここでインストール方法や設定方法、開発手法などを紹介するところなのだが、それは少しの間お待ちいただきたく思う。そうした話よりも先に、それらの知識の基礎となる部分を再確認しておきたいからだ。
上級者にとっては、既知の内容となるかもしれないが、今回はご容赦いただきたい。
前回の内容の繰り返しとなるが、Webサーバの基本的な動作は、大きく分けて2種類しか存在しない。Webブラウザから要求されたファイルを返すか、要求されたプログラムを実行して、その結果を返すかのどちらかである(図1)。そう考えれば、すごく単純なソフトウェアなのだが、当然それだけで済まされない。
なぜ、“http://www.atmarkit.co.jp/”といったURLでサーバにアクセスできるのか。URLを受け取ったサーバは、URLをどのようにして解釈しているのか。Webブラウザは、サーバから受け取ったファイルを、どうやって表示しているのか。
Webサーバを構築し、管理しようとするならば、最低限この程度の知識が必要になる。もしも、もっと大規模で世界中からアクセスされるようなサーバであれば、これ以上の知識を要求されるのだ。高度な知識は必要に応じて徐々に学んでいけばよいとしても、最低限の知識は身に付けておきたい。
このセクションは、インターネットの大前提について述べる。TCP/IPとIPアドレスについて、すでに十分な知識のある方は、このセクションを読み飛ばしていただいて構わない。ここのテーマは、「インターネット上の無数に存在するサーバから、1つを特定してアクセスできるのはなぜか」である。
コンピュータ同士が通信する際には、“プロトコル”と呼ばれる通信手段を決定し、お互いに同じプロトコルを使わなくてはならない。これは、人間同士が会話するときに、同じ言語(日本語や英語など)を使うのと類似している。プロトコルには、さまざまな種類が存在するのだが、インターネット上では“TCP/IP”というプロトコルを利用する。
TCP/IPでは、ネットワーク上の各コンピュータに固有のIPアドレスと呼ばれる32bits(4bytes)の識別子を割り当てる。TCP/IPを使った通信は、相手のIPアドレスを指定することで、間違ったあて先に届かないようになっているのである。これは、郵便物に住所を記すことで、目的の相手に届けてもらえるのに類似している(図2)。
もうお分かりいただけたと思うが、インターネット上に存在する無数のサーバから、1つを特定するためにはIPアドレスが用いられているのである。日ごろあまり意識したことのない方もいるかもしれないが、インターネットにアクセスできるということは、皆さんのコンピュータにも必ずIPアドレスが割り当てられている。自分で割り当てた覚えがなくとも、プロバイダにダイヤルアップしたときや、会社内のLANに接続したときに割り当てられているのである。
IPアドレスを自動的に割り当てる技術をDHCP(Dynamic Host Configuration Protocol)というが、このほかにもTCP/IPに関連する技術はたくさん存在する。それをここで解説しはじめるときりがないから、興味のある方は補足1で紹介した記事を参考にしていただきたい。ここでは、サーバの特定にIPアドレスが用いられ、それを使ってサーバにアクセスすることを知っておいてほしい。
補足 TCP/IPについては、Windows 2000 Insiderに掲載されている「詳説TCP/IPプロトコル」や、堀田 倫英氏のサイト「ネットワーク管理者(の卵)養成講座」(http://www.net-newbie.com/)などを参考にすると役立つであろう。
それでは、“http://www.atmarkit.co.jp/”というURLで、@ITのサーバにアクセスできるのはなぜかを考えてみよう。先ほど解説したとおり、インターネット上のサーバを特定するにはIPアドレスが用いられるはずである。しかし、“www.atmarkit.co.jp”のIPアドレス“211.2.252.66”は、URLのどこにも記述していない。
そもそも、IPアドレスを知らないのが普通なのだから、URLに記述されていないのは当然であろう。むしろ、IPアドレスをいちいち指定していたのでは都合が悪いからこそ、今日のようにホスト名とドメイン名(URL)でアクセスできるようになったのである。そして、この仕組みを支えているのが、DNS(Domain Name System)と呼ばれる技術なのだ。
DNSは、“www.atmarkit.co.jp”のようなホスト名とドメイン名を、IPアドレスに変換するための一覧表を管理している。いわば、インターネット上の電話帳のような役割を果たしているわけだ。だからといって、1つのDNSサーバが世界中のサーバのIPアドレスを管理しているわけではなく、多数のDNSサーバが木構造を成して分散管理している(図3)。
DNSの仕組みを知ることは、インターネット技術の基礎を知るうえで重要な要素だし、それ自体が興味深い技術だ。しかし、ここで詳細に解説していると、Apacheの話題からは外れてしまうから割愛する。
本連載の内容を理解するうえで知っておいていただきたいのは、
以上の3点である。もしも、これらの意味が分からない場合は、Linux Squareに掲載されている「BINDで作るDNSサーバ」などを参考にしていただきたい。DNSの仕組みについてはこれ以外にもインターネット上に多数掲載されている。それらも併せて活用していただけば、数時間もかからずにDNSを理解できるはずだ。
何はともあれ、インターネット上のサーバは、IPアドレスを使って特定されることを理解していただけたと思う。しかし、それだけではまだクライアントとサーバの通信について、十分に知識を得たとはいえない。なぜならば、IPアドレスでサーバを特定しても、それだけではサーバ上のプログラムまで特定できないからである。
考えてみていただきたいのだが、皆さんがいま使っているコンピュータの中で、TCP/IPを使って通信するアプリケーションは幾つあるだろうか。著名なものだけ考えても、telnet、FTP、POP3(Mail)などが挙げられるし、Outlookやノーツのようなグループウェアも使われているかもしれない。ネットワーク対戦型のゲームや、インスタントメッセンジャーも使われているのではないだろうか。
普段意識することはないと思うが、こうしたアプリケーションがサーバと通信する場合、ネットワークを通じてやりとりしたデータを、正しいアプリケーションに導いてやらなければならないのである。例えば、電子メール(POP3)の通信パケットをFTPクライアントに渡してしまったらエラーになるだろうし、ゲームの通信パケットをWebブラウザに渡されてはゲームが継続できなくなるだろう。ここでは、クライアントとして使っているアプリケーションを例に挙げたが、これはサーバ側においてもまったく同じことがいえる。
こうしたミスが起こらないよう、TCP/IPを使って通信を受信するサーバは、アプリケーションごとに「ポート」と呼ばれる番号を割り当てる。通信を送信するクライアント側では、サーバのIPアドレスとともに、アプリケーションのポート番号も指定する。そうすることで、クライアントからの通信は、その内容に応じたアプリケーションに渡されるようになるのだ(図4)。
例えるなら、IPアドレスはマンションの住所を示すもので、ポート番号はその部屋番号を示すものといえるのである。ちなみに、サーバ1つ当たりのポートの数(部屋の数)は、0番から65535番までの65536個存在する。複数のアプリケーションに同じ番号を割り当てさえしなければ、この範囲内で自由にポート番号を割り当てることができるから、通常は不足することなどあり得ない。
TCP/IPで利用できるポート番号のうち、広く一般に使われるアプリケーションで利用するために、あらかじめ割り当てが決まっているポート。FTPの21、telnetの23、HTTPの80、HTTPSの443など。0〜65535番まであるポート番号のうち、0〜1023まではIANA(Internet Assigned Numbers Authority)という組織によって管理されていて、利用するためにはroot権限が必要になる。
本文中では、1024番以降は自由に使えると説明したが、実際には49151番まで予約済みポートとして使われている(すべてではない)。この中にはめったに使わないアプリケーションもたくさんあるから、あまり過敏になる必要はないが、自分のサーバで使われていないことは確認する必要がある。ウェルノウンポートや予約済みポートについては、IANAのホームページ(http://www.iana.org/)や、インターネット上で公開されている文書を参照していただきたい。
しかし、いくら自由だからといっても、サーバごとに好き勝手に設定するわけにはいかない。広く一般に用いられるアプリケーションにもかかわらず、ポート番号がサーバごとに違っていたのでは、利用する側がいちいち意識しなくてはならなくなり、利便性を大きく損なってしまうからだ。例えば、Webサーバのポート番号がサイトごとに違っていたら、アクセスするサイトごとにポート番号を指定しなくてはいけなくなってしまう。
そうしたことが起こらないよう、広く一般に使われるアプリケーションについては、どのサーバでも同じポート番号を指定しなくてはならない。その番号を決定するガイドラインともいえるのが「ウェルノウンポート」(コラム:「ウェルノウンポートとは」参照)で、0から1023番までのポートを特別なポートに位置付け、一般的なアプリケーションが使うポート番号を指定している。逆にいえば、このガイドに従ってポート番号を決定しないと、一般からのアクセスを期待できないということになるのだ。
もちろん、セキュリティ上の理由などでポート番号を変更し、ポート番号を知らない人間はアクセスできないようにすることもあるだろう。そうした場合には、1024番以降のポート番号で、なおかつほかのアプリケーションが使っていない番号を指定すれば問題ない。Apacheの場合にも、管理者用のWebサイトなどを立ち上げるために、あえて別のポート番号を指定することもある(コラム:「ポート番号を指定する」参照)。
Apacheでは、1つのサーバ上で複数のポートを使ったサービスを起動できるようになっているから、こうした場合にWebサーバを複数台用意する必要はない。管理者用のサイトに限らず、社内向けのイントラネットなどでは、ポート番号を分けて複数のサービスを提供することも考えられるだろう。そのあたりの設定など、詳しいことは次回以降に説明するので、今回の内容と併せて参考にしていただきたい。
本文中では、ポート番号の意味とサーバ側での使い分けを説明したが、クライアント側ではどのように使い分ければいいのだろうか。意外と知られていないのだが、Webブラウザの場合は、URLでポート番号を指定することができる。具体的には、「http://www.atmarkit.co.jp:80/」のように、ドメイン名の直後に「:」(コロン)で区切ってポート番号を指定する。
普段ポート番号を指定しなくてもサーバにアクセスできるのは、HTTPのウェルノウンポートは80と決まっているためで、「http://」から判断して、ブラウザが自動的に80番へとアクセスしているからである。ここで紹介したように、明示的にポート番号を指定した場合は、80番の代わりに指定したポートへとアクセスする。
従って、本文中で説明したようにサーバ側でポート番号を使い分けている場合は、利用したいサービスに合わせてポート番号を指定する。社員紹介ページは「http://172.16.1.10:6666/」、経費清算は「http://172.16.1.10:7070/」、在庫情報は「http://172.16.1.10:5555」といった具合だ。もちろん、これらを1つのポートでサービスすることもできるが、このように使い分けることで、アクセス権限の設定などの柔軟性を確保することが考えられる。
Webに限らず、ポート番号の考え方を理解していると何かと便利である。ここで理解した知識を生かし、さらに高度な使いこなしを学んでいただきたいと思う。
Copyright © ITmedia, Inc. All Rights Reserved.