Apache HTTP Server
1995年から開発されている老舗のオープンソースWebサーバー。豊富なモジュールと高い拡張性が特徴。.htaccessサポートとmod_rewrite機能で柔軟な設定が可能。
Apache HTTP Server
Apache HTTP Serverは、世界で最も広く使用されているオープンソースのWebサーバーの一つです。1995年から開発が続けられており、豊富な機能と高い拡張性により、様々な環境で使用されています。
概要
Apache HTTP Serverは、HTTPリクエストを処理してWebページやその他のコンテンツをクライアントに配信するWebサーバーソフトウェアです。Apache Software Foundationによって開発・保守されており、多くのLinuxディストリビューションでデフォルトのWebサーバーとして採用されています。
技術的特徴
アーキテクチャ
- プロセス/スレッドベースモデル: 複数のプロセスやスレッドでリクエストを並行処理
- Multi-Processing Modules (MPM): 異なる動作モードでリクエスト処理をカスタマイズ
- モジュール化設計: 必要な機能だけを選択して組み込み可能
パフォーマンス
- 安定性重視: 長時間稼働での安定性を重視した設計
- リソース効率: メモリ使用量を抑えた軽量な動作
- 負荷分散: mod_proxy_balancerによる負荷分散機能
長所
豊富な機能
- 多数のモジュール: 500以上の公式・サードパーティモジュール
- 仮想ホスト: 1台のサーバーで複数のWebサイトをホスト
- 詳細なアクセス制御: .htaccessファイルによる柔軟な設定
安定性と信頼性
- 長期サポート: 20年以上の開発とメンテナンス実績
- 豊富なドキュメント: 詳細で包括的な公式ドキュメント
- セキュリティ: 定期的なセキュリティアップデート
互換性
- プラットフォーム対応: Linux、Windows、macOS、Solarisなど多数対応
- 言語サポート: PHP、Perl、Python、Rubyなど多言語対応
- プロトコル対応: HTTP/1.1、HTTP/2、WebSocket対応
短所
パフォーマンス
- 同時接続数制限: 大量の同時接続でのパフォーマンス課題
- メモリ使用量: 静的ファイル配信でのメモリ効率がNginxより劣る
- レスポンス時間: 高負荷時のレスポンス時間の増加
設定の複雑性
- 学習コストが高い: 豊富な機能による設定の複雑化
- 設定ファイル: 複数ファイルに分散した設定の管理が困難
- トラブルシューティング: 問題の原因特定に時間がかかる場合がある
基本的なコード例
基本設定(httpd.conf)
# サーバールート設定
ServerRoot "/etc/httpd"
# ポート設定
Listen 80
Listen 443 ssl
# ユーザー・グループ設定
User apache
Group apache
# ドキュメントルート設定
DocumentRoot "/var/www/html"
# ディレクトリアクセス設定
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
仮想ホスト設定
# 名前ベース仮想ホスト
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot "/var/www/example.com"
# ログ設定
ErrorLog logs/example.com_error.log
CustomLog logs/example.com_access.log combined
# ディレクトリ設定
<Directory "/var/www/example.com">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
# SSL仮想ホスト
<VirtualHost *:443>
ServerName secure.example.com
DocumentRoot "/var/www/secure"
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/example.com.crt"
SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
# セキュリティヘッダー
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
</VirtualHost>
.htaccessの例
# URL書き換え
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
# キャッシュ制御
<FilesMatch "\.(css|js|png|jpg|jpeg|gif|ico|svg)$">
ExpiresActive On
ExpiresDefault "access plus 1 month"
</FilesMatch>
# Gzip圧縮
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
Docker Compose設定
version: '3.8'
services:
apache:
image: httpd:2.4
ports:
- "80:80"
- "443:443"
volumes:
- ./website:/usr/local/apache2/htdocs/
- ./httpd.conf:/usr/local/apache2/conf/httpd.conf
- ./ssl-certs:/usr/local/apache2/conf/ssl/
environment:
- APACHE_LOG_LEVEL=info
restart: unless-stopped
# PHP-FPMとの連携
php-fpm:
image: php:8.2-fpm
volumes:
- ./website:/var/www/html
depends_on:
- apache
プロキシ設定
# リバースプロキシ設定
<VirtualHost *:80>
ServerName app.example.com
ProxyPreserveHost On
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
# WebSocket対応
ProxyPass /ws/ ws://localhost:3000/ws/
ProxyPassReverse /ws/ ws://localhost:3000/ws/
</VirtualHost>
# 負荷分散設定
<VirtualHost *:80>
ServerName lb.example.com
ProxyPreserveHost On
<Proxy balancer://mycluster>
BalancerMember http://server1:8080
BalancerMember http://server2:8080
BalancerMember http://server3:8080
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
# バランサー管理画面
ProxyPass /balancer-manager !
<Location "/balancer-manager">
SetHandler balancer-manager
Require local
</Location>
</VirtualHost>
CMake設定例
# Apache HTTP Server用CMake設定
cmake_minimum_required(VERSION 3.0)
project(httpd C)
# 依存関係の設定
find_package(APR REQUIRED)
find_package(PCRE REQUIRED)
find_package(OpenSSL)
# インクルードディレクトリ
include_directories(
${APR_INCLUDE_DIR}
${PCRE_INCLUDE_DIR}
include
os/unix
server
)
# ソースファイル
set(HTTPD_SOURCES
server/main.c
server/config.c
server/log.c
server/request.c
modules/http/http_core.c
modules/http/http_protocol.c
)
# 実行ファイルの作成
add_executable(httpd ${HTTPD_SOURCES})
# ライブラリのリンク
target_link_libraries(httpd
${APR_LIBRARIES}
${PCRE_LIBRARIES}
${OPENSSL_LIBRARIES}
)
# インストール設定
install(TARGETS httpd DESTINATION bin)
install(DIRECTORY conf/ DESTINATION conf)
セキュリティ設定
# セキュリティ設定
ServerTokens Prod
ServerSignature Off
# セキュリティヘッダー
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# ディレクトリトラバーサル防止
<Directory />
Options -Indexes -Includes -ExecCGI
AllowOverride None
Require all denied
</Directory>
# 機密ファイルのアクセス制御
<FilesMatch "^\.">
Require all denied
</FilesMatch>
<FilesMatch "\.(conf|log|sql|bak)$">
Require all denied
</FilesMatch>
# ModSecurity設定(WAF)
LoadModule security2_module modules/mod_security2.so
<IfModule mod_security2.c>
SecRuleEngine On
SecDataDir /tmp
Include /etc/modsecurity/modsecurity.conf
Include /etc/modsecurity/owasp-crs/*.conf
</IfModule>