Прокси 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.
Ответ 4
Теперь есть плагин Comet для Nginx. Это, вероятно, решит ваши проблемы довольно хорошо.
http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/
Ответ 5
Try
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
Ответ 6
не выполняя некоторые серьезные трюки TCP/IP, вы не можете выставлять два приложения на одном и том же TCP-порту на одном IP-адресе. как только nginx начал обслуживать соединение, он не может передать его другому приложению, он может проксировать его только.
так, либо пользовательский другой порт, другой IP-номер (может находиться на одной физической машине), либо жить с прокси-сервером.
edit: я предполагаю, что nginx отключается, потому что он не видит никакой активности в течение длительного времени. возможно, добавление нулевого сообщения каждые несколько минут может привести к сбою соединения.
Ответ 7
Возможно, вы захотите попробовать прослушать (80) на сервере node.js вместо 8080 (предположим, вы используете это как асинхронный сервер?) и потенциально вообще пропустите Ngnix. Я использую межплатформенное связывание и выражаю статические файлы сервера и занимаюсь кэшированием, которое обычно обрабатывается Ngnix. Если вы хотите запустить несколько экземпляров node (что я бы посоветовал), вы можете захотеть заглянуть в node.js самостоятельно как балансировщик прокси/нагрузки в другие экземпляры node, а не Nginx в качестве вашего шлюза. Я столкнулся с проблемой с этим, хотя, когда я работал слишком много статических файлов изображений сразу, но после того, как я поместил изображения на S3, он стабилизировался. Nginx МОЖЕТ быть излишним для того, что вы делаете. Попробуй и посмотри. Удачи.