温馨提示×

Apache2怎么配置反向代理

小樊
44
2026-08-01 00:04:37
栏目: 编程语言

下面以 Apache 2(httpd) 为例,介绍如何配置反向代理(Reverse Proxy)。示例基于 Linux(Ubuntu / Debian / CentOS 通用)。


一、开启必要的 Apache 模块

反向代理需要以下模块:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_html   # 可选,处理 HTML 内容
sudo a2enmod headers      # 可选,但推荐

Ubuntu / Debian 使用 a2enmod
CentOS / RHEL 可直接修改 /etc/httpd/conf/httpd.conf

重启 Apache:

sudo systemctl restart apache2   # Ubuntu / Debian
sudo systemctl restart httpd     # CentOS / RHEL

二、基本反向代理配置示例

1️⃣ 将域名转发到后端服务(最常见)

假设:

  • 公网域名:www.example.com
  • 后端服务:http://127.0.0.1:8080

虚拟主机配置

<VirtualHost *:80>
    ServerName www.example.com

    ProxyRequests Off
    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

✅ 效果:
访问 http://www.example.com/ 实际由 localhost:8080 提供服务。


三、按路径转发(Path-based Proxy)

<VirtualHost *:80>
    ServerName www.example.com

    ProxyRequests Off

    ProxyPass /api/ http://127.0.0.1:3000/
    ProxyPassReverse /api/ http://127.0.0.1:3000/

    ProxyPass /admin/ http://127.0.0.1:8081/
    ProxyPassReverse /admin/ http://127.0.0.1:8081/

</VirtualHost>

✅ 效果:

  • /api/* → 后端 3000
  • /admin/* → 后端 8081

四、HTTPS 反向代理(推荐)

1️⃣ 使用 Let’s Encrypt(certbot)

sudo apt install certbot python3-certbot-apache
sudo certbot --apache

certbot 会自动生成 HTTPS 配置。


2️⃣ 手动 HTTPS + 反向代理示例

<VirtualHost *:443>
    ServerName www.example.com

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.crt
    SSLCertificateKeyFile /etc/ssl/private/example.key

    ProxyRequests Off
    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

</VirtualHost>

五、常见重要参数说明

指令 作用
ProxyRequests Off 关闭正向代理(必须)
ProxyPreserveHost On 保留原始 Host 头
ProxyPass 设置转发规则
ProxyPassReverse 修正后端返回的重定向
ProxyTimeout 后端超时时间

示例:

ProxyTimeout 60

六、解决常见问题

❌ 403 Forbidden

<Directory />
    Require all granted
</Directory>

或检查 SELinux(CentOS):

setsebool -P httpd_can_network_connect 1

❌ 后端获取真实客户端 IP

RemoteIPHeader X-Forwarded-For

或在后端读取:

X-Forwarded-For
X-Real-IP

七、完整最小可用示例

<VirtualHost *:80>
    ServerName app.example.com

    ProxyRequests Off
    ProxyPass / http://127.0.0.1:9000/
    ProxyPassReverse / http://127.0.0.1:9000/
</VirtualHost>

如果你愿意,可以告诉我:

  • ✅ 系统版本(Ubuntu / CentOS)
  • ✅ 后端是 Java / Node / Docker / 内网 IP
  • ✅ 是否需要 HTTPS / WebSocket / 负载均衡

我可以给你一份完全可直接用的配置

0