【ITニュース解説】Understanding Domains, DNS, Servers, and Reverse Proxies
2025年09月22日に「Dev.to」が公開したITニュース「Understanding Domains, DNS, Servers, and Reverse Proxies」について初心者にもわかりやすく解説しています。
ITニュース概要
ドメインは人が読む名前で、DNSによりサーバーIPと紐付ける。サーバー上のNginx/Apacheは、要求されたドメインを判断し、静的ファイルを直接提供するか、リバースプロキシとしてバックエンドアプリに転送する。これにより、セキュリティを確保しつつユーザーへ情報を提供する。
ITニュース解説
インターネット上にウェブサイトを公開し、ユーザーがブラウザでそのサイトを閲覧できるようにするためには、いくつかの重要な技術が連携して機能している。システムエンジニアを目指す上で、ドメイン、DNS、サーバー、そしてリバースプロキシといった基本概念を理解することは非常に重要である。
まず、ドメインとはウェブサイトの住所にあたる人間が覚えやすい名前のことである。例えば、「myapp.com」のようなものがドメイン名だ。ドメインを購入するということは、この名前を使う権利を得るだけで、実際にウェブサイトのデータを置く場所(サーバー)やその管理サービス(ホスティング)を購入するわけではない。ドメインが機能するためには、そのドメインを実際にウェブサイトのデータが置かれているサーバーのIPアドレスと紐づける必要がある。IPアドレスとは、インターネット上のコンピューターを識別するための数字の羅列で、人間には覚えにくいものだ。
次に、DNS(Domain Name System)レコードの役割について説明する。DNSレコードは、ドメイン名とサーバーのIPアドレスを結びつける「地図」のようなものだ。ブラウザにドメイン名を入力すると、DNSがそのドメイン名に対応するIPアドレスを教えてくれる。主なDNSレコードには以下の種類がある。Aレコードはドメイン名をIPv4アドレス(例: 123.45.67.89)にマッピングし、AAAAレコードはIPv6アドレスにマッピングする。また、CNAMEレコードはドメイン名を別のドメイン名にマッピングするために使われる。例えば、「www.myapp.com」を「myapp.com」に紐づけることで、どちらのURLでも同じウェブサイトにアクセスできるようになる。さらに、「api.myapp.com」や「blog.myapp.com」のようなサブドメインも、AレコードやAAAAレコードを使って特定のサーバーIPアドレスを指すように設定できる。
これらのサブドメインは、通常、単一の公開IPアドレスを持つ一つのサーバーを指し示す。つまり、複数のサブドメインが同じ物理的なサーバーに到達するのだ。サーバーにリクエストが届いたとき、Webサーバー(NginxやApacheなど)は、リクエストに含まれる「Hostヘッダー」という情報を見て、どのドメインやサブドメインへのリクエストなのかを判断する。Hostヘッダーが「api.myapp.com」であればAPIアプリケーションを、「blog.myapp.com」であればブログアプリケーションを、といった具合に、リクエストされたサイトに応じて異なるアプリケーションやコンテンツを提供する。これは、Nginxの「serverブロック」やApacheの「Virtual Hosts」といった設定によって実現される。
WebサーバーであるNginxやApacheは、インターネットからのリクエストを受け付ける中心的な役割を担う。これらのサーバーは、通常、ウェブ通信に使われるポート80(HTTP通信用)とポート443(HTTPS通信用)で外部からの接続を待ち受けている。リクエストが来ると、Webサーバーは前述のHostヘッダーを読み取り、事前に設定された構成(例えばNginxのsites-availableディレクトリ内の設定ファイルなど)と照合する。そして、その設定に基づいて、適切なプロジェクトフォルダ内の静的ファイル(HTML、CSS、JavaScriptなど)を直接ユーザーに返すか、あるいは動的なバックエンドアプリケーションにリクエストを転送(プロキシ)するかのいずれかの処理を行う。例えば、ReactやAngularといったフロントエンドフレームワークで作られた静的なウェブアプリケーションであれば、ビルドされたHTML、JS、CSSファイルをそのまま提供する。一方、Node.jsやDjangoといったバックエンドフレームワークで作られた動的なアプリケーションは、サーバーの内部ポート(例: 5000番や8000番)で実行され、Webサーバーがそれらのアプリケーションにリクエストを転送する必要がある。
ここで「リバースプロキシ」という技術が登場する。リバースプロキシが必要な理由は、バックエンドアプリケーションが直接ポート80や443で動作すべきではないという原則があるからだ。バックエンドアプリケーションは通常、サーバー内部の特定のポートで実行されており、これらのポートはセキュリティ上の理由や管理のしやすさから、外部から直接アクセスできないようになっている。リバースプロキシは、ユーザーからのリクエストをポート80/443で受け取り、それをバックエンドアプリケーションが待ち受けている内部ポートに転送する「ゲートウェイ」として機能する。例えば、ユーザーが「https://api.myapp.com」にアクセスすると、Nginxがそのリクエストを受け取り、それを内部の「http://localhost:5000」で動作しているアプリケーションに転送する。アプリケーションからの応答は再びNginxを経由してユーザーのブラウザに返される。
リバースプロキシを利用することには、いくつかの重要なメリットがある。第一にセキュリティの向上だ。バックエンドアプリケーションの生ポートを外部に直接公開しないことで、不正なアクセス試行からアプリケーションを保護できる。第二にクリーンなURLの提供だ。ユーザーは「myapp.com:5000」のような内部ポート番号を含むURLではなく、シンプルで分かりやすい「myapp.com」といったURLのみを目にすることになる。第三にSSL/TLS通信の集中管理だ。NginxのようなWebサーバーがHTTPS通信に必要なSSL証明書の処理を一手に引き受けるため、各バックエンドアプリケーションでSSL対応を行う手間が省ける。最後に、複数のバックエンドサーバーがある場合に、リバースプロキシがリクエストを分散させる「ロードバランシング」機能も提供できるため、システムの可用性とパフォーマンスが向上する。
具体的なNginxの設定例を見てみよう。バックエンドでNode.jsやDjangoのアプリケーションが「http://localhost:5000」で動作しているとする。Nginxの設定ファイルでは、「listen 80;」でポート80でリクエストを待ち受け、「server_name api.myapp.com;」で「api.myapp.com」というドメイン名に対応すると定義する。そして、「location / { proxy_pass http://localhost:5000; ... }」という設定で、このドメインへのすべてのリクエストを内部の「http://localhost:5000」へ転送する。これにより、ブラウザから「https://api.myapp.com/login」のようなリクエストが来ると、Nginxがそれを受け取り、内部のバックエンドアプリケーションへ転送し、その結果をユーザーに返すという一連の処理がスムーズに行われる。
まとめると、ウェブサイト公開の一連の流れは以下のようになる。まず、ドメイン名を購入し、そのドメイン名を人間が覚えやすいラベルとして確保する。次に、DNSレコードを設定し、そのドメイン名を実際にウェブサイトのデータが置かれているサーバーのIPアドレスに紐づける。サーバーは、Webサーバー(NginxやApacheなど)が外部からのリクエストを待ち受けている。Webサーバーは、リクエストに含まれるドメイン名(Hostヘッダー)に基づいて、どのウェブサイトへのリクエストなのかを判断する。そして、静的なウェブサイトであれば、Webサーバーが直接ファイルを提供し、動的なアプリケーションであれば、リバースプロキシ機能を使ってバックエンドアプリケーションにリクエストを転送する。この一連の仕組みにより、ユーザーはサーバーの内部事情を知ることなく、クリーンなドメイン名を通じてウェブサイトを快適に利用できるのだ。これらの技術は、現代のウェブアプリケーション開発において不可欠な基盤となっている。