如何正确使Apache代理服务器能够正常使用NodeJS?

问题描述:

我正在用AngularJS开发一个NodeJS应用程序。 为了测试,我想在运行apache2 web服务器的web服务器上托管它。 谷歌搜索,并尝试和错误给我带来了这样的事实,我需要简单地让Apache与转发代理模块的请求:如何正确使Apache代理服务器能够正常使用NodeJS?

<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正确转发请求?

+0

任何更改都可以从apache发布访问日志? – bennettp123

+0

我已加入 – nesreka

来自bennettp123的评论指出了我的正确方向。

Apaches access.log文件显示javaScript文件和 样式表有404个错误。

添加他们的位置指令之前的别名解决了这个问题:

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

不错的解决方案。我没有想到这一点。 :) – bennettp123

+0

谢谢。是我想起来的第一件事。 – nesreka

+1

值得一提的是,如果您有多个应用程序在代理之后运行,则此解决方案不会扩展。例如,如果两个应用程序都返回指向'/ stylesheets'的URL,则无法分辨它们之间的区别。 – bennettp123

按照DOCO为ProxyPassReverse

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

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

有几个选项:

  • 使用类似mod_proxy_html,提到由Apache DOCO上述
  • Alias所有路径(如above
  • 充分利用的NodeJS应用程序返回相对URL(例如stylesheets/bootstrap.min.css
  • 向NodeJS应用程序添加一个“反向代理”选项,并预先为所有请求指定反向代理路径。
+0

谢谢你澄清这一点。没有找到Doc的这部分。 :d – nesreka

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

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

<base href="/someurl/">