Apache'nin proxy isteğini bir node.js Uygulamasına bağlamak için gecikme


12

Ubuntu Sunucum 10.04'te örnek bir node.js uygulaması çalıştırıyorum:

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 numaralı bağlantı noktasındaki istekleri dinler, bu isteği konsolda oturum açar ve istemciye bir HTTP "Merhaba Dünya" gönderir.

Amaç bu uygulamayı Apache2 ile bir arada yapmaktı. Bazı araştırmalardan sonra varsayılan dosyayı ( / etc / apache2 / sites-available / default ) şu şekilde düzenledim :

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

Bu nedenle, bir kullanıcı çağrıyı yaptığında http://dev.myserver.com/nodeveya http://dev.myserver.com/node/Apache isteği proxy yapar, Node.js işlemi yapar ve kullanıcı "Merhaba Dünya" yı geri alır.

Sadece bir sorun var: Proxy'ye 'Load' diyelim, başka bir deyişle tarayıcıda şu mesajları alıyorum:

<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

Ayrıca error.log bana şunu söylüyor:

[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)

Sonra aniden, Çalışır, aynen böyle. İstek sayısı yok, zaman yok, desen yok.

Layman'ın terimleriyle, hizmet 'yüklemek' zorunda , Bu izlenim veriyor, ama, bu gecikmeyi en aza indirmenin bir yolu olup olmadığını bilmek istiyorum. Ya da daha doğrusu bilemez ne Yukarıda belirtildiği yapılandırmayla yanlıştır.

Düzenleme 1 : Hata ayıklamak için LogLevel değiştirdikten sonra, bu gecikmelerden biri sırasında bunu istek başına alıyorum:

[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

... ve tekrar doğru olduğunda:

[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)

Moderatörler için: Bunun bir stackoverflow sorusu mu yoksa bir sunucu hatası mı olduğundan emin değilim, bu yüzden her iki siteyi de yayınladım.
Herman Junge

1
Cevap alamadığınız sürece çapraz gönderme kötü bir fikirdir, o zaman aralarındaki bağlantıyı da geçtiğinizden emin olun! Yanlış yere gönderiyorsanız, moderatörler doğru yere taşınmasına yardımcı olur, ancak lütfen çabalarımızı en baştan tekrarlamayın!
Caleb

Özür dilerim @ Caleb, Acemi Hata. Bir daha olmayacak.
Herman Junge

Endişeye gerek yok, bu yer olarak bir öğrenme.
Caleb

Yanıtlar:


10

Değişen LogLeveliçin debugsize error.log daha fazla bilgi verecektir. Lütfen bunu yapın ve sonuçları gönderin. Bu bilgi olmadan, ProxyPass hattınızı değiştirmenin ProxyPass http://127.0.0.1:3000/ retry=0yardımcı olabileceğini tahmin ediyorum . Genel olarak, Apache mod_proxy belgelerinde kullanabileceğiniz parametreler hakkında daha fazla ayrıntı bulunur.


Teşekkürler @justarobert, Şimdi bir "Ters Murphy" yaşıyorum, çünkü hatayı çoğaltmaya çalışıyorum ve her şey yolunda! Bahse girerim üretimde yine bu duruma sahip olacağım ... Veriler elime ulaşır ulaşmaz, onu buraya dolduracağım. Tekrar teşekkürler.
Herman Junge

Bu rakamlar! LogLevel debugÜretimde kullanmadığınızdan emin olun .
justarobert

LOL. Sorumu yeni düzenledim.
Herman Junge

1
Apache günlükleri, node.js işleminizin gecikmeler sırasında proxy isteklerine yanıt vermediğini gösterir. O zaman node.js günlüklerinizden bir şey alıyor musunuz? Apache size gecikme verdiğinde doğrudan tarayıcınızdaki node.js sunucusunu ziyaret edebilir misiniz? ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10Zaman aşımını açık hale getirmek için, kullanmayı düşünün . Ayrıca, Apache'yi neden node.js'nin önüne koymak istemeyeceğiniz konusunda news.ycombinator.com/item?id=2037328 adresindeki tartışmaya bakın .
justarobert

2

Bunu kazmak. SELinux etkin CentOS bu sorunu vardı. Tek yapmam gereken httpd'nin ağ bağlantıları yapmasına izin vermek:

/usr/sbin/setsebool httpd_can_network_connect 1

(ve httpd'yi yeniden başlat)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.