Apache HTTP Server

1995年から開発されている老舗のオープンソースWebサーバー。豊富なモジュールと高い拡張性が特徴。.htaccessサポートとmod_rewrite機能で柔軟な設定が可能。

WebサーバーオープンソースHTTPモジュール拡張性信頼性

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>

参考リンク