2009-07-21 34 views
14

Tôi cần một số trợ giúp từ một số chuyên gia Linux. Tôi đang làm việc trên một webapp bao gồm một máy chủ sao chổi. Máy chủ sao chổi chạy trên localhost: 8080 và hiển thị url localhost: 8080/long_polling cho khách hàng để kết nối. Webapp của tôi chạy trên localhost: 80.proxy nginx để sao chổi

Tôi đã sử dụng nginx để yêu cầu proxy từ nginx đến máy chủ sao chổi (localhost: 80/long_polling proxy để localhost: 8080/long_polling), tuy nhiên, tôi có hai lời phàn nàn với giải pháp này:

  1. nginx mang lại cho tôi thời gian chờ của Cổng 504 sau một phút, mặc dù tôi đã thay đổi MỌI thiết lập một lần trong một lần đến 600 giây
  2. Tôi thực sự không muốn nginx phải ủy quyền cho máy chủ sao chổi - proxy nginx là không được xây dựng cho các kết nối lâu dài (lên đến nửa giờ có thể). Tôi thà cho phép khách hàng kết nối trực tiếp với máy chủ sao chổi và để máy chủ sao chổi xử lý nó.

Vì vậy, câu hỏi của tôi là: có bất kỳ thủ thuật linux nào cho phép tôi hiển thị localhost: 8080/long_polling tới localhost: 80/long_polling mà không sử dụng proxy nginx không? Phải có cái gì đó. Đó là lý do tại sao tôi nghĩ rằng câu hỏi này có lẽ có thể được trả lời tốt nhất bởi một guru Linux.

Lý do tôi cần/long_polling được hiển thị trên cổng 80 là vì vậy tôi có thể sử dụng AJAX để kết nối với nó (ajax cùng nguồn gốc-chính sách).

Đây là proxy.conf nginx tôi để tham khảo:

proxy_redirect    off;                               
proxy_set_header   Host $host; 
proxy_set_header   X-Real-IP $remote_addr; 
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
client_max_body_size  10m; 
client_body_buffer_size  128k; 
proxy_connect_timeout  600; 
proxy_send_timeout   600; 
proxy_read_timeout   600; 
proxy_buffer_size   4k; 
proxy_buffers    4 32k; 
proxy_busy_buffers_size  64k; 
proxy_temp_file_write_size 64k; 
send_timeout    600; 
proxy_buffering    off; 

Trả lời

4

tôi không nghĩ rằng, đó là có thể ...

localhost:8080/long_polling là một URI ... chính xác hơn, nó phải là http://localhost:8080/long_polling ... trong HTTP số URI sẽ được giải quyết theo yêu cầu /long_polling, đến cổng 80 tới máy chủ có tại tên miền 'localhost' ... nghĩa là, mở một kết nối tcp đến 127.0.0.1:80 và gửi

GET /long_polling HTTP/1.1 
Host: localhost:8080 

cộng với một số tiêu đề HTTP bổ sung ... tôi chưa từng nghe chưa, mà cổng có thể bị ràng buộc accross quá trình ...

trên thực tế, nếu tôi hiểu tốt, nginx được thiết kế để được một proxy mở rộng. .. Ngoài ra, họ tuyên bố họ cần 2,5 MB cho 10000 kết nối không tải HTTP ... để thực sự không phải là vấn đề ...

bạn đang sử dụng máy chủ sao chổi nào? bạn có thể cho phép máy chủ sao chổi proxy một máy chủ web? yêu cầu http bình thường cần được xử lý một cách nhanh chóng ...

Greetz

back2dos

+1

Vâng, nếu nginx sử dụng lượng bộ nhớ nhỏ đó, tôi rất thích làm việc với nginx làm máy chủ proxy phía trước. Chỉ cần thoát khỏi lỗi "Cổng thời gian chờ 504" xảy ra sau khoảng một phút (luôn xảy ra sau khoảng 55 - 65 giây). Cảm ơn câu trả lời của bạn. Tôi đang sử dụng node.js làm máy chủ COMET. – Chris

0

mà không làm một số nghiêm trọng TCP/IP mungling, bạn có thể không tiếp xúc với hai ứng dụng trên cổng TCP tương tự trên cùng Địa chỉ IP. một khi nginx đã bắt đầu phục vụ kết nối, nó không thể chuyển nó đến ứng dụng khác, nó chỉ có thể ủy quyền nó.

vì vậy, một trong hai người dùng một cổng khác, một số IP khác (có thể nằm trên cùng một máy vật lý) hoặc sống với proxy.

chỉnh sửa: tôi đoán nginx sẽ hết thời gian vì không thấy hoạt động nào trong một thời gian dài.có thể thêm một tin nhắn rỗng mỗi vài phút có thể giữ cho kết nối không thành công.

+0

