2012-01-24 39 views
12

Giả sử chúng tôi có một số nút giống nhau là các máy chủ ứng dụng của một số dịch vụ n-tier. Và giả sử chúng ta sử dụng Apache ZooKeeper để giữ tất cả các cấu hình của ứng dụng phân tán của chúng ta. Thêm vào đó, chúng tôi có một nginx như là một cân bằng tải và proxy ngược ở phía trước của ứng dụng này.Có cách nào để cấu hình nginx (hoặc proxy ngược nhanh khác) tự động không?

Vì vậy, giả sử chúng ta thực hiện lệnh chỉ thay đổi dữ liệu trên nút1 và trong một khoảng thời gian nào đó nút2 khác với nút1. Và chúng tôi muốn proxy chuyển hướng tất cả các yêu cầu đặc biệt (cần dữ liệu cụ thể đó) đến node1 cho đến khi tất cả thông tin đã di chuyển đến node2 và node2 có cùng dữ liệu với nút1.

Có cách nào để nginx (hoặc proxy khác) đọc cấu hình của nó từ Apache ZooKeeper không? Hoặc rộng hơn: có cách nào để chuyển đổi cấu hình proxy hiệu quả khi đang bay không? Và tất nhiên nó nên được thực hiện mà không có (hoặc với tối thiểu) thời gian chết của toàn bộ hệ thống - vì vậy khởi động lại nginx không phải là tùy chọn.

+0

cho đến khi thông tin di cư đầy đủ để một nút cho trước bạn có thể trở lại một mã 5xx từ nút đó? – Anatoly

Trả lời

34

Nginx có hai phương pháp thay đổi cấu hình:

  • HUP tín hiệu để kết quả quá trình thạc sĩ trong "tải lại". Nginx bắt đầu một loạt các công nhân mới và cho phép các công nhân cũ tắt máy một cách duyên dáng, tức là họ hoàn thành các yêu cầu hiện tại. Có không gián đoạn dịch vụ. Phương pháp thay đổi cấu hình này rất nhẹ và nhanh, nhưng có một số hạn chế: bạn không thể thay đổi vùng đệm hoặc biên dịch lại các tập lệnh Perl.

  • USR2 tín hiệu, sau đó WINCH và kết quả quá trình chính "nâng cấp thực thi" và chuỗi này cho phép đọc lại toàn bộ cấu hình và thậm chí nâng cấp tệp thực thi Nginx. Nó cũng tải lại cache đĩa (có thể tốn thời gian). Phương pháp này dẫn đến việc không bị gián đoạn dịch vụ.

Official documentation

+1

Cảm ơn bạn! Tôi không phải là chuyên gia về nginx, bạn đã cho tôi một thông tin tốt để suy nghĩ. – Dima

+1

đây phải là câu trả lời chính thức –

0

Không chắc chắn rằng có thể thay đổi cấu hình nginx mà không cần khởi động lại máy chủ.

Nếu tôi có yêu cầu tương tự, tôi có thể sẽ tham gia tích hợp nodejszookeeper.

Có một số dự án mã nguồn mở thú vị:

node-zookeeper tích hợp nodejs với zookeeper;

node-http-proxy máy chủ proxy http có thể được sử dụng để cân bằng tải.

Tất nhiên họ thiếu sự trưởng thành nhưng chúng có thể thú vị đối với bạn.

+0

Thanx! Ý tưởng rất thú vị, tôi sẽ kiểm tra nó. – Dima

+2

Nó có thể: 'nginx reload' – nilskp

+0

Chỉ thị httpd' RewriteMap' bằng cách sử dụng cơ sở dữ liệu/ánh xạ tệp – Sebastian

2

Như một bản cập nhật: Hipache cửa hàng cấu hình máy chủ của nó trong redis, mà có thể dễ dàng được thao tác khi chạy. Nó cũng dựa trên node.js và node-http-proxy.

1

Có một dự án thú vị sử dụng nginx Lua cho phép cấu hình năng động của nginx và làm chính xác những gì bạn muốn (https://github.com/samalba/hipache-nginx)

Nó được viết bởi những kẻ đằng sau Hipache.

1

Điều này có thể bị trễ nhưng nếu bạn có tiền. Nginx plus is exactly for you. Nó sử dụng cuộc gọi url đơn giản để nhận cấu hình mới khi đang di chuyển.

+1

Đó là $ 1900 mỗi năm cho một trường hợp duy nhất. – Miscreant

2

Có thể sử dụng HAProxy và giao diện ổ cắm miền UNIX của nó: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#9.2.

Nó hỗ trợ chuyển đổi máy chủ hoặc toàn bộ giao diện người dùng từ trên xuống và ngược lại khi đang di chuyển. Với một tệp cấu hình định nghĩa hai bộ front-end, mỗi bộ cấu hình cho một trạng thái cụ thể, bạn sẽ có thể đạt được những gì bạn muốn.

4

Vui lòng thử Nginx-Clojure. Chúng tôi có thể sử dụng trình xử lý ghi đè clojure/java/groovy để truy cập trình quản lý vườn thú rồi cập nhật một số biến nginx để tự động thay đổi mục tiêu proxy. ví dụ.

Trong nginx.conf

set $mytarget ""; 

location/{ 
    rewrite_handler_type java; 
    ## We will change $mytarget in MyRewriteHandler 
    rewrite_handler_name my.MyRewriteHandler; 
    proxy_pass $mytarget; 
} 

Trong MyRewriteHandler.java

public static class MyRewriteHandler implements NginxJavaRingHandler { 

     @Override 
     public Object[] invoke(Map<String, Object> request) { 
      //access zookeeper 
      ............... 
      //change nginx variable mytarget 
      ((NginxJavaRequest)request).setVaraible("mytarget", "http://some-host-or-url"); 
     } 
Các vấn đề liên quan