【问题标题】:nginx proxy to comet彗星的nginx代理
【发布时间】:2010-11-12 17:25:23
【问题描述】:

我需要一些 linux 专家的帮助。我正在开发一个包含彗星服务器的网络应用程序。 Comet 服务器在 localhost:8080 上运行,并公开 url localhost:8080/long_polling 供客户端连接。我的 webapp 在 localhost:80 上运行。

我使用 nginx 将来自 nginx 的请求代理到彗星服务器(localhost:80/long_polling 代理到 localhost:8080/long_polling),但是,我对这个解决方案有两个不满:

  1. nginx 在一分钟后给我一个 504 网关超时,即使我将 每个超时设置更改为 600 秒
  2. 我真的不希望 nginx 必须代理到彗星服务器 - nginx 代理不是为持久连接(可能长达半小时)而构建的。我宁愿让客户端直接连接comet服务器,让comet服务器处理。

所以我的问题是:是否有任何 linux 技巧可以让我在不使用 nginx 代理的情况下将 localhost:8080/long_polling 暴露给 localhost:80/long_polling?一定有什么。这就是为什么我认为这个问题可能最好由 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;

【问题讨论】:

    标签: nginx comet


    【解决方案1】:

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

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

    GET /long_polling HTTP/1.1
    Host: localhost:8080
    

    加上一些额外的 HTTP 标头...我还没有听说,端口可以跨进程绑定...

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

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

    问候

    back2dos

    【讨论】:

    • 好吧,如果 nginx 使用这么少的内存,那么我很乐意让它与 nginx 作为前端代理服务器一起工作。只需要摆脱大约一分钟后发生的“504 Gateway Time-Out”错误(总是在大约 55 - 65 秒后发生)。感谢您的回答。我使用 node.js 作为 COMET 服务器。
    【解决方案2】:

    如果不进行一些严重 TCP/IP 混杂,您不能在同一个 IP 地址上的同一个 TCP 端口上公开两个应用程序。一旦 nginx 开始服务连接,它就不能将它传递给其他应用程序,它只能代理它。

    所以,要么使用另一个端口,另一个 IP 号(可能在同一台物理机器上),要么使用代理。

    编辑:我猜 nginx 正在超时,因为它很长时间没有看到任何活动。也许每隔几分钟添加一条空消息可以防止连接失败。

    【讨论】:

    • 好吧 - 我猜 linux 大师已经说过 :) 这并不容易。然后我必须弄清楚如何让nginx不超时。非常感谢!如果任何阅读本文的人知道为什么 nginx 可能会超时,请告诉我!
    【解决方案3】:

    试试

    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

    【讨论】:

    • 在相关说明中,我偶然发现了您发给 nginx 邮件列表的电子邮件,其中您提到您正在使用 node.js。在我自己的项目中,您完全领先了我一步。我还计划在 nginx 后面使用 node.js。请随时告诉我们这是如何工作的!我在 github FWIW 上有几个 node.js 项目:github.com/fictorial
    • 嗨,布赖恩! node.js 很可爱。 COMET 服务器很容易编写,并且表现良好。尚不确定它在生产中的表现如何。
    • 你有兴趣分享你的工作吗?在 nginx 等生产就绪反向代理后面运行的 COMET 服务器(发布到 node.js Google 组)将是让更多人对 node.js 感兴趣并且对我有帮助的好方法! ;)
    • Re: 生产使用... 你会发现 node.js 现在确实存在内存泄漏。见groups.google.com/group/nodejs/browse_thread/thread/…
    【解决方案4】:

    实际上,我现在设法让它工作了。谢谢你们。 nginx 504 超时的原因很愚蠢:我没有像这样在我的 nginx.conf 中包含 proxy.conf:

    include /etc/nginx/proxy.conf;
    

    所以,我将 nginx 作为 COMET 服务器的前端代理。

    【讨论】:

    • 你能把你的 nginx.conf 和 proxy.conf 贴出来供参考吗?
    【解决方案5】:

    这是我的 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;
    

    【讨论】:

      【解决方案6】:

      现在有一个用于 Nginx 的 Comet 插件。它可能会很好地解决您的问题。

      http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          • 2012-01-23
          • 2010-11-24
          • 1970-01-01
          相关资源
          最近更新 更多