Аквард затримує підключення запиту проксі-сервера 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)

Модераторам: я не впевнений, що це питання про stackoverflow або серверне запитання за замовчуванням, тому я розмістив обидва сайти.
Герман Юнге

1
Перехресне повідомлення - це погана ідея, якщо ви не отримаєте відповіді, тоді не забудьте також перехрестити зв’язок між ними! Якщо ви розміщуєте повідомлення в неправильному місці, модератори допоможуть перенести його в потрібне місце, але, будь ласка, не просто дублюйте наші зусилля з самого початку!
Калеб

Вибачте @Caleb, помилка початківців. Не повториться
Герман Юнге

Не хвилюйтесь, це навчання, коли ви проходите місце.
Калеб

Відповіді:


10

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


Дякую @justarobert, зараз я переживаю "Зворотну Мерфі", тому що я намагаюся повторити помилку, і все йде добре! Б'юсь об заклад, що у виробництві у мене знову з’явиться така ситуація ... Як тільки у мене з’являться дані, я збираюся їх тут заповнити. Знову дякую.
Герман Юнге

Це цифри! Обов’язково не використовуйте LogLevel debugу виробництві.
justarobert

ЛОЛ. Я щойно відредагував своє запитання.
Герман Юнге

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.
justarobert

2

Копати це. У мене виникла ця проблема на CentOS із включенням SELinux. Все, що мені потрібно було зробити, це дозволити httpd здійснювати мережеві з'єднання:

/usr/sbin/setsebool httpd_can_network_connect 1

(і перезавантажте httpd)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.