2012-02-17 19 views
44

Tôi đang sử dụng một máy chủ để lưu trữ nhiều ứng dụng web Node.js, được phân phối trên nhiều tên miền. Thực hành hiện tại của tôi là chạy một máy chủ Express cho mỗi ứng dụng trên một cổng khác và chạy một máy chủ cơ sở chỉ đơn giản là định tuyến (chuyển hướng) các yêu cầu đến đúng máy chủ cổng/Express. Điều này có nghĩa là máy chủ cơ sở của tôi đang định tuyến mọi yêu cầu HTTP đơn lẻ (và bằng cách chuyển hướng thủ công nó) và người dùng của tôi thấy ứng dụng của tôi được lưu trữ tại [hostname.com]: 8000. Sau khi nghiên cứu một chút, tôi thấy rằng tôi có thể sử dụng http-proxy cho các nhu cầu định tuyến của mình, nhưng tôi vẫn muốn biết liệu có cách nào tốt nhất để chạy nhiều máy chủ Express trên cùng một hệ thống hay không. Đây là cách tôi dự định thực hiện:Tôi nên tổ chức nhiều máy chủ Express trên cùng một hệ thống như thế nào?

Mỗi ứng dụng web sẽ có thư mục riêng, với cấu trúc thư mục Express hoàn chỉnh (app.js, tuyến đường, chế độ xem, v.v.) Ứng dụng sẽ được nhóm theo miền, vì vậy cấu trúc ví dụ thư mục sẽ là:

hostname.com/ 
     app.js 
     routes/ 
     views/ 
     ... 
     app1/ 
      app1.js 
      routes/ 
      views/ 
      ... 
     app2 
     ... 
    hostname2.com/ 
     app.js 
     routes/ 
     views/ 
     ... 

tôi sẽ phải chạy mỗi app.js riêng với nút (hoặc với forever, mà tôi hiện đang sử dụng), và mỗi người sẽ phải sử dụng một cổng khác nhau trong nội bộ , với chuyển hướng giữa các ứng dụng được trỏ vào cổng của ứng dụng đích.

Vì vậy, đó là kế hoạch hiện tại của tôi. Có vấn đề gì với nó, và tôi nên cố tránh những cạm bẫy nào? Quan trọng nhất, là có giải pháp được thiết lập cho vấn đề này - vấn đề lưu trữ nhiều ứng dụng web trên cùng một hệ thống với Node.js/Express?

EDIT: Tôi có kế hoạch cuối cùng sử dụng WebSockets và HTTPS và số lượng băng thông mà thiết lập của tôi có thể hỗ trợ ít quan trọng đối với tôi - đây là máy chủ phát triển (ít nhất là bây giờ). Cảm ơn David Ellis đã đề cập đến vấn đề WebSockets.

EDIT SECOND: Nhờ cả EhevuTov và David Ellis cho câu trả lời của họ, cả hai đều giúp ích rất nhiều. Tôi vẫn đang giải quyết một cấu trúc tổng thể cho đơn đăng ký của mình và có vẻ như câu hỏi đó được giải quyết một cách chi tiết bằng cách this StackOverflow question

THIRD EDIT: Tôi đã đưa ra một số câu hỏi. đi). Hãy xem this file in my GitHub repository, thúc đẩy những gì tôi đã học được từ câu trả lời cho câu hỏi này!

Trả lời

35

Vì Express sử dụng Connect, tôi khá chắc chắn bạn có thể sử dụng phần mềm trung gian lưu trữ ảo của Connect. Nó hoạt động tương tự như các mô-đun vhost khác trên các sản phẩm khác. Tôi không có nhiều tên miền để kiểm tra và hiển thị cho bạn mã thích hợp, nhưng tôi nghĩ nó giống như thế này:

express.createServer() 
.use(express.vhost('hostname1.com', require('/path/to/hostname1').app) 
.use(express.vhost('hostname2.com', require('/path/to/hostname2').app) 
.listen(80) 

Nếu bạn đến điểm mà một máy chủ Express không đủ, hãy xem xét sử dụng nút.Cụm từ API. Nếu điều đó cũng không đủ, thì thực hành hiện tại là đặt một proxy ngược asnyc như Nginx trước máy chủ Express của bạn và trỏ proxy tới máy chủ Express của bạn.

+0

Cảm ơn nhận xét. Tôi đã bắt đầu sử dụng vhost (với sự giúp đỡ của một số người dùng IRC hữu ích trong #express), và nó hoạt động như một sự quyến rũ. Cũng cảm ơn cho những người đứng đầu lên khả năng di chuyển lên đến Node.Cluster. – Aaron

+2

@aaron Bạn rất hoan nghênh. Hẹn gặp bạn trên IRC, có thể – EhevuTov

+0

@Aaron Bạn có một số mã bạn có thể chia sẻ để chỉ cho chúng tôi cách bạn làm điều đó không? – Matt

6

Nếu bạn không cần sử dụng WebSockets (hoặc bất kỳ tính năng HTTP 1.1 nào, thực sự), you can use NginX as your proxy instead.

Lợi thế là tổng tải NginX có thể xử lý so với Node cao hơn (được biên dịch tĩnh và chuyên về loại điều này, về cơ bản), nhưng bạn mất khả năng truyền bất kỳ dữ liệu nào (gửi các đoạn nhỏ hơn tại một thời điểm). Đối với một trang web nhỏ hơn hoặc nếu bạn không chắc chắn về những tính năng bạn cần trong tương lai, có thể tốt hơn là nên gắn bó với node-http-proxy và chỉ chuyển sang NginX nếu bạn có thể chứng minh proxy là nút cổ chai trên máy chủ của mình. May mắn thay NginX không khó thiết lập nếu bạn cần nó sau này.

+0

Tôi dự định sẽ sử dụng WebSockets và HTTPS, và số lượng băng thông mà thiết lập của tôi có thể hỗ trợ không quan trọng đối với tôi - đây là máy chủ phát triển (ít nhất là bây giờ). Cảm ơn bạn đã đưa ra vấn đề về WebSockets. Tuy nhiên, câu hỏi của tôi là về việc tổ chức hệ thống của tôi một bước _after_ máy chủ proxy ngược - tôi nên thiết lập và tổ chức các máy chủ Express cho nhiều ứng dụng web của mình như thế nào? – Aaron

+0

Tôi muốn nói rằng Node.js đủ trẻ để không có mẫu * được thiết lập * cho nhiều ứng dụng Express trên cùng một máy chủ. Node.js chia sẻ nhiều điểm chung hơn với Tomcat/Getty và các máy chủ web dựa trên Java khác; một ứng dụng trên mỗi máy chủ, trong khi lưu trữ nhiều trang web theo truyền thống được thực hiện với một máy chủ web (Apache/NginX/Lighttpd/etc). Mỗi webapp của Node.js phải được cấu hình để không sử dụng cổng TCP được sử dụng bởi một ứng dụng web khác, do đó không có cách nào "kéo-thả-thả" để thiết lập nó. –

+2

Để thêm vào đó, vì một máy chủ HTTP Node.js có thể được thiết lập để nghe trên một cổng [chỉ cho một tên máy chủ cụ thể] (http://nodejs.org/docs/v0.6.10/api/http.html# server.listen), bạn * có thể * có toàn bộ điều được thiết lập thành một quá trình Node.js chạy đồng thời nhiều máy chủ Express. Tất nhiên điều này có ý nghĩa rất ít khi các máy chủ này không bao giờ chạm vào mã giữa các máy chủ khác và chi phí quá trình của Node.js chỉ là một vài megabyte, nhưng nó cũng là một "tùy chọn". –