Trì hoãn để kết nối yêu cầu proxy của Apache với Ứng dụng node.js


12

Trong Ubuntu Server 10.04 của tôi, tôi đang chạy một ứng dụng node.js mẫu:

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

Nó chỉ đơn giản là lắng nghe các yêu cầu trên cổng 3000, đăng nhập vào bảng điều khiển yêu cầu này và gửi cho khách hàng một HTTP "Hello World"

Mục tiêu là làm cho ứng dụng này cùng tồn tại với Apache2. Vì vậy, sau một số nghiên cứu, tôi đã chỉnh sửa tệp mặc định ( / etc / apache2 / sites-Available / default ) theo cách này:

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

Vì vậy, khi người dùng thực hiện cuộc gọi đến http://dev.myserver.com/nodehoặc http://dev.myserver.com/node/, Apache thực hiện yêu cầu, Node.js thực hiện việc xử lý và người dùng sẽ nhận lại "Hello World".

Chỉ có một vấn đề: Phải mất một thời gian để, hãy gọi nó là 'Tải' Proxy, nói cách khác, tôi nhận được các tin nhắn này trên trình duyệt:

<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

Ngoài ra, error.log cho tôi biết:

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

Rồi đột nhiên, Nó hoạt động, cứ như vậy. Không có số lượng yêu cầu, không có thời gian, không có mẫu nào cả.

Theo cách nói của giáo dân, dịch vụ phải 'tải' , đó là ấn tượng mà nó mang lại, nhưng, tôi muốn biết liệu có cách nào để giảm thiểu sự chậm trễ này không. Hoặc tôi muốn biết những gì là sai với cấu hình được ghi chú ở trên.

Chỉnh sửa 1 : Sau khi sửa đổi LogLevel thành gỡ lỗi, trong một trong những lần trì hoãn này, tôi nhận được điều này theo yêu cầu:

[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

... và khi nó lại đúng:

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

Đối với người điều hành: Tôi không chắc đây là câu hỏi stackoverflow hay câu hỏi serverfault, vì vậy tôi đã đăng cả hai trang web.
Herman Junge

1
Đăng chéo là một ý tưởng tồi trừ khi bạn không nhận được câu trả lời, thì hãy chắc chắn liên kết chéo giữa chúng! Nếu bạn đăng sai vị trí, người điều hành sẽ giúp di chuyển nó đến đúng nơi, nhưng xin đừng lặp lại những nỗ lực của chúng tôi ngay từ đầu!
Caleb

Xin lỗi @Caleb, Lỗi của người mới bắt đầu. Sẽ không xảy ra lần nữa.
Herman Junge

Đừng lo lắng, đây là một học hỏi khi bạn đi.
Caleb

Câu trả lời:


10

Thay đổi LogLevelthành debugsẽ cung cấp cho bạn thêm thông tin trong error.log. Hãy làm như vậy và gửi kết quả. Không có thông tin đó, tôi đoán rằng việc thay đổi dòng ProxyPass của bạn ProxyPass http://127.0.0.1:3000/ retry=0có thể giúp ích. Nói chung, tài liệu mod_proxy của Apache có nhiều chi tiết hơn về các tham số có sẵn cho bạn.


Cảm ơn @justarobert, Bây giờ tôi đang trải nghiệm "Nghịch đảo Murphy", bởi vì tôi đang cố gắng tái tạo lỗi và mọi thứ đều ổn! Tôi cá rằng trong sản xuất tôi sẽ gặp lại tình huống này ... Ngay sau khi tôi có dữ liệu, tôi sẽ điền nó vào đây. Cảm ơn một lần nữa.
Herman Junge

Con số đó! Đảm bảo không sử dụng LogLevel debugtrong sản xuất.
justarobert

CƯỜI LỚN. Tôi vừa mới chỉnh sửa câu hỏi của mình.
Herman Junge

1
Nhật ký Apache chỉ ra rằng quá trình node.js của bạn không đáp ứng với các yêu cầu được ủy quyền trong thời gian trễ. Bạn có nhận được gì từ nhật ký node.js của mình không? Bạn có thể truy cập trực tiếp máy chủ node.js trong trình duyệt của mình khi Apache chậm trễ không? Cân nhắc sử dụng ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, chỉ để làm cho thời gian chờ rõ ràng. Ngoài ra, hãy xem thảo luận tại news.ycombinator.com/item?id=2037328 để biết lý do tại sao bạn có thể không muốn đặt Apache trước node.js.
justarobert

2

Đào cái này lên. Tôi đã gặp sự cố này trên CentOS khi bật Selinux. Tất cả những gì tôi cần làm là cho phép httpd thực hiện kết nối mạng:

/usr/sbin/setsebool httpd_can_network_connect 1

(và khởi động lại httpd)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.