apache配置反向代理

以下是Apache配置反向代理的详细步骤:

1. 启用必要的模块

复制代码
# Ubuntu/Debian
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo a2enmod headers
sudo a2enmod rewrite
sudo a2enmod ssl  # 如果需要HTTPS

# 重启Apache
sudo systemctl restart apache2

# CentOS/RHEL/Fedora
sudo dnf install mod_proxy  # 或 yum install mod_proxy
# 确保httpd.conf中有这些模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

2. 基本反向代理配置

示例1:将根路径代理到后端应用

复制代码
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    
    ProxyPreserveHost On
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
    
    # 传递客户端真实IP
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 127.0.0.1
</VirtualHost>

示例2:代理特定路径

复制代码
<VirtualHost *:80>
    ServerName example.com
    
    # 代理 /api 到后端应用
    ProxyPass /api/ http://backend-server:8080/
    ProxyPassReverse /api/ http://backend-server:8080/
    
    # 代理 /app 到另一个应用
    ProxyPass /app/ http://app-server:3000/
    ProxyPassReverse /app/ http://app-server:3000/
    
    # 静态文件由Apache处理
    DocumentRoot /var/www/html
</VirtualHost>

3. 高级配置示例

带负载均衡的反向代理

复制代码
<VirtualHost *:80>
    ServerName example.com
    
    <Proxy balancer://mycluster>
        # 定义后端服务器集群
        BalancerMember http://backend1:8080 route=1
        BalancerMember http://backend2:8080 route=2
        BalancerMember http://backend3:8080
        
        # 负载均衡算法
        ProxySet lbmethod=byrequests
        
        # 会话粘性
        ProxySet stickysession=JSESSIONID
        
        # 健康检查
        ProxySet failonstatus=500,503
    </Proxy>
    
    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/
    
    # 健康检查页面
    <Location /balancer-manager>
        SetHandler balancer-manager
        Require ip 192.168.1.0/24
    </Location>
</VirtualHost>

WebSocket代理配置

复制代码
<VirtualHost *:80>
    ServerName example.com
    
    # WebSocket支持
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule /(.*) "ws://backend:8080/$1" [P]
    
    # 普通HTTP代理
    ProxyPass / http://backend:8080/
    ProxyPassReverse / http://backend:8080/
    
    # 设置WebSocket代理头
    ProxyPass /ws/ ws://backend:8080/ws/
    ProxyPassReverse /ws/ ws://backend:8080/ws/
</VirtualHost>

4. HTTPS反向代理配置

复制代码
<VirtualHost *:443>
    ServerName example.com
    
    # SSL配置
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key
    SSLCertificateChainFile /etc/ssl/certs/chain.pem
    
    # 代理到后端HTTP
    ProxyPreserveHost On
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
    
    # 设置HTTPS相关的头
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"
</VirtualHost>

# HTTP重定向到HTTPS
<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

5. 配置头信息传递

复制代码
<VirtualHost *:80>
    ServerName example.com
    
    # 传递原始客户端信息
    ProxyPreserveHost On
    ProxyRequests Off
    
    # 设置代理头
    RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
    RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
    RequestHeader set X-Forwarded-Proto "http"
    RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s"
    
    # 添加安全头
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    
    # 隐藏服务器信息
    ServerSignature Off
    ServerTokens Prod
    
    ProxyPass / http://backend:8080/
    ProxyPassReverse / http://backend:8080/
</VirtualHost>

6. 错误处理和超时设置

复制代码
<VirtualHost *:80>
    ServerName example.com
    
    # 超时设置
    ProxyTimeout 300
    Timeout 300
    ProxyBadHeader Ignore
    
    # 连接设置
    ProxySet connectiontimeout=5
    ProxySet timeout=300
    
    # 错误文档
    ErrorDocument 502 /errors/502.html
    ErrorDocument 503 /errors/503.html
    ErrorDocument 504 /errors/504.html
    
    # 健康检查
    ProxyPass /health-check !
    Alias /health-check /var/www/health.html
    
    ProxyPass / http://backend:8080/ retry=5
    ProxyPassReverse / http://backend:8080/
</VirtualHost>

7. 完整的生产环境示例

复制代码
<VirtualHost *:80>
    ServerName api.example.com
    ServerAdmin admin@example.com
    
    # 日志设置
    ErrorLog ${APACHE_LOG_DIR}/api-error.log
    CustomLog ${APACHE_LOG_DIR}/api-access.log combined
    
    # 代理配置
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full
    
    # 安全头
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set Content-Security-Policy "default-src 'self'"
    
    # 客户端信息传递
    RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
    RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
    RequestHeader set X-Forwarded-Proto "http"
    RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s"
    
    # 代理规则
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    
    # 排除某些路径
    ProxyPass /static/ !
    Alias /static/ /var/www/static/
    
    # 限制请求
    <Location />
        # 限制请求大小
        LimitRequestBody 10485760
        
        # 限制请求方法
        <LimitExcept GET POST>
            Deny from all
        </LimitExcept>
    </Location>
</VirtualHost>

8. 调试和测试

检查配置

复制代码
# 检查配置语法
sudo apachectl configtest

# 查看已启用模块
apache2ctl -M  # 或 httpd -M

# 查看配置
apache2ctl -S

测试命令

复制代码
# 测试代理是否工作
curl -I http://example.com
curl -H "Host: example.com" http://localhost

# 检查头信息
curl -v http://example.com

注意事项

  1. 安全设置

    • 设置适当的访问控制

    • 限制代理范围,避免开放代理

    • 使用防火墙限制后端服务器访问

  2. 性能优化

    • 调整连接池大小

    • 启用压缩

    • 配置适当的缓存

  3. 监控

    • 监控代理服务器和后端服务器的日志

    • 设置告警机制

    • 定期检查性能指标

这些配置可以根据你的具体需求进行调整。确保在修改配置后测试并重启Apache服务。

相关推荐
可涵不会debug1 天前
时序数据库选型指南:以Apache IoTDB为核心的大数据解决方案
apache·时序数据库·iotdb
安小牛1 天前
Apache License 2.0的中文介绍及其许可使用
笔记·apache
鸽芷咕1 天前
时序数据库选型指南:Apache IoTDB为何成大数据场景优选
apache·时序数据库·iotdb
ApachePulsar1 天前
演讲回顾|Apache Pulsar 在腾讯云上的高可用性最佳实践
云计算·apache·腾讯云
byte轻骑兵1 天前
时序数据库选型指南:以Apache IoTDB为例看国产时序数据库的优势与实践
大数据·数据分析·apache·时序数据库·iotdb
羑悻的小杀马特1 天前
Apache IoTDB:引领时序数据库新时代,解锁工业4.0的无限可能!
apache·时序数据库·iotdb
鲨莎分不晴2 天前
Apache Flume 入门到实战:构建可靠的大数据采集管道
大数据·apache·flume
温暖小土2 天前
ClickHouse vs Apache Doris:2026年实时OLAP数据库选型深度解析
数据库·数据仓库·clickhouse·apache
小当家.1052 天前
《Java操作Excel实战教程:Apache POI从入门到精通》
java·apache·excel
Gobysec2 天前
Goby 漏洞安全通告|Apache Struts XWork 组件 XML外部实体注入漏洞(CVE-2025-68493)
struts·安全·apache