2010-12-29 38 views
11

Tôi đang sử dụng nginx để chuyển yêu cầu đến ứng dụng Nút. Ứng dụng cơ bản hoạt động như một bộ nhớ đệm từ xa cho html (kiểm tra xem người dùng đang yêu cầu gì trong db redis, nếu nó chỉ cho thấy rằng, nếu không lấy nó và lưu trữ nó trong bộ nhớ đệm redis và phục vụ nó lên.)Sử dụng nginx để phân phối nội dung trực tiếp từ bộ nhớ cache redis

Tôi đã tò mò nếu có anyway để bỏ qua nhấn các ứng dụng Node bằng cách nginx phục vụ nội dung trực tiếp từ redis? Tôi đã được lừa xung quanh với các module http_redis nhưng tôi không thể thực sự làm cho nó hoạt động.

Một ví dụ đơn giản là: http://mywebsite.com/a trong đó nginx sẽ phân phát nội dung trong khóa 'a' hoặc chuyển nó lên ứng dụng nút nếu khóa không tồn tại. Điều này thậm chí có thể?

Trả lời

1

Bạn sẽ có thể nhận được điều gì đó bằng cách thiết lập Nginx làm proxy ngược cho Webdis.

Cách bạn sử dụng Webdis là bạn đặt toàn bộ lệnh trong URL, do đó, để GET phím a bạn yêu cầu /GET/a. Điều này có nghĩa rằng nếu tất cả mọi thứ bạn muốn phục vụ có sẵn sử dụng GET bạn có thể làm một cái gì đó như thế này trong Nginx:

location/{ 
    rewrite ^(.*)$ /GET/$1 break; 
    proxy_pass http://127.0.0.1:7379/; 
} 

(Tôi đang viết cấu hình ra khỏi đỉnh đầu của tôi ở đây, cú pháp có thể là hơi off). Tuy nhiên, dự án Webdis là rất trẻ nên không nói nó hoạt động tốt như thế nào, và câu trả lời là các tài liệu JSON có thêm một số lông tơ mà bạn có thể không muốn quay lại.

+0

hmmm, tôi sẽ kiểm tra. Tôi không biết tôi rất nhiều về nginx vì vậy tôi thậm chí không biết nếu những gì tôi đã yêu cầu là có thể. Tôi đoán cho phương pháp của bạn tôi sẽ chỉ phải xem nếu phục vụ nó từ Node hoặc từ Webdis sẽ nhanh hơn. Dường như nginx có thể truy cập trực tiếp từ memcache và mô-đun http_redis có vẻ như được mô hình hóa sau đó. –

+0

Nếu bạn cũng đang sử dụng tính năng này với pub/subs, bạn sẽ muốn tắt proxy_buffering và proxy_read_timeout thành giá trị dài thích hợp. – rrauenza

9

Có thể một cái gì đó khó khăn hơn để thiết lập hơn Webdis nhưng bạn có thể làm điều đó trực tiếp trong daemon nginx với một số mô-đun bổ sung như redis2-nginx-module. Bạn sẽ phải biên dịch lại nginx.

Có một số ví dụ hay về cấu hình trên trang chủ.

Ví dụ:

# GET /get?key=some_key 
location /get { 
    set_unescape_uri $key $arg_key; # this requires ngx_set_misc 
    redis2_query get $key; 
    redis2_pass foo.com:6379; 
} 

Tất nhiên, với một chút cấu hình nginx hơn, bạn có thể nhận được một mẫu URL.

Lưu ý rằng đối với ví dụ này, bạn cũng sẽ phải biên dịch ngx_set_misc mô-đun.

3

Tôi biết đây là một chuỗi cũ nhưng vẫn còn, điều này có thể hữu ích đối với một số chủ đề. Tôi đã thử phương pháp tương tự như bạn có nginx phục vụ từ Redis trực tiếp mà không cần nhấn bằng cách sử dụng HttpRedis2Module trong nginx. Tôi rất vui khi tôi nhận được nó vì nó là một số rắc rối với nó, nhưng khi tôi đã làm một số bài kiểm tra căng thẳng tôi sợ rằng nó đã cho kết quả thực sự xấu.

Nó thực sự nhanh hơn một chút và ổn định hơn nhiều để phục vụ sử dụng nginx->php->mongodb so với chỉ sử dụng nginx->redis với mô-đun.

+1

Bạn đã thiết lập một sự kiên định cho hồ bơi redis của bạn trong nginx?Thời gian qua tôi đã thử nghiệm này keepalive là một sự khác biệt giữa slover hơn php -> redis và nhanh hơn nhiều ... –

+0

Tôi không ngạc nhiên rằng PHP + MongoDb là nhanh hơn chỉ Redis trong tiêu chuẩn vì Redis là một quá trình duy nhất không có đa luồng nghĩa là nó xử lý tất cả các yêu cầu serially với một quá trình bất kể bạn có bao nhiêu lõi CPU. Vì vậy, trong khi nó là rất nhanh, nó là khá có thể là PHP + MongoDb là nhanh hơn với đồng thời cao vì họ có khả năng sử dụng đầy đủ tất cả các lõi CPU bằng cách giải quyết nhiều yêu cầu song song. Ngoài ra MongoDb chỉ là blazing nhanh. – ColinM

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