如何正确地使用NodeJS的Apache代理?

时间:2015-01-13 07:48:11

标签: angularjs node.js apache proxy

我正在使用AngularJS开发NodeJS应用程序。 为了测试,我想将它托管在运行apache2 webserver的web服务器上。 谷歌搜索和尝试和错误让我想到我需要简单地让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正确转发请求?

3 个答案:

答案 0 :(得分:2)

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"

答案 1 :(得分:2)

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

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

<base href="/someurl/">

答案 2 :(得分:0)

根据ProxyPassReverse的doco:

  

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

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

有几个选择:

  • 使用类似mod_proxy_html的内容,如上面的Apache doco所述
  • Alias所有路径(如above
  • 让NodeJS应用返回相对网址(例如stylesheets/bootstrap.min.css
  • 添加&#34;反向代理&#34; NodeJS应用程序的选项,并为所有请求添加反向代理路径。