Akward menunda untuk menghubungkan permintaan proxy Apache ke Aplikasi node.js

12

Di Ubuntu Server 10.04 saya, saya menjalankan contoh aplikasi 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);

Ini hanya mendengarkan permintaan pada port 3000, masuk konsol permintaan ini dan mengirim ke klien HTTP "Hello World"

Tujuannya adalah untuk membuat aplikasi ini hidup berdampingan dengan Apache2. Jadi setelah beberapa penelitian saya mengedit file default ( / etc / apache2 / sites-available / default ) dengan cara ini:

<VirtualHost *:80>
        ServerAdmin [email protected]
        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>

Jadi, ketika seorang pengguna melakukan panggilan ke http://dev.myserver.com/nodeatau http://dev.myserver.com/node/, Apache mem-proksi permintaan tersebut, Node.js melakukan pemrosesan, dan pengguna mendapatkan kembali "Hello World".

Hanya ada satu masalah: Butuh beberapa waktu untuk, Mari kita sebut 'Muat' Proksi, dengan kata lain, saya mendapatkan pesan-pesan ini di browser:

<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

Selain itu, error.log memberi tahu saya:

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

Lalu tiba-tiba, It Works, begitu saja. Tidak ada jumlah permintaan, tidak ada waktu, tidak ada pola sama sekali.

Dalam istilah awam, layanan harus 'memuat' , Itulah kesan yang diberikannya, tetapi, saya ingin tahu apakah ada cara untuk meminimalkan keterlambatan ini. Atau saya lebih suka tahu apa yang salah dengan konfigurasi yang disebutkan di atas.

Sunting 1 : Setelah memodifikasi LogLevel untuk debug, selama salah satu penundaan ini saya mendapatkan ini per permintaan:

[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

... dan ketika itu benar lagi:

[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)
Herman Junge
sumber
Untuk moderator: Saya tidak yakin apakah ini pertanyaan stackoverflow atau pertanyaan serverfault, jadi saya memposting kedua situs.
Herman Junge
1
Posting silang adalah ide yang buruk kecuali jika Anda tidak mendapatkan jawaban, maka pastikan untuk juga saling silang di antara mereka! Jika Anda memposting di tempat yang salah, moderator akan membantu memigrasikannya ke tempat yang tepat, tetapi jangan hanya menduplikasi upaya kami dari awal!
Caleb
Maaf @ Caleb, Kesalahan Pemula. Tidak akan terjadi lagi
Herman Junge
Jangan khawatir, ini adalah pembelajaran saat Anda pergi.
Caleb

Jawaban:

10

Mengubah LogLevelke debugakan memberi Anda lebih banyak informasi di error.log. Silakan lakukan dan kirim hasilnya. Tanpa informasi itu, saya menduga bahwa mengubah saluran ProxyPass Anda ProxyPass http://127.0.0.1:3000/ retry=0dapat membantu. Secara umum, dokumentasi mod_proxy Apache memiliki rincian lebih lanjut tentang parameter yang tersedia untuk Anda.

justarobert
sumber
Terima kasih @justarobert, Sekarang saya mengalami "Inverse Murphy", karena saya mencoba mereplikasi kesalahan, dan semuanya berjalan dengan baik! Saya bertaruh bahwa dalam produksi saya akan mengalami situasi ini lagi ... Begitu saya memiliki data, saya akan mengisinya di sini. Terima kasih lagi.
Herman Junge
Angka itu! Pastikan untuk tidak menggunakan LogLevel debugdalam produksi.
justarobert
LOL. Saya baru saja mengedit pertanyaan saya.
Herman Junge
1
Log Apache menunjukkan bahwa proses node.js Anda tidak menanggapi permintaan proksi selama penundaan. Apakah Anda mendapatkan sesuatu dari node.js Anda saat itu? Bisakah Anda mengunjungi server node.js di browser Anda secara langsung ketika Apache memberi Anda penundaan? Pertimbangkan untuk menggunakan ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, hanya untuk membuat batas waktu menjadi eksplisit. Juga, lihat diskusi di news.ycombinator.com/item?id=2037328 untuk alasan mengapa Anda mungkin tidak ingin meletakkan Apache di depan node.js.
justarobert
2

Menggali ini. Saya mengalami masalah ini pada CentOS dengan SELinux aktif. Yang perlu saya lakukan adalah mengizinkan httpd untuk membuat koneksi jaringan:

/usr/sbin/setsebool httpd_can_network_connect 1

(dan mulai ulang httpd)

Tomek Wałkuski
sumber