我需要一些Linux大师们一些帮助。 我的工作,其中包括彗星服务器的web应用程序。 彗星服务器运行在localhost:8080和公开网址本地主机:8080 / long_polling客户端连接到。 我的web应用程序运行在localhost:80。
我nginx的用于代理请求从nginx的彗星服务器(本地主机:80 / long_polling代理为localhost:8080 / long_polling),但是,我有两个抱怨这个解决方案:
- nginx的给我一分钟后,504网关超时,即使我改变了每一个超时设置为600秒
- 我真的不想nginx的有代理到彗星服务器无论如何 - nginx的代理不是持久连接建立(达半小时可能)。 我宁愿让客户端直接连接到服务器的彗星,并让彗星服务器处理它。
所以我的问题是:是否有任何linux的诡计,允许我公开本地主机:8080 / long_polling为localhost:80 / long_polling而不使用nginx的代理? 一定有什么东西。 这就是为什么我认为这个问题很可能通过一个Linux的大师是最好的回答。
我需要/ long_polling之所以在端口80上暴露出来,所以我可以使用AJAX来连接到它(AJAX同源策略)。
这是我参考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;
我不认为,这是可能的...
localhost:8080/long_polling
是一个URI
...更准确地说,应该是http://localhost:8080/long_polling
......在HTTP
的URI
将被解析为请求/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连接空转......,这样确实不应该是一个问题...
什么彗星服务器您使用的? 可能你也许让彗星服务器代理一个web服务器? 正常的http请求应快速处理...
格尔茨
back2dos
这是我的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;
其实,我现在设法得到这个工作。 谢谢你们。 nginx的原因是504超时是一个愚蠢的一个:我没有包括proxy.conf在我的nginx.conf像这样:
include /etc/nginx/proxy.conf;
所以,我保持的nginx作为前端代理彗星服务器。
现在有一个彗星插件Nginx的。 它可能会解决你的问题相当不错。
http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/
尝试
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
没有做一些严重的 TCP / IP mungling,你不能在相同的IP地址公开相同的TCP端口上的两个应用程序。 一旦Nginx已经开始服务的连接,它不能将它传递给其他的应用程序,它只能代理它。
所以,无论是用户的另一个端口,另一个IP号码(可以是同一台物理机器上),或者使用代理生活。
编辑:我想nginx的是时机,因为它没有看到任何活动了很长时间。 也许添加空消息,每隔几分钟能保持从失败的连接。
你可能会想尝试听(80)Node.js的服务器上,而不是8080(我假设你使用的是作为一个异步服务器?),并可能完全错过了Ngnix。 我使用的连接中间件和快递到服务器静态文件和处理通常会通过Ngnix处理缓存。 如果你想在运行(这我会建议)节点的多个实例,你可能要考虑的Node.js本身作为一个代理/负载均衡到其他节点的情况下,而不是作为Nginx的网关。 我遇到了这个时候,虽然我在一次服务太多的静态图像文件的问题,但我把S3图像后趋于稳定。 Nginx的可能是矫枉过正为你在做什么。 试试看。 祝您好运。