WebサイトをバーチャルホストとリバースプロキシでApacheから接続する

WebサイトをバーチャルホストとリバースプロキシでApacheから接続する方法を解説します。

Perlで新規にWebシステム開発を行う場合に、セキュリティ、開発効率、リアルタイムWeb、クラウドサーバー対応など複合的な理由で、リバースプロキシ構成で、Webサイトを作成することを推奨しています。

なぜリバースプロキシ構成で運用するか

なぜCGIプログラムのように配置するだけで動かせる方法ではなく、リバースプロキシ構成で運用することを推奨するかという理由を書きます。

セキュリティリスクの軽減

CGIプログラムと比較すると、Webフレームワークを使用することで、セキュリティリスクを最小限に抑えることができます。一般的にいうと、Webフレームワークは、文字列をHTMLに出力する場合は、エスケープしてくれるなど、Webの脆弱性に対してあらかじめ対策をとってくれています。もちろん、それだけで安全というわけではないのですが、フレームワークの流儀に従うことで、セキュリティリスクを減らすことができます。

開発効率

Webフレームワークを使うと、ユーザー環境で、Webサイトの試験を行うことができます。Apacheの上でCGIを動かすのではなく、各ユーザーのホームディレクトリの中で、Webサイトを起動して、開発を行うことができます。Webフレームワークが表示するエラーメッセージは親切です。開発効率を高めることができます。

実行速度

Webフレームワークを使って、WebサイトをPerlのWebサーバーで起動すれば、CGIのように毎回プロセスを起動することはなく、高速な実行速度を得ることができます。

リアルタイムWeb

push通知、ストリーミング、リアルタイム更新、リアルタイムチャットと呼ばれる、現代的なWeb手法がありますが、これはCGIで実現することができません。リアルタイムWebに対応したWebフレームワークを使って、Webサイトを起動し、Apacheからリバースプロキシで接続すれば、これを実現することができます。

クラウドサーバー対応

CGIプログラムは、実行速度が遅く、サーバーを増やして負荷分散機につなぐなどの、スケーラビリティを持っていません。一方、Webサイトを起動して、これをApacheのリバースプロキシからつなぐようにしておくと、これはサーバー間疎結合ですので、Apacheのリバースプロキシからの接続を負荷分散機からの接続変えるということが、自然にできます。

Apacheのバーチャルホストの主な機能

まずApacheのバーチャルホストの機能について解説します。Apacheのバーチャルホストとは、簡単にいうと、ドメインが異なる複数のWebサイトを運用するための機能です。

つまり、ドメインが異なる複数のWebサイトを運営したい場合は、Apacheのバーチャルホストという機能を使うことになります。複数のサイトを運営したいという場合は、非常に頻繁に起こりますので、ひとつのWebサイトであっても、最初からバーチャルホストでApachenの設定ファイルを作っておくことを、お勧めします。

リバースプロキシとはなにか?

リバースプロキシとは、簡単にいうと、Apacheへのアクセスを、他のサーバーへ転送する機能です。ユーザは、WebブラウザなどのHTTPクライアントからApacheに接続します。その接続を、別のサーバーに接続することができます。

PerlのWebサイトをHTTPサーバーとして起動して、特定のポートで待ち受けます。これは、Webフレームワークが提供している機能です。たとえば、8080番ポートで、待ち受けます。

Apacheでリバースプロキシの設定を行って、これを、PerlのWebサイトに接続します。バーチャルホストを使うと、異なるドメインであれば、別のポートに接続することができますから、異なるポートでWebサイトを起動して、ドメインに応じて、接続すれば、複数のWebサイトを運用できます。

リバースプロキシのために必要なApacheモジュール

リバースプロキシの設定ために必要なApacheモジュールは、mod_proxy, mod_proxy_httpです。

また、HTTPをHTTPSにリダイレクトするために、mod_rewriteが必要です。

HTTPSをサポートするためには、mod_sslが必要になります。

HTTPSであることをHTTPヘッダで教えるためにmod_headersモジュールが必要になります。

Apacheのバーチャルホストとリバースプロキシの設定

まず設定ファイルは以下のディレクトリに配置します。

/etc/apache2/sites-available

この設定ファイルのディレクトリについては、以下のページで詳しく解説しています。

サイトのドメイン名(ここではwww.mydomain.example)に「.conf」を付けた名前で、viコマンドで、設定ファイルを作成しましょう。

cd /etc/apache2/sites-available
sudo vi www.mydomain.example.conf

設定ファイルの内容は以下です。バーチャルホスト機能を使って、「www.mydomain.example」をリバースプロキシで「8080番ポート」に接続しているというところに注目してください。HTTPS対応した記述ですが、まだ本物のSSL証明書は使っておらず、自己SSL証明書を使った状態になっています。

<VirtualHost *:80>
  ServerName www.mydomain.example

  RewriteEngine on
  RewriteRule (.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
  ServerName www.mydomain.example

  <Proxy *>
    Require all granted
  </Proxy>

  ProxyRequests Off
  ProxyPreserveHost On
  ProxyPass / http://localhost:8080/ keepalive=On
  ProxyPassReverse / http://localhost:8080/
  RequestHeader set X-Forwarded-Proto "https"

  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
  SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>

設定ファイルの簡単な解説

<VirtualHost *:80>
  ServerName www.mydomain.example

  RewriteEngine on
  RewriteRule (.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

ServerNameは、Webサイトのドメイン名を記述します。http(80番ポート)への接続をmod_rewriteを使って、https(443番ポート)へリダイレクトしています。

<VirtualHost *:443>
  ServerName www.mydomain.example

  <Proxy *>
    Require all granted
  </Proxy>

  ProxyRequests Off
  ProxyPreserveHost On
  ProxyPass / http://localhost:8080/ keepalive=On
  ProxyPassReverse / http://localhost:8080/
  RequestHeader set X-Forwarded-Proto "https"

  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
  SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>

ServerNameは、Webサイトのドメイン名を記述します。

Proxyディレクティブは、必須です。プロキシリクエストを許可します。

「ProxyRequests Off」は、フォーワードプロキシ(リバースプロキシではない通常のプロキシ接続)をOffにしています。

「ProxyPreserveHost On」は、Apacheにアクセスしたクライアントのホスト名を、そのままWebアプリケーションに渡します。

ProxyPass / http://localhost:8080/ keepalive=On
ProxyPassReverse / http://localhost:8080/

上記は、ローカルホストの8080番ポートに接続するという設定です。ふたつ書く必要があります。

「RequestHeader set X-Forwarded-Proto "https"」によって、PerlのWebアプリケーションが、HTTPSによる接続であることを知ることができます

  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
  SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

上記は、自己SSL証明書の設定です。

設定ファイルの有効化

設定が終わったら、設定ファイルを有効にします。

sudo a2ensite www.mydomain.example

有効化が終わったらAapacheを再起動してください。

sudo systemctl reload apache2

8080番ポートでPerlでWebサイトが起動していることを確認してください。

「https://www.mydomain.example」でWebサイトが表示できれば成功です。

HTTPSで運用する

本番環境で、SSL証明書を取得して、HTTPSで運用したい場合は以下の記事でSSL証明書の設定方法を解説しています。

PerlでポータブルなLinuxファイル管理入門

業務に役立つPerl

Perlテキスト処理のエッセンス

ITエンジニアの求人情報など

 ITエンジニアの求人情報・Webサービス・ソフトウェア・スクールなどの情報。