прокси nginx для кометы - PullRequest
       27

прокси nginx для кометы

14 голосов
/ 21 июля 2009

Мне нужна помощь от некоторых гуру Linux. Я работаю над веб-приложением, которое включает в себя комет-сервер. Кометный сервер работает на localhost: 8080 и предоставляет URL localhost: 8080 / long_polling для подключения клиентов. Мое веб-приложение работает на localhost: 80.

Я использовал nginx для прокси-запросов от nginx к серверу комет (localhost: 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;

Ответы [ 7 ]

7 голосов
/ 22 июля 2009

Вот мой nginx.conf и мой proxy.conf. Тем не менее, обратите внимание, что proxy.conf является излишним - я просто устанавливал все эти настройки, пытаясь отладить свою программу.

/ и т.д. / 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/*;
}

/ и т.д. / 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 голосов
/ 22 июля 2009

Мне действительно удалось заставить это работать сейчас. Спасибо вам всем. Причина, по которой nginx был в 504 раз, была глупой: я не включил proxy.conf в свой nginx.conf следующим образом:

include /etc/nginx/proxy.conf;

Итак, я сохраняю nginx в качестве внешнего прокси-сервера для сервера COMET.

4 голосов
/ 21 июля 2009

я не думаю, что это возможно ...

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 МБ для 10000 HTTP-соединений в режиме ожидания ... так что на самом деле это не должно быть проблемой ...

Какой комет-сервер вы используете? не могли бы вы позволить прокси-серверу комет веб-сервер? нормальные http запросы должны обрабатываться быстро ...

Greetz

back2dos

3 голосов
/ 08 декабря 2009

Теперь есть плагин Comet для Nginx. Это, вероятно, решит ваши проблемы довольно хорошо.

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

2 голосов
/ 22 июля 2009

Попробуйте

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 голосов
/ 19 октября 2010

Возможно, вы захотите попробовать listen (80) на сервере node.js вместо 8080 (я предполагаю, что вы используете его в качестве асинхронного сервера?) И, возможно, вообще пропустите Ngnix. Я использую промежуточное программное обеспечение connect и статические файлы Express для сервера и имею дело с кэшированием, которое обычно обрабатывается Ngnix. Если вы хотите, чтобы несколько экземпляров узла работали (что я бы посоветовал), вы можете использовать сам node.js в качестве прокси-сервера / балансировщика нагрузки для других экземпляров узла, а не Nginx в качестве шлюза. Я столкнулся с проблемой с этим, хотя, когда я обслуживал слишком много статических файлов изображений одновременно, но после того, как я поместил изображения на S3, он стабилизировался. Nginx МОЖЕТ быть излишним за то, что вы делаете. Попробуйте и посмотрите. Желаем удачи.

0 голосов
/ 21 июля 2009

без каких-либо серьезных болтовней по TCP / IP, вы не можете выставить два приложения на одном и том же порту TCP с одним и тем же IP-адресом. как только nginx начал обслуживать соединение, он не может передать его другому приложению, он может только прокси-сервер.

Таким образом, либо пользователь другого порта, другой IP-номер (может быть на том же физическом компьютере), либо жить с прокси.

edit: я предполагаю, что nginx истекает, потому что долгое время не видит активности. возможно, добавление пустого сообщения каждые несколько минут может предотвратить сбой соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...