2013-08-20 84 views
6

Tôi đang phát triển một ứng dụng (RoR + Heroku) cho phép người dùng tạo trang web của riêng họ bằng cách sử dụng tên miền phụ của tôi (pagename.myapp.com) hoặc sử dụng tên miền riêng của họ (pagename.com). Điểm quan trọng của việc này là tùy chọn này là chìa khóa của doanh nghiệp của tôi: tên miền phụ là các gói miễn phí và miền tùy chỉnh là các tên miền trả phí. Vì vậy, tôi có một bảng nơi tôi lưu trữ tên miền tùy chỉnh của từng người dùng và kiểm tra xem trang này có đang hoạt động hay không (đã tồn tại và đã thanh toán hạn ngạch).Miền tùy chỉnh cho ứng dụng web nhiều người thuê

Vì vậy, tôi cần cung cấp cho người dùng khả năng trỏ tên miền của họ đến máy chủ của tôi. Tất cả chúng ta biết rằng Heroku không khuyên bạn nên sử dụng DNS A-Records.

Ngoài ra tôi muốn tóm tắt càng nhiều càng tốt tính năng này để có thể chuyển đổi cơ sở hạ tầng của tôi (Heroku sang AWS) trong tương lai mà không cần phải yêu cầu tất cả người dùng thay đổi Vùng DNS của họ. Tính đến điều này, tôi nghĩ rằng tùy chọn tốt nhất sẽ chạy một cái gì đó giống như một proxy EC2 (sử dụng IP đàn hồi AWS) mà cho tôi quyền sở hữu của IP này. Proxy này tôi nghĩ rằng nên chuyển hướng đến proxy.myapp.com, và tôi sẽ giải quyết yêu cầu ở cấp ứng dụng.

Do tôi không tìm thấy thông tin rõ ràng về điều đó, tôi không chắc liệu giả thuyết này là giải pháp tốt nhất và cách thiết lập proxy (loại proxy nào? Nginx có thể?).

Nói rằng, tôi muốn hỏi các khuyến nghị/phương pháp hay nhất để giải quyết tính năng "phổ biến" này.

Cảm ơn

Trả lời

3

Những gì bạn muốn làm là khá thẳng về phía trước để triển khai. Giả định của bạn là chính xác về việc thiết lập proxy. Nginx hoặc haproxy cả hai sẽ làm việc tuyệt vời cho điều này (cá nhân tôi sẽ sử dụng haproxy). Dưới đây là một số trong những gotchas rằng bạn sẽ chạy vào mặc dù:

  1. Thay đổi tiêu đề máy chủ tại một máy chủ proxy có thể gây ra các ứng dụng web cuối để tạo ra các liên kết không chính xác. Bạn có thể sử dụng đường dẫn tương đối để sửa lỗi này, nhưng nó đòi hỏi rằng các nhà phát triển ứng dụng web phải nhận thức được môi trường mà họ đang chạy trong.

    1. người dùng kết nối đến www.example.com (proxy server)
    2. máy chủ proxy kết nối với www.realdomain.com (ứng dụng web)
    3. ứng dụng web có liên kết cho giỏ hàng. www.realdomain.com/shoppingcart
    4. cuối người dùng nhấp vào liên kết nhưng liên kết được www.realdomain.com/shoppingcart thay vì www.example.com/shoppingcart
  2. Chi phí của các diễn viên chủ như máy chủ proxy. Điều này có thể vượt khỏi tầm kiểm soát thực sự nhanh chóng. Ví dụ, bạn có muốn dự phòng không, nếu vậy bạn dự định thực hiện điều đó như thế nào? Bạn có kế hoạch có chấm dứt ssl? Nếu vậy bạn sẽ phải tăng số lượng CPU để phù hợp với tải bổ sung. Bạn có muốn kết nối an toàn với heroku từ proxy của bạn không? Nếu bạn làm như vậy bạn sẽ cần phải tăng số lượng CPU cho điều đó là tốt. Bạn có thể phải thêm ram bổ sung cũng tùy thuộc vào số lượng kết nối đồng thời.

  3. Heroku cũng thay đổi cân bằng tải thường xuyên. Điều này quan trọng bởi vì dịch vụ proxy của bạn sẽ cần phải tải lại cấu hình/cập nhật địa chỉ ip của các trường hợp heroku sau mỗi 60 giây. Theo kinh nghiệm của tôi, họ có thể thay đổi một hoặc hai lần một ngày, nhưng mục DNS mà họ sử dụng có TTL thứ hai 60 giây. Điều đó có nghĩa là bạn nên đảm bảo rằng bạn có khả năng cập nhật cấu hình của mình tối đa 60 giây một lần.

Công ty của tôi đã làm điều gì đó rất giống với điều này trong gần một năm nay. Chúng tôi sử dụng haproxy và chỉ đơn giản là có nó tải lại cấu hình thường xuyên. Chúng tôi chưa bao giờ bị gián đoạn hoặc gián đoạn đối với người dùng cuối của mình. Nginx cũng là một sản phẩm rất tốt. Nó đã được xây dựng trong bộ nhớ đệm DNS vì vậy nếu bạn đi tuyến đường đó, bạn sẽ cần phải chắc chắn rằng bạn cấu hình nó một cách chính xác để các bộ nhớ cache DNS TTL là 60 giây.

0

Nhiều khách hàng của bạn có muốn sử dụng ứng dụng của bạn trên đỉnh miền của họ không? Ví dụ. example.com thay vì theapp.example.cpm? Nếu không, tôi khuyên bạn nên cho họ CNAME vào proxy.myapp.com mà CNAME gửi tới myapp.herokuapp.com. Sau đó, bạn có thể cập nhật proxy.myapp.com mà không bị gián đoạn của khách hàng.

Nếu bạn cần hỗ trợ kỷ lục hoặc bản ghi A, bạn sẽ muốn thiết lập Nginx làm proxy ngược cho ứng dụng Heroku của bạn. Hãy nhớ rằng nếu bạn cần hỗ trợ HTTPS cho miền của khách hàng, bạn sẽ cần thực hiện một số loại quản lý chứng chỉ trên proxy của mình.

+0

Trong heroku, CNAME không hoạt động. Họ căn cứ định tuyến của họ ra khỏi máy chủ ảo. Họ cho phép bạn sử dụng tên DNS của riêng bạn, nhưng đó là những gì OP đang hỏi. Để sử dụng tên DNS của riêng bạn, họ tính phí thêm. – dtorgo