2009-07-21 147 views
14

我需要一些linux专家的帮助。我正在研究一个包含彗星服务器的webapp。彗星服务器在localhost:8080上运行,并为客户端提供url localhost:8080/long_polling连接。我的webapp在localhost:80上运行。nginx代理彗星

我nginx的用于代理请求从nginx的彗星服务器(本地主机:80/long_polling代理为localhost:8080/long_polling),但是,我有两个抱怨这种解决方案:

  1. nginx的给我一分钟后504网关超时,即使我改变了每次单次超时设置到600秒
  2. 我真的不希望nginx必须代理到彗星服务器 - 无论如何nginx代理是没有建立持久的连接(可能长达半个小时)。我宁愿让客户直接连接到彗星服务器,让彗星服务器处理它。

所以我的问题是:是否有任何Linux技巧,允许我暴露localhost:8080/long_polling到localhost:80/long_polling而不使用nginx代理?一定有东西。这就是为什么我认为这个问题可能最好由一个Linux专家来回答。

我需要/ long_polling在端口80上公开的原因是我可以使用AJAX连接到它(ajax same-origin-policy)。

这是我参考nginx的proxy.conf:

proxy_redirect    off;                               
proxy_set_header   Host $host; 
proxy_set_header   X-Real-IP $remote_addr; 
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
client_max_body_size  10m; 
client_body_buffer_size  128k; 
proxy_connect_timeout  600; 
proxy_send_timeout   600; 
proxy_read_timeout   600; 
proxy_buffer_size   4k; 
proxy_buffers    4 32k; 
proxy_busy_buffers_size  64k; 
proxy_temp_file_write_size 64k; 
send_timeout    600; 
proxy_buffering    off; 

回答

4

我不认为,这是可能的...

localhost:8080/long_pollingURI ......更准确地说,应该是http://localhost:8080/long_polling ...在HTTPURI将被解析为请求/long_polling,端口80到域名为'localhost'的服务器...即打开TCP连接为127.0.0.1:80,并发送

GET /long_polling HTTP/1.1 
Host: localhost:8080 

再加上一些额外的HTTP标头......我还没有听说过,那端口可以翻过流程绑定...

实际上,如果我没理解好,nginx的被设计成一个可扩展的代理。 ..他们声称他们需要2.5 MB用于10000个HTTP空闲连接...所以这真的不应该是一个问题...

您使用的是什么彗星服务器?你可以让彗星服务器代理一个网络服务器吗?正常的http请求应快速处理...

格尔茨

back2dos

+1

那么,如果nginx使用那么少量的内存,那么我会很乐意使用nginx作为前端代理服务器。 只需要摆脱大约一分钟后发生的“504 Gateway Time-Out”错误(总是在大约55-65秒后发生)。 感谢您的回答。 我使用node.js作为COMET服务器。 – Chris 2009-07-21 17:41:44

0

没有做一些严重 TCP/IP mungling,你不能暴露在相同的同一个TCP端口上的两个应用程序IP地址。一旦nginx开始为连接提供服务,它就不能将它传递给其他应用程序,它只能代理它。

因此,无论是用户的另一个端口,另一个IP号码(可能在同一台物理机器上),或与代理服务。

编辑:我猜nginx是超时的,因为它很长时间没有看到任何活动。可能每隔几分钟添加一条空消息可能会导致连接失败。

+0

好的 - 我猜linux的专家已经说过了:)这是不容易的。然后,我将不得不弄清楚如何让nginx不再超时。非常感谢!如果有人读到这个有任何想法,为什么Nginx可能会超时,让我知道! – Chris 2009-07-21 17:56:38

2

尝试

proxy_next_upstream error; 

默认为

proxy_next_upstream error timeout; 

超时不能超过75秒。

http://wiki.nginx.org/NginxHttpProxyModule#proxy_next_upstream

http://wiki.nginx.org/NginxHttpProxyModule#proxy_connect_timeout

+0

在相关说明中,我偶然发现了您的电子邮件,其中提到您使用node.js的nginx邮件列表。在我自己的项目中,你确实*领先一步。我也计划在nginx后面使用node.js。请保持我们张贴这是如何工作的! 我在github上有几个node.js项目FWIW: http://github.com/fictorial/ – z8000 2009-07-22 13:24:15

+0

嗨,Brian! node.js很甜蜜。COMET服务器很容易编写,并且表现良好。还不确定它将如何在生产中持续下去。 – Chris 2009-07-22 15:04:39

+0

你有兴趣分享你的工作吗?一个COMET服务器运行在nginx之类的生产就绪反向代理之后(发布到node.js Google组),这将是一个让更多人对node.js感兴趣并且也能帮助我的好方法! ;) – z8000 2009-07-22 16:02:23

6

其实我设法得到现在这个工作。谢谢你们。 nginx的原因是504超时是一个愚蠢的一个:我没有包括proxy.conf在我的nginx.conf像这样:

include /etc/nginx/proxy.conf; 

所以,我保持的nginx作为前端代理彗星服务器。

7

这是我的nginx.conf和我的proxy.conf。但请注意,proxy.conf是过度杀伤 - 我只是在尝试调试我的程序时设置了所有这些设置。

/etc/nginx/nginx.conf

worker_processes 1;                                  
user www-data; 

error_log /var/log/nginx/error.log debug; 
pid  /var/run/nginx.pid; 

events { 
    worker_connections 1024; 
} 

http { 
    include /etc/nginx/proxy.conf; 

    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    access_log /var/log/nginx/access.log; 

    sendfile  on; 
    tcp_nopush  on; 

    keepalive_timeout 600; 
    tcp_nodelay  on; 

    gzip on; 
    gzip_comp_level 2; 
    gzip_proxied any; 
    gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript; 

    include /etc/nginx/conf.d/*.conf; 
    include /etc/nginx/sites-enabled/*; 
} 

/etc/nginx/proxy.conf

proxy_redirect    off;                               
proxy_set_header   Host $host; 
proxy_set_header   X-Real-IP $remote_addr; 
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
client_max_body_size  10m; 
client_body_buffer_size  128k; 
proxy_connect_timeout  6000; 
proxy_send_timeout   6000; 
proxy_read_timeout   6000; 
proxy_buffer_size   4k; 
proxy_buffers    4 32k; 
proxy_busy_buffers_size  64k; 
proxy_temp_file_write_size 64k; 
send_timeout    6000; 
proxy_buffering    off; 
proxy_next_upstream error; 
0

你可能想尝试听(80)Node.js的服务器,而不是8080(我想你使用的是作为一个异步服务器?),并可能完全错过了Ngnix。我使用连接中间件并将其表达为服务器静态文件,并处理通常由Ngnix处理的缓存。如果你想让多个节点运行的实例(我建议),你可能希望将node.js本身作为代理/负载均衡器查看其他节点实例,而不是Nginx作为网关。我遇到了一个问题,虽然当我一次提供太多的静态图像文件时,但在S3上的图像稳定之后。 Nginx可能会为你正在做的事情做些矫枉过正的工作。试试看看。祝你好运。