【问题标题】:How to make Apache proxy to NodeJS correctly?如何正确地使 Apache 代理到 NodeJS?
【发布时间】:2015-01-13 07:48:10
【问题描述】:

我正在使用 AngularJS 开发 NodeJS 应用程序。 为了进行测试,我想将它托管在运行 apache2 网络服务器的网络服务器上。 谷歌搜索和 Try-And-Error 让我意识到我需要简单地让 Apache 使用代理模块转发请求:

<Location /someurl>
  ProxyPass http://mydomain:3000/
  ProxyPassReverse http://mydomain:3000/
</Location>

但很遗憾,我无法看到该页面。 访问 someurl 会给我一个空白页,其中没有加载任何 javaScript。

节点调试日志: GET / 200 1.680 ms - 1687

当我通过端口 3000 访问服务器时,我得到以下日志:

GET / 304 53.814 ms - -
GET /javascripts/directives.js 200 14.369 ms - 6521
GET /javascripts/services.js 200 8.532 ms - 2054
GET /stylesheets/bootstrap.min.css 304 4.173 ms - -
GET /stylesheets/lmm.css 304 4.131 ms - -
GET /javascripts/jquery.min.js 304 4.203 ms - -
GET /javascripts/bootstrap.min.js 304 2.060 ms - -
GET /javascripts/angular.min.js 304 2.486 ms - -
GET /javascripts/angular-route.min.js 304 2.562 ms - -
GET /javascripts/angular-translate.min.js 304 2.643 ms - -
GET /javascripts/app.js 304 2.526 ms - -
GET /javascripts/controller.js 304 2.768 ms - -
GET /javascripts/translations.js 304 1.368 ms - -
GET /partials/footer.html 304 2.391 ms - -
GET /partials/home.html 304 2.202 ms - -
GET /fonts/glyphicons-halflings-regular.woff 304 1.602 ms - -

这里是来自 acces.log 的所有相关内容:

myIP - - [13/Jan/2015:10:01:19 +0100] "GET /someurl HTTP/1.1" 200 852 "-" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /stylesheets/bootstrap.min.css HTTP/1.1" 404 513 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /stylesheets/lmm.css HTTP/1.1" 404 504 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/jquery.min.js HTTP/1.1" 404 509 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/bootstrap.min.js HTTP/1.1" 404 513 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular.min.js HTTP/1.1" 404 510 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular-route.min.js HTTP/1.1" 404 517 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular-translate.min.js HTTP/1.1" 404 520 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/controller.js HTTP/1.1" 404 509 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/app.js HTTP/1.1" 404 503 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/directives.js HTTP/1.1" 404 510 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/services.js HTTP/1.1" 404 507 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/translations.js HTTP/1.1" 404 511 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/bootstrap.min.js HTTP/1.1" 404 512 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular.min.js HTTP/1.1" 404 510 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular-route.min.js HTTP/1.1" 404 516 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular-translate.min.js HTTP/1.1" 404 520 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/app.js HTTP/1.1" 404 502 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/controller.js HTTP/1.1" 404 509 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/directives.js HTTP/1.1" 404 509 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/services.js HTTP/1.1" 404 507 "http://mydomain/someurl" 
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/translations.js HTTP/1.1" 404 511 "http://mydomain/someurl" 

如何让 apache 正确转发请求?

【问题讨论】:

  • 您可以从 apache 发布访问日志的任何更改吗?

标签: angularjs node.js apache proxy


【解决方案1】:

bennettp123 的评论为我指明了正确的方向。

Apaches access.log 文件显示 javaScript 文件存在 404 错误,并且 样式表。

在 Location 指令修复问题之前将它们添加为别名:

Alias /javascripts "<path_to_node_project>/public/javascripts"
Alias /stylesheets "<path_to_node_project>/public/stylesheets"
Alias /partials    "<path_to_node_project>/public/partials"

【讨论】:

  • 不错的解决方案。我没有想到这一点。 :)
  • 值得一提的是,如果您在代理后面运行多个应用程序,此解决方案将无法扩展。例如,如果两个应用程序都返回指向/stylesheets 的 URL,则无法区分它们。
【解决方案2】:

这是一个更好的解决方案(位于How to use ProxyPass to serve static files through Express?):

在您的情况下,Apache Config 是正确的。唯一缺少的部分是 index.html 中 &lt;head&gt; 元素的更改,如下所示:

<base href="/someurl/">

【讨论】:

    【解决方案3】:

    根据ProxyPassReverse的文档:

    只有上面特别提到的 HTTP 响应头会被重写。 Apache 不会重写其他响应标头,也不会重写 HTML 页面内的 URL 引用。这意味着如果代理内容包含绝对 URL 引用,它们将绕过代理。将查看 HTML 内部并重写 URL 引用的第三方模块是 Nick Kew 的 mod_proxy_html

    这就是你的情况。反向代理正在转发初始的/someurl 请求。但是,NodeJS 应用程序返回的 URL 路径中没有 /someurl,并且它们与 ProxyPass 和 ProxyPassReverse 指令不匹配。

    有几个选项:

    • 使用 mod_proxy_html 之类的东西,正如上面的 Apache 文档中提到的那样
    • Alias 所有路径(如above
    • 让 NodeJS 应用返回相对 URL(例如 stylesheets/bootstrap.min.css
    • 向 NodeJS 应用程序添加“反向代理”选项,并将反向代理路径添加到所有请求。

    【讨论】:

    • 感谢您澄清这一点。没有找到文档的这一部分。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多