Apache 代理是什么?
Apache 服务器可以配置成一个“中间人”,客户端(比如你的浏览器)不直接访问最终的目标服务器,而是先访问 Apache 代理服务器,然后由代理服务器代表客户端去请求目标资源,最后再将获取到的内容返回给客户端。

主要用途:
- 反向代理:这是最常见的用法,客户端通常不知道代理的存在,他们以为自己在直接访问 Apache 服务器,Apache 负责将请求转发到后端的某个或多个应用服务器(如 Tomcat, Node.js, PHP-FPM),这可以实现负载均衡、高可用性、SSL 卸载和统一的安全策略。
- 正向代理:客户端需要明确配置代理服务器,通常用于企业环境,用于控制员工访问互联网、缓存网页内容以加快访问速度、或者隐藏客户端的真实 IP 地址,这类似于 Squid 的功能。
- 透明代理:网络设备(如路由器、防火墙)强制所有流量通过代理,用户无需在浏览器或系统中进行任何配置。
准备工作:安装和启用模块
在开始配置之前,请确保你的 Apache 服务器已经安装了必要的代理模块。
安装 Apache
如果尚未安装,可以使用包管理器进行安装:
# 对于 Debian/Ubuntu sudo apt update sudo apt install apache2 # 对于 CentOS/RHEL/Fedora sudo yum install httpd # 或者 dnf install httpd
启用代理模块
Apache 的代理功能由多个模块协同工作,你需要启用它们:

# 对于 Debian/Ubuntu (使用 a2enmod 命令) sudo a2enmod proxy sudo a2enmod proxy_http # 用于代理 HTTP/HTTPS 流量 sudo a2enmod proxy_ajp # 用于代理 AJP 协议(常用于 Tomcat) sudo a2enmod proxy_balancer # 用于负载均衡 sudo a2enmod lbmethod_byrequests # 负载均衡算法(按请求数) # 对于 CentOS/RHEL (手动编辑配置文件) # 编辑 /etc/httpd/conf.modules.d/00-base.conf,确保以下行没有被注释掉 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
重启 Apache 服务
使配置生效:
# 对于 Debian/Ubuntu sudo systemctl restart apache2 # 对于 CentOS/RHEL sudo systemctl restart httpd
配置示例
示例 1:反向代理(最常用)
假设我们有一个运行在 localhost:8080 上的 Web 应用(比如一个 Java Tomcat 应用),我们希望用户通过访问 http://your_server_domain/ 就能访问到它。
配置步骤:
-
创建一个新的配置文件,
/etc/apache2/sites-available/myapp.conf(Ubuntu) 或/etc/httpd/conf.d/myapp.conf(CentOS)。
(图片来源网络,侵删) -
在文件中添加以下内容:
# 启用代理引擎
ProxyRequests Off
# 注意:对于反向代理,通常关闭 ProxyRequests。
# 如果开启,它会使服务器行为变为正向代理。
# 设置反向代理
# 将所有发往 / 路径的请求,代理到 http://localhost:8080
<VirtualHost *:80>
ServerName your_server_domain
ServerAdmin webmaster@your_server_domain
DocumentRoot /var/www/html # 这个目录可以留空,因为内容来自后端
# 反向代理配置
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# 可选:启用日志记录
ErrorLog ${APACHE_LOG_DIR}/myapp_error.log
CustomLog ${APACHE_LOG_DIR}/myapp_access.log combined
</VirtualHost>
配置解释:
ProxyRequests Off:关闭正向代理功能,这是配置反向代理的关键。<VirtualHost *:80>:定义一个虚拟主机,监听在 80 端口。ProxyPass / http://localhost:8080/:这是核心指令。- 匹配所有进入这个虚拟主机的请求路径。
http://localhost:8080/:将请求转发到的后端服务器地址。
ProxyPassReverse / http://localhost:8080/:非常重要!它会修改从后端服务器返回的响应中的Location,Content-Location,URI头,如果后端返回Location: /login,代理会将其重写为Location: http://your_server_domain/login,确保浏览器能正确跳转。
-
启用站点并重启 Apache
-
Ubuntu:
sudo a2ensite myapp.conf sudo systemctl reload apache2 # 或者 restart
-
CentOS:
sudo systemctl restart httpd
-
访问 http://your_server_domain,你就会看到 localhost:8080 上应用的内容。
示例 2:负载均衡
假设后端有两台应用服务器,我们需要将流量分配到它们上面。
配置步骤:
-
创建或编辑配置文件。
-
添加以下配置:
ProxyRequests Off
# 定义一个负载均衡集群,命名为 "mycluster"
<Proxy balancer://mycluster>
# 定义后端服务器节点
BalancerMember http://app_server_1:8080
BalancerMember http://app_server_2:8080
# 设置负载均衡算法(可选)
# byrequests: 按请求轮询
# bytraffic: 按流量分配
# bybusyness: 分配给最空闲的服务器
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName your_server_domain
# 将所有请求代理到上面定义的集群
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
配置解释:
<Proxy balancer://mycluster>:定义一个名为mycluster的代理集群。BalancerMember ...:集群中的每个成员,即一台后端服务器。ProxySet lbmethod=byrequests:指定负载均衡策略。ProxyPass / balancer://mycluster/:将请求发送到集群,集群会根据策略自动选择一个后端服务器。
示例 3:正向代理
假设我们要让 Apache 作为一个客户端可以使用的代理服务器,监听在 8080 端口。
配置步骤:
-
创建或编辑配置文件。
-
添加以下配置:
# 启用正向代理
ProxyRequests On
# 对于正向代理,必须开启 ProxyRequests
# 允许哪些客户端可以使用这个代理
# <Proxy *> 默认是允许所有,但为了安全,最好限制
# 这里只允许本地网络 192.168.1.0/24 的客户端
<Proxy *>
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from 192.168.1.0/24
</Proxy>
# 监听一个端口作为代理端口
Listen 8080
<VirtualHost *:8080>
# 可以给这个代理服务起个名字
ServerName proxy.mydomain.com
# 不需要 ProxyPass,因为 ProxyRequests On 已经处理了
# 但是可以设置一些缓存(可选)
# CacheRoot /var/cache/apache2/proxy
# CacheEnable disk /
# CacheDirLevels 2
# CacheDirLength 2
</VirtualHost>
配置解释:
ProxyRequests On:开启正向代理。<Proxy *>:这是一个安全限制,默认情况下,ProxyRequests On会允许所有客户端通过你的服务器代理任何请求,这非常危险!必须使用Order, Deny, Allow来限制访问。Listen 8080:指定代理服务器监听的端口。
如何使用:
在客户端(浏览器或操作系统网络设置)中,设置代理服务器为 your_server_ip,端口为 8080,之后客户端的所有网络请求都会通过这个 Apache 代理。
重要注意事项
- 性能:Apache 代理虽然功能强大,但在处理高并发流量时,性能通常不如专业的反向代理软件,如 Nginx,对于生产环境,特别是作为前端负载均衡器,Nginx 通常是更优的选择。
- 安全性:
- 永远不要在公网上开放一个未经安全
