如何正确使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正确转发请求?
来自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"
不错的解决方案。我没有想到这一点。 :) – bennettp123
谢谢。是我想起来的第一件事。 – nesreka
值得一提的是,如果您有多个应用程序在代理之后运行,则此解决方案不会扩展。例如,如果两个应用程序都返回指向'/ 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应用程序添加一个“反向代理”选项,并预先为所有请求指定反向代理路径。
谢谢你澄清这一点。没有找到Doc的这部分。 :d – nesreka
这里是一个更好的解决方案(在How to use ProxyPass to serve static files through Express?找到):
在你的情况Apache的配置是正确的。唯一缺失的部分是index.html中<head>
元素的更改,如下所示:
<base href="/someurl/">
任何更改都可以从apache发布访问日志? – bennettp123
我已加入 – nesreka