Akward延迟将Apache的代理请求连接到node.js应用程序

在我的Ubuntu服务器10.04中,我正在运行一个Node.js应用程序的例子:

var http = require("http"); function onRequest(request, response) { console.log("Request received."); response.writeHead(200, {"Content-Type": "text/html"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(3000); 

它只是监听端口3000的请求,login控制台这个请求,并发送到客户端HTTP “Hello World”

目标是使这个应用程序与Apache2共存。 所以经过一些研究,我编辑了默认文件( / etc / apache2 / sites-available / default ):

 <VirtualHost *:80> ServerAdmin [email protected] ServerName dev.myserver.com <Location /node> ProxyPassReverse http://127.0.0.1:3000/ ProxyPass http://127.0.0.1:3000/ </Location> <Proxy> Allow from all </Proxy> DocumentRoot /home/haj/www/http_home <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /home/haj/www/http_home/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ErrorLog /home/haj/www/log/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /home/haj/www/log/access.log combined </VirtualHost> 

所以,当用户打电话给http://dev.myserver.com/nodehttp://dev.myserver.com/node/ ,Apache代理请求,Node.js进行处理,用户得到回到“你好世界”。

只有一个问题:需要一些时间,我们称之为“加载”代理,换句话说,我在浏览器中得到这些消息:

 <503 Service Temporarily Unavailable> Service Temporarily Unavailable The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later. Apache/2.2.14 (Ubuntu) Server at dev.neosource.cl Port 80 

另外,error.log告诉我:

 [Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1) [Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1) [Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1) 

突然之间,它就这样工作。 没有请求数量,没有时间,没有模式。

用外行的话来说,服务必须“加载” ,这是它给人的印象,但是,我想知道是否有办法将这种延迟降到最低。 或者我想知道上面提到的configuration有什么问题。

编辑1 :修改LogLevel进行debugging后,在这些延迟之一,我得到这个每个请求:

 [Thu Apr 21 02:30:40 2011] [debug] mod_proxy_http.c(56): proxy: HTTP: canonicalising URL //127.0.0.1:3000/ [Thu Apr 21 02:30:40 2011] [debug] proxy_util.c(1494): [client 200.xxx.yyy.zzz] proxy: http: found worker http://127.0.0.1:3000/ for http://127.0.0.1:3000/ [Thu Apr 21 02:30:40 2011] [debug] mod_proxy.c(993): Running scheme http handler (attempt 0) [Thu Apr 21 02:30:40 2011] [debug] mod_proxy_http.c(1940): proxy: HTTP: serving URL http://127.0.0.1:3000/ [Thu Apr 21 02:30:40 2011] [debug] proxy_util.c(1937): proxy: HTTP: retrying the worker for (127.0.0.1) [Thu Apr 21 02:30:40 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1) [Thu Apr 21 02:30:40 2011] [debug] mod_deflate.c(615): [client 200.xxx.yyy.zzz] Zlib: Compressed 405 to 273 : URL /node 

…当它是正确的:

 [Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(56): proxy: HTTP: canonicalising URL //127.0.0.1:3000/ [Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(1494): [client 200.xxx.yyy.zzz] proxy: http: found worker http://127.0.0.1:3000/ for http://127.0.0.1:3000/ [Thu Apr 21 02:35:16 2011] [debug] mod_proxy.c(993): Running scheme http handler (attempt 0) [Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1940): proxy: HTTP: serving URL http://127.0.0.1:3000/ [Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(1999): proxy: HTTP: has acquired connection for (127.0.0.1) [Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2055): proxy: connecting http://127.0.0.1:3000/ to 127.0.0.1:3000 [Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2153): proxy: connected / to 127.0.0.1:3000 [Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2244): proxy: HTTP: backend socket is disconnected. [Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2308): proxy: HTTP: fam 2 socket created to connect to 127.0.0.1 [Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2414): proxy: HTTP: connection complete to 127.0.0.1:3000 (127.0.0.1) [Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1723): proxy: start body send [Thu Apr 21 02:35:16 2011] [debug] mod_deflate.c(615): [client 200.xxx.yyy.zzz] Zlib: Compressed 11 to 13 : URL /node [Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1816): proxy: end body send [Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2017): proxy: HTTP: has released connection for (127.0.0.1) 

LogLevel更改为debug将在error.log中提供更多信息。 请这样做,并发布结果。 没有这些信息,我有一个猜测,即将ProxyPass行更改为ProxyPass http://127.0.0.1:3000/ retry=0可能会有所帮助。 一般来说, Apache的mod_proxy文档有更多关于可用参数的细节。

挖掘这个。 我在启用SELinux的CentOS上遇到了这个问题。 我所需要做的就是允许httpdbuild立networking连接:

/usr/sbin/setsebool httpd_can_network_connect 1

(并重新启动httpd)