WWW と Apache
前提知識:Linuxの基本操作(コマンドライン,ファイル編集),ネットワークの基礎(IPアドレス,ポート番号)
【目次】
WWW
WWWとは
WWW(World Wide Web)は,インターネット上で広く利用されている情報システムである.ハイパーテキストと画像,音声,動画などを組み合わせて情報を提供でき,この規格に基づいて情報を提供するサーバをWWWサーバ(Webサーバ)と呼ぶ.
ハイパーテキストの特徴は,文書中の特定箇所をクリックするだけで関連する詳細情報へ移動できる点にある.このリンクが世界中に網の目のように張りめぐらされている.画像,音声,動画など文字以外のメディアともリンクできるものをハイパーメディアと呼ぶ.
Webという名称は,リンクが世界中にクモの巣(web)状に広がるイメージに由来する.世界各地の情報へクリックだけでアクセスできる様子を,ネットサーフィン(net surfing)と表現することもある.
Apache
Apacheは,世界中で広く使用されているオープンソースのWebサーバソフトウェアである.公式サイト(http://www.apache.org)からソースコードまたはバイナリを入手できるが,Linuxディストリビューションではパッケージマネージャからの導入が一般的である.
インストール
パッケージマネージャを使用すると,依存関係の解決や初期設定が自動的に行われるため,手動でのインストールより簡便かつ確実である.Ubuntu 24.04 LTSでは以下のコマンドでインストールできる.
# apt update
# apt install apache2
インストール完了後,systemd(Linuxのサービス管理システム)によりApacheが自動的に起動する.手動で制御する場合は以下のコマンドを使用する.
# systemctl start apache2 # 起動
# systemctl stop apache2 # 停止
# systemctl restart apache2 # 再起動
# systemctl status apache2 # 状態確認
Webブラウザで http://localhost にアクセスし,Apacheのデフォルトページが表示されればインストール成功である.
設定ファイル
Apacheの設定ファイルは/etc/apache2に配置されている.主な設定ファイルは以下の4つである.
- apache2.conf:メインの設定ファイル
- envvars:環境変数の定義
- ports.conf:待ち受けポートの設定
- mime.types:MIMEタイプの定義
歴史的にはaccess.conf,srm.confも存在したが,現在はその内容をapache2.confに記述するため,実質的にはapache2.confを中心に設定を行う.
apache2.confの主な設定項目を以下に示す.
- ServerType:standaloneまたはinetd
- Port:待ち受けポート番号(通常は80)
- StartServers:起動時に生成するhttpdプロセス数
- User:Apacheを実行するユーザ
- Group:Apacheを実行するグループ
- ServerAdmin:管理者のメールアドレス(エラーページに表示)
- ServerName:サーバのホスト名
- UserDir:ユーザごとのWebディレクトリ名(例:public_html)
- DirectoryIndex:ディレクトリアクセス時のデフォルトファイル(例:index.html)
ServerTypeの違い
Apacheの動作方式にはstandalone型とinetd型がある.用途に応じて選択する.
standalone型は,Apacheが常駐プロセスとして動作する方式である.リクエストに即座に応答できるため,アクセス頻度が高いサーバに適している.
inetd型は,inetd(スーパーサーバと呼ばれる接続管理デーモン)経由で動作する方式である.リクエストがあるたびにプロセスを起動し,処理完了後に終了する.リソース消費が少なく,TCP Wrapper(接続元IPアドレスによるアクセス制御機能)と連携できるため,セキュリティ面で優れている.アクセス頻度が低いサーバや,セキュリティを重視する環境に適している.
ディレクトリごとのアクセス制御
Apacheでは,ディレクトリ単位でアクセス権限や機能を制御できる.これにより,公開範囲の限定やセキュリティの強化が可能となる.基本的な設定例を以下に示す.
<Directory />
Options None
AllowOverride None
Require all denied
</Directory>
この設定は,ルートディレクトリ(/)以下に対して,すべてのオプションを無効化し,アクセスを拒否している.セキュリティの基本として,まず全体を拒否し,必要なディレクトリのみ許可する方針が推奨される.
Optionsディレクティブ
Optionsディレクティブで指定可能な値を以下に示す.
- None:すべてのオプションを無効化
- All:MultiViewsを除くすべてのオプションを許可
- ExecCGI:CGIプログラムの実行を許可
- FollowSymLinks:シンボリックリンクの参照を許可
- SymLinksIfOwnerMatch:所有者が一致するシンボリックリンクのみ許可
- Includes:SSI(Server Side Include:HTMLにサーバ側で動的に内容を挿入する機能)を許可
- IncludesNoExec:SSIを許可(ただしexecコマンドは除く)
- Indexes:ディレクトリ一覧の自動生成を許可
- MultiViews:コンテントネゴシエーション(言語や形式の自動選択)を許可
注意:FollowSymLinksとIndexesは,意図しないファイルの公開につながる可能性があるため,必要な場合のみ有効にする.
AllowOverrideディレクティブ
AllowOverrideディレクティブは,.htaccessファイルによる設定の上書きをどこまで許可するかを指定する..htaccessを使用すると,ディレクトリごとに個別の設定が可能となる.
- None:.htaccessによる上書きを禁止
- All:すべての上書きを許可
- AuthConfig:認証設定の上書きを許可
- FileInfo:ファイルタイプ設定の上書きを許可
- Indexes:ディレクトリインデックス設定の上書きを許可
- Limit:アクセス制御設定の上書きを許可
- Options:Optionsディレクティブの上書きを許可
注意:AllowOverride Allは利便性が高いが,.htaccessの設置により意図しない設定変更が可能となるため,セキュリティ上のリスクがある.
inetd型Webサーバの設定
inetd型として運用する場合の設定手順を以下に示す.この方式は,TCP Wrapperによるアクセス制御が利用できるため,セキュリティを重視する環境に適している.
- /etc/apache2/apache2.confでServerTypeを設定する.
ServerType inetd
- /etc/inetd.confにApacheのエントリを追加する.
http stream tcp nowait www-data /usr/sbin/apache2 apache2
- inetdを再起動して設定を反映する.
# systemctl restart inetd
設定後は,他のマシンからもWebページにアクセス可能となる.
注意:外部公開する場合は,ファイアウォールの設定やアクセス制限を適切に行うこと.内部ネットワーク限定で運用する場合は,TCP Wrapperの/etc/hosts.allowおよび/etc/hosts.denyで接続元を制限する.
standalone型の設定例
以下にstandalone型での設定例を示す.アクセス頻度が高いサーバや,レスポンス速度を重視する環境に適している.
# standalone型の設定例
ServerType standalone
ServerRoot "/etc/apache2"
StartServers 5
MaxClients 150
Port 80
User www-data
Group www-data
ServerName www.example.ac.jp
<Directory />
Options FollowSymLinks ExecCGI Includes -Indexes
AllowOverride All
Require all granted
</Directory>
UserDir public_html
DirectoryIndex index.html index.php
AccessFileName .htaccess
<Files .htaccess>
Require all denied
</Files>
CustomLog /var/log/apache2/access.log common
CustomLog /var/log/apache2/custom.log combined
ErrorLog /var/log/apache2/error.log
注意:上記の例ではRequire all grantedとしているが,本番環境では適切なアクセス制限を設定すること.
HTTPSの設定
HTTPS(HTTP over SSL/TLS)は,通信内容を暗号化するプロトコルである.HTTPSを使用することで,通信の盗聴や改ざんを防止できる.現在では,Webサイトの標準としてHTTPSの使用が推奨されている.
以下にLet's Encrypt(無料のSSL証明書発行サービス)を使用したHTTPS設定手順を示す.
- SSLモジュールを有効化する.
# a2enmod ssl
- certbot(Let's Encryptのクライアントツール)をインストールし,証明書を取得する.
# apt install certbot python3-certbot-apache
# certbot --apache -d www.example.ac.jp
- HTTPS用のサイト設定ファイル(/etc/apache2/sites-available/example-ssl.conf)を作成する.
<VirtualHost *:443>
ServerName www.example.ac.jp
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.example.ac.jp/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.ac.jp/privkey.pem
</VirtualHost>
- HTTPアクセスをHTTPSへリダイレクトする設定(/etc/apache2/sites-available/000-default.conf)を行う.これにより,ユーザがHTTPでアクセスしても自動的にHTTPSへ転送される.
<VirtualHost *:80>
ServerName www.example.ac.jp
Redirect permanent / https://www.example.ac.jp/
</VirtualHost>
- 設定を有効化し,Apacheを再起動する.
# a2ensite example-ssl
# systemctl restart apache2
注意:Let's Encryptの証明書は90日間有効である.certbotは自動更新の設定を行うが,更新が正常に動作しているか定期的に確認すること.