mod_proxy 笔记
mod_proxy
可以将 Apache 配置为一个代理服务器或使之成为一个网关,或让 Apache 扮演负债均衡的角色。通常而言,mod_proxy 需要和其他一些具体的代理实现模块搭配使用,这些模块用 LoadModule
指令加载,例如:
- mod_proxy_balancer
- mod_proxy_http
- mod_proxy_http2
- mod_proxy_uwsgi
- mod_proxy_html
- …
当需要缓存或安全链接时,应该搭配相应的模块使用:
- mod_cache
- mod_ssl 以及
SSLProxy*
指令
注意,mod_rewrite
也可将 Apache 配置为代理服务器,我们可以同时使用 mod_proxy 和 mod_rewrite。
概述
Apache 可以配置为代理服务(forward proxy)或反向代理(reverse proxy / gateway) 服务器。
代理服务(forward proxy)的场景,例如一个客户端要访问一个被防火墙屏蔽的网站 X,他可以先链接一个代理服务器 P,通过向代理服务器 P 访问 X。例如我们购买一个代理软件,它就会为我们提供一系列的服务器地址,这些服务器都叫代理服务器。
- 使用
ProxyRequests
指令
反向代理(reverse proxy / gateway)的场景,例如我们有一堆服务,但只对客户开放一个访问入口 R,当 R 收到客户请求后将请求转发至最终的服务器 S,并在收到处理输出后发送给客户。
- 使用
ProxyPass
指令,或 - 使用
RewriteRule
指令加[P]
-
一个最简单的示例:
ProxyPass /mirror/foo/ http://backend.example.com/
ProxyPassReverse /mirror/foo/ http://backend.example.com/
第一行,ProxyPass
将一个 URL 访问转发到后台,例如:
http://example.com/mirror/foo/bar
将被转发到:
http://backend.example.com/bar
第二行,ProxyPassReverse
指示 Apache 改写后台服务器发回的 HTTP 头,包括:Location
, Content-Location
, URI
这几部分。如果 HTML 代码里有 URL 需要改写,则应该搭配 mod_proxy_html
服用。这个指令会负责重定向,例如:
http://backend.example.com/bar
被重定向到:
http://backend.example.com/qux
那么客户端也将被重定向到新的 URL:
http://example.com/mirror/foo/qux
-
一个较为完整的示例:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyRequests Off
ProxyPass /images !
Alias /images /var/local/www/images
ProxyPass /mirror/foo/ http://backend.example.com/
ProxyPassReverse /mirror/foo/ http://backend.example.com/
<Proxy http://backend.example.com/>
Require all granted
Options None
</Proxy>
解读:
ProxyRequests
表示关闭代理(forward proxy),因为我们配置的是反向代理(reverse proxy)ProxyPass /images !
表示这个路径的访问不转发,搭配Alias
指令使用
搭配其他模块
mod_proxy_uwsgi
ProxyPass /uwsgi-bin/ uwsgi://localhost:4000/