mod_proxy 笔记

mod_proxy 可以将 Apache 配置为一个代理服务器或使之成为一个网关,或让 Apache 扮演负债均衡的角色。通常而言,mod_proxy 需要和其他一些具体的代理实现模块搭配使用,这些模块用 LoadModule 指令加载,例如:

当需要缓存或安全链接时,应该搭配相应的模块使用:

注意,mod_rewrite 也可将 Apache 配置为代理服务器,我们可以同时使用 mod_proxy 和 mod_rewrite。

概述

Apache 可以配置为代理服务(forward proxy)或反向代理(reverse proxy / gateway) 服务器。

代理服务(forward proxy)的场景,例如一个客户端要访问一个被防火墙屏蔽的网站 X,他可以先链接一个代理服务器 P,通过向代理服务器 P 访问 X。例如我们购买一个代理软件,它就会为我们提供一系列的服务器地址,这些服务器都叫代理服务器。

反向代理(reverse proxy / gateway)的场景,例如我们有一堆服务,但只对客户开放一个访问入口 R,当 R 收到客户请求后将请求转发至最终的服务器 S,并在收到处理输出后发送给客户。

-

一个最简单的示例:

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>

解读:

搭配其他模块

mod_proxy_uwsgi

ProxyPass /uwsgi-bin/ uwsgi://localhost:4000/

参考