Обратный прокси-сервер Nginx для пользовательского приложения Mochiweb

StackOverflow https://stackoverflow.com/questions/1006400

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня есть Nginx в качестве внешнего веб-сервера, прослушивающего порт 80.И для некоторых запросов я настроил nginx для обратного прокси-сервера на написанный мной веб-сервер на базе mochiweb, прослушивающий порт 8000.Моя конфигурация nginx для этого выглядит так:

location /mymochiserver {

            proxy_pass         http://127.0.0.1:8000;
            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      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }

Теперь, когда я получаю доступ к URL-адресу http://localhost/mymochiserver Я не вижу ответа в браузере.Браузер просто говорит: «Ожидание локального хоста».mymochiserver печатает некоторую трассировку в окне терминала, из которого он запускается, всякий раз, когда к нему подключается пользователь, и прямо сейчас я вижу трассировку для каждого окна браузера, которое открываю для подключения этого URL-адреса.Но я не вижу, чтобы какой-либо результат, который я ожидал увидеть, был записан в браузер.НО, когда я напрямую обращаюсь к URL-адресу http://127.0.0.1:8000/ все работает нормально, и я вижу выходные данные mymochiserver в браузере.Так что это работает при прямом вызове.Но при обратном проксировании через nginx, похоже, он не работает.Есть идеи, что может быть не так?


Обновлять:В моем приложении Mochiweb есть следующие строки кода:

Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
proc_lib:hibernate(?MODULE, feed, [Response, Userid, 1]);

По сути, это приложение COMET, в котором пользователи подключаются к серверу mymochiserver, а сервер передает данные всем подключенным клиентам.Если с сервера нет данных для отправки, я переводю процесс в спящий режим.А затем, проснувшись, я вызываю функцию подачи, чтобы отправить данные.И если я удалю код гибернации, все будет работать хорошо, и я увижу вывод в браузере.Но если я перейду в спящий режим, это не сработает.Есть идеи, что происходит не так?

Это было полезно?

Решение

Зафиксированный!

Ссылка: http://timaninsky.wordpress.com/2009/01/09/toward-a-million-user-long-poll-http-application-nginx-erlang-mochiweb/

Мне пришлось отключить буферизацию прокси и увеличить proxy_read_timeout в nginx, чтобы все заработало.Итак, мой файл конфигурации теперь выглядит так:

location /mymochiapp {
            proxy_pass         http://127.0.0.1:8000;
            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      90;
            proxy_send_timeout         90;
            proxy_read_timeout         3600;

            proxy_buffering off;
        }

Спасибо, thomas55, за указание на ответ!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top