Задержка при подключении прокси-запроса Apache к приложению node.js

12

В моем Ubuntu Server 10.04 я использую пример приложения node.js:

var http = require("http");

function onRequest(request, response) {

        console.log("Request received.");
        response.writeHead(200, {"Content-Type": "text/html"});
        response.write("Hello World");
        response.end();

}

http.createServer(onRequest).listen(3000);

Он просто слушает запросы на порт 3000, входит в консоль этого запроса и отправляет клиенту HTTP «Hello World».

Цель состояла в том, чтобы сделать это приложение сосуществующим с Apache2. Поэтому после некоторых исследований я отредактировал файл по умолчанию ( / etc / apache2 / sites-available / default ) следующим образом:

<VirtualHost *:80>
        ServerAdmin haj@myserver.com
        ServerName dev.myserver.com

        <Location /node>

                ProxyPassReverse http://127.0.0.1:3000/
                ProxyPass http://127.0.0.1:3000/

        </Location>

        <Proxy>
                Allow from all
        </Proxy>

        DocumentRoot /home/haj/www/http_home

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /home/haj/www/http_home/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /home/haj/www/log/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /home/haj/www/log/access.log combined


</VirtualHost>

Таким образом, когда пользователь выполняет вызов http://dev.myserver.com/nodeили http://dev.myserver.com/node/, Apache проксирует запрос, Node.js выполняет обработку, и пользователь возвращает «Hello World».

Есть только одна проблема: требуется некоторое время, давайте назовем это «Загрузить» прокси, другими словами, я получаю эти сообщения в браузере:

<503 Service Temporarily Unavailable>

Service Temporarily Unavailable

The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

Apache/2.2.14 (Ubuntu) Server at dev.neosource.cl Port 80

Кроме того, error.log говорит мне:

[Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)
[Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)
[Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)

И вдруг, это работает, просто так. Нет количества запросов, нет времени, нет шаблона вообще.

С точки зрения непрофессионала, сервис должен «загружаться» , это впечатление, которое он производит, но я хотел бы знать, есть ли способ минимизировать эту задержку. Или я бы предпочел знать, что не так с конфигурацией, указанной выше.

Изменить 1 : После изменения LogLevel для отладки, во время одной из этих задержек я получаю это для каждого запроса:

[Thu Apr 21 02:30:40 2011] [debug] mod_proxy_http.c(56): proxy: HTTP: canonicalising URL //127.0.0.1:3000/
[Thu Apr 21 02:30:40 2011] [debug] proxy_util.c(1494): [client 200.xxx.yyy.zzz] proxy: http: found worker http://127.0.0.1:3000/ for http://127.0.0.1:3000/
[Thu Apr 21 02:30:40 2011] [debug] mod_proxy.c(993): Running scheme http handler (attempt 0)
[Thu Apr 21 02:30:40 2011] [debug] mod_proxy_http.c(1940): proxy: HTTP: serving URL http://127.0.0.1:3000/
[Thu Apr 21 02:30:40 2011] [debug] proxy_util.c(1937): proxy: HTTP: retrying the worker for (127.0.0.1)
[Thu Apr 21 02:30:40 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)
[Thu Apr 21 02:30:40 2011] [debug] mod_deflate.c(615): [client 200.xxx.yyy.zzz] Zlib: Compressed 405 to 273 : URL /node

... и когда это снова правильно

[Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(56): proxy: HTTP: canonicalising URL //127.0.0.1:3000/
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(1494): [client 200.xxx.yyy.zzz] proxy: http: found worker http://127.0.0.1:3000/ for http://127.0.0.1:3000/
[Thu Apr 21 02:35:16 2011] [debug] mod_proxy.c(993): Running scheme http handler (attempt 0)
[Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1940): proxy: HTTP: serving URL http://127.0.0.1:3000/
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(1999): proxy: HTTP: has acquired connection for (127.0.0.1)
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2055): proxy: connecting http://127.0.0.1:3000/ to 127.0.0.1:3000
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2153): proxy: connected / to 127.0.0.1:3000
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2244): proxy: HTTP: backend socket is disconnected.
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2308): proxy: HTTP: fam 2 socket created to connect to 127.0.0.1
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2414): proxy: HTTP: connection complete to 127.0.0.1:3000 (127.0.0.1)
[Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1723): proxy: start body send
[Thu Apr 21 02:35:16 2011] [debug] mod_deflate.c(615): [client 200.xxx.yyy.zzz] Zlib: Compressed 11 to 13 : URL /node
[Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1816): proxy: end body send
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2017): proxy: HTTP: has released connection for (127.0.0.1)
Герман Юнге
источник
Модераторам: я не уверен, что это вопрос о переполнении стека или вопрос о сбое сервера, поэтому я разместил оба сайта.
Герман Юнге,
1
Перекрестная публикация - плохая идея, если вы не получили ответ, тогда обязательно перепишите ссылку между ними! Если вы разместите сообщение в неправильном месте, модераторы помогут перенести его в нужное место, но, пожалуйста, не копируйте наши усилия с самого начала!
Калеб
Извините @Caleb, Ошибка новичка. Больше не повторится.
Герман Юнге,
Не беспокойтесь, это учиться, как вы идете.
Калеб

Ответы:

10

Переход LogLevelна debugдаст вам больше информации в error.log. Пожалуйста, сделайте это и опубликуйте результаты. Без этой информации, я предполагаю, что изменение строки ProxyPass ProxyPass http://127.0.0.1:3000/ retry=0может помочь. В общем, документация Apache mod_proxy содержит более подробную информацию о доступных параметрах.

justarobert
источник
Спасибо @justarobert, Теперь я испытываю "Обратный Мерфи", потому что я пытаюсь повторить ошибку, и все идет хорошо! Могу поспорить, что в производстве у меня снова будет такая ситуация ... Как только у меня будут данные, я собираюсь заполнить их здесь. Спасибо еще раз.
Герман Юнге
Это цифры! Убедитесь, что не использовать LogLevel debugв производстве.
Джастароберт
ЛОЛ. Я только что отредактировал свой вопрос.
Герман Юнге,
1
Журналы Apache показывают, что ваш процесс node.js не отвечает на запросы прокси во время задержек. Получаете ли вы что-нибудь из ваших журналов node.js в то время? Можете ли вы посетить сервер node.js в своем браузере напрямую, когда Apache дает вам задержку? Рассмотрите возможность использования ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, просто чтобы сделать тайм-аут явным. Также посмотрите обсуждение на news.ycombinator.com/item?id=2037328, чтобы узнать, почему вы не хотите ставить Apache перед node.js.
Джастароберт
2

Копаем это. У меня была эта проблема на CentOS с включенным SELinux. Все, что мне нужно было сделать, это разрешить httpd устанавливать сетевые подключения:

/usr/sbin/setsebool httpd_can_network_connect 1

(и перезапустите httpd)

Томек Валкуски
источник