Ok - Tôi đoán guru của Linux đã nói :) Nó chỉ là không dễ dàng có thể. Sau đó, tôi sẽ phải tìm ra sau đó làm thế nào để làm cho nginx không thời gian ra sau đó. Cám ơn rất nhiều! Nếu bất cứ ai đọc điều này có bất kỳ ý tưởng tại sao nginx có thể được thời gian ra, cho tôi biết! – Chris

2

Hãy thử

proxy_next_upstream error; 

Mặc định là

proxy_next_upstream error timeout; 

Thời gian chờ không thể có nhiều hơn 75 giây.

http://wiki.nginx.org/NginxHttpProxyModule#proxy_next_upstream

http://wiki.nginx.org/NginxHttpProxyModule#proxy_connect_timeout

+0

Trên một lưu ý liên quan, tôi tình cờ gặp email của bạn vào danh sách gửi thư nginx mà bạn đề cập đến rằng bạn đang sử dụng node.js. Bạn đang * chính xác * một bước trước tôi trong dự án của riêng tôi. Tôi cũng đang lên kế hoạch sử dụng node.js sau nginx. Hãy giữ cho chúng tôi đăng cách hoạt động này! Tôi có một vài dự án node.js trên github FWIW: http://github.com/fictorial/ – z8000

+0

Xin chào Brian! node.js rất ngọt ngào.Máy chủ COMET dễ viết và hoạt động tốt. Không chắc chắn làm thế nào nó sẽ giữ trong sản xuất. – Chris

+0

Bạn có muốn chia sẻ những gì bạn đã làm không? Một máy chủ COMET chạy đằng sau một proxy đảo ngược sản xuất sẵn sàng như nginx (được đăng lên nhóm node.js của Google) sẽ là một cách tuyệt vời để có được nhiều người quan tâm đến node.js hơn và cũng sẽ giúp tôi! ;) – z8000

6

Tôi thực sự quản lý để có được điều này làm việc ngay bây giờ. Cảm ơn tất cả. Lý do nginx là 504 thời gian ra là một ngớ ngẩn một: Tôi đã không bao gồm proxy.conf trong nginx.conf tôi như vậy:

include /etc/nginx/proxy.conf; 

Vì vậy, tôi đang giữ nginx như một proxy frontend đến máy chủ COMET .

+2

bạn có thể đăng nginx.conf và proxy.conf để tham khảo không? – z8000

7

Đây là nginx.conf và proxy.conf của tôi. Tuy nhiên, lưu ý rằng proxy.conf là quá mức cần thiết - tôi chỉ cài đặt tất cả các cài đặt này trong khi cố gắng gỡ lỗi chương trình của mình.

/etc/nginx/nginx.conf

worker_processes 1;                                  
user www-data; 

error_log /var/log/nginx/error.log debug; 
pid  /var/run/nginx.pid; 

events { 
    worker_connections 1024; 
} 

http { 
    include /etc/nginx/proxy.conf; 

    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    access_log /var/log/nginx/access.log; 

    sendfile  on; 
    tcp_nopush  on; 

    keepalive_timeout 600; 
    tcp_nodelay  on; 

    gzip on; 
    gzip_comp_level 2; 
    gzip_proxied any; 
    gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript; 

    include /etc/nginx/conf.d/*.conf; 
    include /etc/nginx/sites-enabled/*; 
} 

/etc/nginx/proxy.conf

proxy_redirect    off;                               
proxy_set_header   Host $host; 
proxy_set_header   X-Real-IP $remote_addr; 
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
client_max_body_size  10m; 
client_body_buffer_size  128k; 
proxy_connect_timeout  6000; 
proxy_send_timeout   6000; 
proxy_read_timeout   6000; 
proxy_buffer_size   4k; 
proxy_buffers    4 32k; 
proxy_busy_buffers_size  64k; 
proxy_temp_file_write_size 64k; 
send_timeout    6000; 
proxy_buffering    off; 
proxy_next_upstream error; 
+0

cảm ơn bạn đã chia sẻ! – z8000

0

Bạn có thể muốn thử nghe (80) trên máy chủ Node.js thay vì 8080 (tôi đoán bạn đang sử dụng đó như là một máy chủ async?) Và có khả năng bỏ lỡ Ngnix hoàn toàn. Tôi sử dụng kết nối middleware và thể hiện cho các tập tin tĩnh máy chủ và đối phó với bộ nhớ đệm mà thông thường sẽ được xử lý bởi Ngnix. Nếu bạn muốn có nhiều phiên bản chạy nút (mà tôi khuyên), bạn có thể muốn xem xét chính node.js như một bộ cân bằng tải/proxy tới các thể hiện nút khác thay vì Nginx làm cổng của bạn. Tôi gặp vấn đề với điều này mặc dù khi tôi đang phục vụ quá nhiều tệp hình ảnh tĩnh cùng một lúc nhưng sau khi tôi đặt hình ảnh trên S3 nó ổn định. Nginx CÓ THỂ là quá mức cần thiết cho những gì bạn đang làm. Hãy thử nó và xem. May mắn nhất.

Các vấn đề liên quan