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

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

Я использовал nginx для прокси-запросов от nginx на кометном сервере (localhost: 80/long_polling прокси на localhost: 8080/long_polling), однако у меня есть две проблемы с этим решением:

  • nginx дает мне 504 тайм-аут Gateway через минуту, хотя я изменил КАЖДОЕ одиночное время ожидания до 600 секунд.
  • Я не хочу, чтобы nginx получал прокси-сервер на кометном сервере - прокси-сервер nginx не создан для длительных подключений (возможно, до получаса). Я бы предпочел позволить клиентам напрямую подключиться к серверу комет и позволить кометному серверу справиться с ним.

Итак, мой вопрос: есть ли какой-либо linux-трюк, который позволяет мне показывать localhost: 8080/long_polling на localhost: 80/long_polling без использования прокси-сервера nginx? Должно быть что-то. Вот почему я думаю, что этот вопрос, вероятно, лучше всего ответит гуру linux.

Причина, по которой мне нужно /long _polling, отображаться на порту 80, заключается в том, что я могу использовать AJAX для подключения к ней (политика ajax same-origin).

Это мой 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;

Ответы

Ответ 1

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

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

Ответ 2

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

/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;

Ответ 3

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

include /etc/nginx/proxy.conf;

Итак, я держу nginx в качестве прокси-сервера на сервере COMET.

Ответ 6

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

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

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

Ответ 7

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