--- name: apache description: Apache HTTP Server 配置 version: 1.0.0 author: terminal-skills tags: [server, apache, httpd, web, vhost] --- # Apache 配置 ## 概述 Apache HTTP Server 配置、虚拟主机、模块管理等技能。 ## 基础管理 ### 服务控制 ```bash # CentOS/RHEL systemctl start httpd systemctl stop httpd systemctl restart httpd systemctl reload httpd # Ubuntu/Debian systemctl start apache2 systemctl stop apache2 systemctl restart apache2 systemctl reload apache2 # 配置测试 apachectl configtest httpd -t ``` ### 配置文件 ```bash # CentOS/RHEL /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf # Ubuntu/Debian /etc/apache2/apache2.conf /etc/apache2/sites-available/ /etc/apache2/sites-enabled/ # 日志 /var/log/httpd/ # CentOS /var/log/apache2/ # Ubuntu ``` ### 模块管理 ```bash # Ubuntu/Debian a2enmod rewrite # 启用模块 a2dismod rewrite # 禁用模块 a2ensite example.conf # 启用站点 a2dissite example.conf # 禁用站点 # CentOS/RHEL # 编辑 /etc/httpd/conf.modules.d/ httpd -M # 列出已加载模块 ``` ## 虚拟主机 ### 基于域名 ```apache ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/example Options -Indexes +FollowSymLinks AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/example-error.log CustomLog ${APACHE_LOG_DIR}/example-access.log combined ``` ### HTTPS 配置 ```apache ServerName example.com DocumentRoot /var/www/example SSLEngine on SSLCertificateFile /etc/ssl/certs/example.crt SSLCertificateKeyFile /etc/ssl/private/example.key SSLCertificateChainFile /etc/ssl/certs/chain.crt # SSL 优化 SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 SSLHonorCipherOrder off Header always set Strict-Transport-Security "max-age=31536000" # HTTP 重定向 ServerName example.com Redirect permanent / https://example.com/ ``` ## 反向代理 ### 基础代理 ```apache # 启用模块 # a2enmod proxy proxy_http ServerName api.example.com ProxyPreserveHost On ProxyPass / http://127.0.0.1:3000/ ProxyPassReverse / http://127.0.0.1:3000/ # 超时设置 ProxyTimeout 300 ``` ### 负载均衡 ```apache # 启用模块 # a2enmod proxy_balancer lbmethod_byrequests BalancerMember http://192.168.1.10:8080 BalancerMember http://192.168.1.11:8080 ProxySet lbmethod=byrequests ServerName app.example.com ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ ``` ## URL 重写 ### 基础重写 ```apache # 启用模块 # a2enmod rewrite RewriteEngine On # 强制 HTTPS RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 去除 www RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301] # 前端路由(SPA) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.html [L] ``` ### .htaccess ```apache # /var/www/html/.htaccess RewriteEngine On # 隐藏 .php 扩展名 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L] # 防盗链 RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com [NC] RewriteRule \.(jpg|jpeg|png|gif)$ - [F] ``` ## 安全配置 ### 基础安全 ```apache # 隐藏版本信息 ServerTokens Prod ServerSignature Off # 禁用目录列表 Options -Indexes # 安全头 Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set X-XSS-Protection "1; mode=block" ``` ### 访问控制 ```apache # IP 限制 Require ip 192.168.1.0/24 # 基础认证 AuthType Basic AuthName "Restricted Area" AuthUserFile /etc/apache2/.htpasswd Require valid-user # 创建密码文件 # htpasswd -c /etc/apache2/.htpasswd username ``` ## 常见场景 ### 场景 1:PHP 配置 ```apache ServerName example.com DocumentRoot /var/www/html SetHandler "proxy:unix:/var/run/php/php-fpm.sock|fcgi://localhost" AllowOverride All Require all granted ``` ### 场景 2:限流 ```apache # 启用模块 # a2enmod ratelimit SetOutputFilter RATE_LIMIT SetEnv rate-limit 400 ``` ### 场景 3:日志格式 ```apache LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined_time CustomLog ${APACHE_LOG_DIR}/access.log combined_time ``` ## 故障排查 | 问题 | 排查方法 | |------|----------| | 配置错误 | `apachectl configtest` | | 403 Forbidden | 检查目录权限、SELinux | | 500 Internal Error | 查看 error.log | | 模块未加载 | `httpd -M` 检查模块 | | 性能问题 | 检查 MPM 配置、连接数 |