0

我有一个运行许多 Web 应用程序的 CentOS 机器,我使用 Apache 代理对各种应用程序的请求。除了我似乎无法正常工作的 Erlang Nitrogen 应用程序之外,它们都在工作。

我正在以标准方式运行 Nitrogen 应用程序,它可以在机器上本地访问http://localhost:8000。我已经使用 wget 验证了这一点。

这是我尝试使用的 apache 配置文件:

ProxyRequests Off
ProxyPreserveHost On

<Proxy http://my-ip:8000/*>
  Order deny,allow
  Allow from all
</Proxy>

ProxyPass /erlang http://my-ip:8000/
ProxyPassReverse /erlang http://my-ip:8000/
ProxyPassReverse  /erlang  http://my-ip/

此设置类似于系统上所有其他成功运行的代理,只是其他应用程序没有像 Nitrogen 那样部署到其服务器的根目录。

结果是基本页面正确下载到网络浏览器中,但所有附带的资源都没有。这给了我一个未设置样式的页面,其中 javascript 无法正常运行。

这是来自 Apache 的日志:

x.x.x.x - - [timestamp] "GET /erlang HTTP/1.1" 200 2884
x.x.x.x - - [timestamp] "GET /nitrogen/jquery.js HTTP/1.1" 404 484
x.x.x.x - - [timestamp] "GET /nitrogen/jquery-ui.js HTTP/1.1" 404 484
x.x.x.x - - [timestamp] "GET /nitrogen/livevalidation.js HTTP/1.1" 404 484
x.x.x.x - - [timestamp] "GET /nitrogen/nitrogen.js HTTP/1.1" 404 484
x.x.x.x - - [timestamp] "GET /nitrogen/bert.js HTTP/1.1" 404 484
x.x.x.x - - [timestamp] "GET /nitrogen/jquery-ui/jquery.ui.all.css HTTP/1.1" 404 484
x.x.x.x - - [timestamp] "GET /nitrogen/nitrogen.css HTTP/1.1" 404 484
x.x.x.x - - [timestamp] "GET /css/style.css HTTP/1.1" 404 484

我有一个使用 Apache 作为代理的硬性要求——我不会为了让这个 Nitrogen 应用程序正常工作而重新设置所有其他应用程序。在防火墙中打开 8000 端口也是不可能的。

只要不影响其他应用程序,我愿意使用任何 Apache 模块(mod-rewrite 等)或任何 Apache 设置。我还可以更改 Nitrogen 应用程序中的任何设置,以使其更好地与 Apache 配合使用。

如何使用 Apache 为我的 Nitrogen 应用程序代理/反向代理?

4

3 回答 3

1

问题:我设置了 Yaws wiki。它的工作方式类似于 http://wiki:8080。但我想以这种方式工作(使用 apache):http://wiki.local/

解决方案:

这是我的 Yaws Wiki 的 apache 设置(/etc/apache/sites-available/wiki):

<VirtualHost *:80>
  ServerName wiki.local
  ProxyRequests Off
  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>
  ProxyPass / http://wiki:8080/
  ProxyPassReverse / http://wiki:8080/
</VirtualHost>

我的 Yaws wiki 设置(/etc/yaws/conf.avail/yaws-wiki.conf):

ebin_dir = /usr/lib/yaws/wiki/ebin
<server wiki>
 port = 8080
 listen = 0.0.0.0
 docroot = /var/lib/yaws-wiki
</server>

我的 /etc/hosts:

127.0.0.1 wiki
127.0.0.1 wiki.local

我已经为 apache 启用了这些 mod:

sudo a2enmod proxy
sudo a2enmod proxy_http

现在 http://wiki.local/ 完美运行。

于 2013-01-20T10:30:23.037 回答
0

您确定允许您的 Apache 服务器访问这些文件吗?看起来您在第一个地址上获得了 HTTP 200,而在其余地址上获得了 404。确保您指向正确的位置。:)

于 2011-10-26T13:18:35.557 回答
0

问题是 ProxyPass 仅捕获作为对 Apache 的请求传入的链接。出了问题的是 html 页面中的链接指向无法请求的资源,而 ProxyPass 无法拦截它们并正确路由它们。此处记录了此问题。请特别参阅名为“修复 HTML 链接”的部分。

我最终不得不将 mod_proxy_html 安装到 Apache 中(CentOS 没有 RPM,所以我不得不像上面解释的那样使用 apxs)。之后,我不得不为给我带来麻烦的资源添加一些 ProxyHTMLLink,并添加一个 ProxyHTMLURLMap 指令来解释我的映射。

这是我的新配置文件:

ProxyRequests Off
ProxyPreserveHost On

<Proxy http://my-ip:8000/*>
  Order deny,allow
  Allow from all
</Proxy>

ProxyPass /erlang http://my-ip:8000/
ProxyHTMLURLMap http://my-ip:8000 /erlang

ProxyHTMLLinks  link            href
ProxyHTMLLinks  script          src for

<Location /erlang>
  ProxyPassReverse http://my-ip:8000/
  SetOutputFilter proxy-html
  ProxyHTMLExtended On
  ProxyHTMLURLMap / /erlang/
  RequestHeader unset Accept-Encoding
</Location>

这实际上是截取 html 文件并在所有 url 前面插入 /erlang/ 。当我在浏览器中使用显示页面源功能时,我可以看到结果。

于 2011-10-27T05:42:05.460 回答