2013-08-06 69 views
7

Tôi có một webapp nơi tôi cho phép mọi người tạo các trang con trên máy chủ ứng dụng của tôi (ví dụ: mysite.com/their-site). Tôi muốn họ có thể trỏ miền của họ đến trang phụ trên ứng dụng của tôi. Tương tự như cách bạn đính kèm tên miền vào máy chủ lưu trữ được chia sẻ.Nodejs: muốn ánh xạ miền tới máy chủ

Tôi không thực sự chắc chắn cách thực hiện việc này. Sẽ đánh giá cao nếu ai đó có thể khai sáng cho tôi.

+0

Bạn có đang chỉ các mã này ở các phiên bản Node.js khác nhau không? Hoặc tất cả cùng một ứng dụng? – Brad

+0

Những gì bạn đề cập trong ví dụ là khó hiểu: 'mysite.com/trang web của họ 'sẽ không nằm trên một tên miền riêng biệt, nó là một tuyến đường khác. Bạn thường có tên miền như 'domain.com' và tên miền phụ như' mail.domain.com'. Bạn có muốn chuyển hướng các yêu cầu đó hoặc xử lý chúng không? – user568109

+0

@ user568109 Xin lỗi vì sự nhầm lẫn. mysite.com/their-site sẽ là trang của họ trên ứng dụng của tôi. Họ có thể có họ sở hữu tên miền đăng ký ở nơi khác mà tôi muốn các tùy chọn cho họ để bản đồ đến trang của họ trên trang web của tôi. –

Trả lời

5

Nếu bạn sử dụng một cái gì đó như node http-proxy hoặc nginx bạn có thể chạy từng trang web riêng biệt trên các cổng địa phương khác nhau và sau đó ánh xạ tên miền. Tôi sử dụng proxy http nhưng những người khác yêu nginx.

Để làm việc đó, bạn sẽ cần phải thêm các mục DNS giải quyết vào địa chỉ IP mà proxy ngược của bạn đang chạy. Sau đó, ví dụ, yêu cầu cổng 80 sẽ được ánh xạ trở lại localhost: 3000.

Điều này cho phép mỗi ứng dụng chạy riêng biệt và trong các quy trình riêng biệt từ các trang web khác. Họ không thể va chạm nhau. Bạn cũng không có vấn đề về không gian tên trong đó cả hai ứng dụng đều yêu cầu cùng một đường dẫn.

app.js của tôi cho proxy http trông như thế này:

var proxyPort = 80; 
var http = require('http'); 
var httpProxy = require('http-proxy'); 

var options = { 
    router: { 
     'localhost': '127.0.0.1:3000', 
     'somesite.com': '127.0.0.1:3000', 
     'othersite.com': '127.0.0.1:4000' 
    } 
}; 
console.log('Proxy Routing:') 
console.log(options);var options = { 
console.log(); 

var proxyServer = httpProxy.createServer(options); 
proxyServer.listen(proxyPort); 
console.log('Proxy listening on port ' + proxyPort); 

Bạn cũng có thể lộ trình với các đường dẫn. Thấy điều này: https://github.com/nodejitsu/node-http-proxy/issues/232

Vì vậy, giống như yêu cầu ban đầu của bạn, bạn có thể làm:

router: { 
    'myhost.com/appA': '127.0.0.1:8080', 
    'myhost.com/appB': '127.0.0.1:9090/appB', 
    'myhost.com/appC': '127.0.0.1:9090/appC' 
    } 
}; 

lựa chọn khác là chỉ đơn giản là cung cấp một con đường/trang cho mỗi khách hàng và sau đó nó chỉ đơn giản là một vấn đề DNS. Bạn sẽ thiết lập DNS sao cho tất cả các tên miền đều giải quyết được một địa chỉ IP mà ứng dụng của bạn chạy. Điều đó có một số nhược điểm:

  1. domain1.com/user1 và domain2.com/user2 sẽ hoạt động mà bạn có thể không muốn.
  2. Bạn có kiểm soát được tất cả mã hoặc mã cung cấp không? Nếu đó là mã do người dùng cung cấp thì bạn muốn một số cách ly do đó, do đó các ứng dụng riêng biệt.
  3. Bạn vẫn có thể cần một proxy http để chạy trên cổng 80 trong linux và không chạy dưới dạng sudo.
+0

Trong trường hợp của tôi, tôi nghĩ rằng tôi đang thiết lập một tên miền cho một tuyến đường. Vì vậy, một cái gì đó như thế này làm việc ra: 'user1domain.com': '127.0.0.1:9090/user1page'? –

+0

Ngoài ra đây sẽ là phương pháp ưa thích nếu tôi dự định có hơn 100 miền được ánh xạ tới ứng dụng này? –

+0

Có, điều đó sẽ hoạt động tốt. 100+ sẽ không là vấn đề - tất nhiên là tất cả phụ thuộc vào tải trọng của từng yêu cầu về miền và tài nguyên. Điều tốt đẹp là định tuyến cũng có nghĩa là bạn có thể mở rộng ra nhiều hộp nếu cần. – bryanmac

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