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服务。

相关推荐
一字白首4 小时前
小程序组件化进阶:从复用到通信的完整指南DAY04
前端·小程序·apache
专注_每天进步一点点1 天前
mysql-connector-j(8.0 及以上版本,包括你使用的 8.3.0)并非采用 GPL 许可证,因此你在项目中引入该依赖时,不需要遵循 GPL 的开源要求(比如开源你的整个项目)
数据库·mysql·apache
不爱学英文的码字机器1 天前
Apache RocketMQ+cpolar 让消息服务全网可达
apache·rocketmq
鸽芷咕1 天前
海量时序数据选型指南:从大数据架构演进看 Apache IoTDB 的崛起
大数据·数据库·架构·apache
D愿你归来仍是少年2 天前
Apache Spark 第 3 章:核心概念 RDD / DataFrame
大数据·spark·apache
D愿你归来仍是少年2 天前
Apache Spark 第 4 章:Spark 整体架构
spark·apache
D愿你归来仍是少年2 天前
Apache Flink 算子(Operator)深度解析
大数据·flink·apache
可涵不会debug2 天前
时序数据库选型指南:Apache IoTDB——大数据时代的优选方案
apache·时序数据库·iotdb
yumgpkpm2 天前
Apache Spark 和 Flink,处理实时大数据流对比(Cloudera CDH、CDP)
flink·spark·apache
羑悻的小杀马特2 天前
Apache IoTDB:开启端边云协同的时序数据新时代
运维·人工智能·apache·iotdb