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


У меня есть 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 я не вижу ответа в браузере. Браузер просто говорит: "ждем localhost". 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, а сервер отправляет данные всем подключенным клиентам. Если нет данных, которые должны быть отправлены с сервера, я отключаю процесс. А потом, когда просыпаюсь, я вызываю функцию подачи, чтобы отправить данные. И если я удаляю код гибернации, все работает хорошо, и я вижу вывод в браузере. Но если я это сделаю ... впадай в спячку, это не сработает. Есть идеи, что происходит?

1 4

1 ответ:

Исправлено!

Ссылка: http://timanovsky.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 за то, что указал на ответ!