2012-04-23 25 views
5

Tôi duy trì một ứng dụng web đang phát triển một VPS duy nhất. Kiến trúc bao gồm một số lượng lớn người dùng nhỏ, mỗi người dùng có tên miền phụ riêng của họ. Người dùng không tương tác. Tải có nghĩa là tôi phải di chuyển một số người dùng và tất cả người dùng mới, sang một cài đặt khác của ứng dụng web trên một máy chủ riêng biệt.Chia tỷ lệ ngang: định tuyến các tên miền phụ do người dùng tạo giữa các máy chủ

Hiện tại, mọi miền phụ của người dùng đều rơi vào cùng một máy chủ ảo, trong đó một bộ điều khiển phía trước PHP hiển thị nội dung phù hợp dựa trên tên máy chủ. Một bản ghi DNS ký tự đại diện duy nhất cho các điểm * .mydomain.com đến máy chủ hiện tại.

Tùy chọn tốt nhất để định tuyến tên miền phụ của người dùng khác nhau cho các máy chủ khác nhau là gì?

những suy nghĩ của tôi:

  • Một miền cấp cao mới cho mỗi máy chủ. user.s1.mydomain.com, user.s2.mydomain.com và vv (thông tin không thích hợp và rò rỉ)
  • Chạy máy chủ DNS của riêng tôi để định tuyến người dùng giữa các máy chủ (thêm điểm thất bại, công nghệ không quen)
  • A bộ điều khiển/cân bằng phía trước trung tâm có thể đảo ngược mọi yêu cầu tới máy chủ thích hợp (thêm điểm không thành công, các kết nối có khả năng giới hạn)
+1

Nội dung do người dùng tạo cho mỗi tên miền phụ đều có trong cơ sở dữ liệu hay họ tải dữ liệu của riêng họ lên hệ thống tệp trên máy chủ? – drew010

+0

@ drew010 Nội dung người dùng được lưu trữ cả trong cơ sở dữ liệu và trên hệ thống tệp. Vì người dùng không tương tác, tôi có thể tự do thiết lập nhiều cá thể cơ sở dữ liệu ... vấn đề chỉ là truy vấn trang định tuyến. Tôi cho rằng việc tách các máy chủ web db + sẽ là một cách khác để mở rộng quy mô, nhưng cuối cùng tôi sẽ phải chia máy chủ web và cần một giải pháp – mappu

+1

Đó là những gì tôi đã tìm. Tôi đang hướng về DNS nhưng điều đó có nghĩa là bạn sẽ cần một bản ghi A cho mỗi tên miền phụ hoặc một giải pháp DNS tùy chỉnh có thể truy vấn ứng dụng của bạn để xác định địa chỉ IP nào sẽ sử dụng cho tên miền phụ đã cho.Bạn có thể có kết quả tốt hơn yêu cầu này trên ServerFault bây giờ mà tôi nghĩ về nó. – drew010

Trả lời

4

Tại thời điểm đó, tôi sẽ đi đến trung tâm cân bằng tải trước. Nginx sẽ xử lý bất kỳ tải nào đang được phục vụ động bởi một máy chủ duy nhất. Chúng tôi có nginx như một giao diện người dùng cho sáu máy chủ động và một máy chủ nội dung tĩnh và không có nút cổ chai nào trong tầm nhìn trên nginx.

Tại điểm quy mô của bạn, hãy thiết lập nginx để xử lý tất cả nội dung tĩnh và đảo ngược nội dung động proxy tới nhiều hộp nếu cần. Các thiết lập cho qua Proxy đơn giản gần:

upstream upstream_regular_backend { 
    fair; 
    server 10.0.0.1:80; 
    server 10.0.0.2:80; 
} 

server { 
    listen 0.0.0.0:80; 
    server_name example.com; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    location/{ 
     proxy_pass http://upstream_regular_backend; 
    } 
} 

Đối với phục vụ nội dung tĩnh và đi lại tất cả các phần còn lại, một cái gì đó như:

server { 
    listen 0.0.0.0:80; 
    server_name example.com; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    index index.php; 
    root /some/dir/: 
    location ~ \.php { 
     proxy_pass http://upstream_regular_backend; 
    } 
} 

Đương nhiên, nếu bạn không sử dụng PHP, tinh chỉnh cấu hình cho phù hợp.

Trên định nghĩa ngược dòng, "công bằng"; sẽ phụ trợ cân bằng tải dựa trên thời gian phản hồi. Đối với các động cơ lưu trong bộ nhớ đệm, bạn có thể muốn sử dụng "ip_hash;" thay vào đó, vì nó sẽ đáp ứng các yêu cầu từ một khách hàng luôn trên cùng một máy chủ.

Thiết lập của chúng tôi hơi xa hơn một chút trên đường. Chúng tôi có bộ cân bằng tải nginx ủy quyền cho bộ nhớ cache véc ni, lần lượt ủy quyền cho các máy chủ nội dung động.

Nếu bạn lo lắng về nginx là một điểm lỗi, hãy thiết lập máy chủ phụ sẵn sàng giả sử IP của giao diện người dùng trong trường hợp không thành công.

+0

Cảm ơn bạn đã phản hồi - dường như được đảm bảo hoạt động tốt miễn là nginx có thể rảnh rỗi cho các kết nối mở và ip_hash (phần ghép còn thiếu) tiết kiệm cho tôi từ việc rearchitecting ứng dụng để không quan tâm đến máy chủ mà mỗi yêu cầu đến. Bạn có cân bằng tải nginx chấm dứt SSL không? – mappu

+0

Chúng tôi chấm dứt SSL trên nginx, mặc dù không phải trên thiết lập mà tôi đã mô tả. –

+0

Về giới hạn kết nối, từ những gì tôi nhớ, giới hạn duy nhất chúng tôi nhấn là số lượng các mô tả tệp mở. Sửa đổi nginx init.d và nó tăng ulimit -n lên bao nhiêu khi cần thiết. Khác hơn thế, lưu lượng định tuyến nginx có hiệu quả tuyệt vời. –

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