2011-10-28 8 views
32

tôi tạo ra và khởi động một ứng dụng như thế này:Node.js + Express: Ứng dụng sẽ không bắt đầu lắng nghe trên cổng 80

express -s -t ejs 
npm install express 
npm install ejs 
node app.js 

và nó hoạt động (trên cổng 3000). Nhưng khi tôi đi và thay đổi cổng đến 80, sau đó chạy node app.js đầu ra này:

node.js:198 
throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot call method 'getsockname' of null 
at HTTPServer.address (net.js:746:23) 
at Object.<anonymous> (/var/www/thorous/app.js:35:67) 
at Module._compile (module.js:432:26) 
at Object..js (module.js:450:10) 
at Module.load (module.js:351:31) 
at Function._load (module.js:310:12) 
at Array.<anonymous> (module.js:470:10) 
at EventEmitter._tickCallback (node.js:190:26) 

này hoạt động quá trên máy tính xách tay của tôi, nhưng không phải trên dụ Amazon EC2 của tôi, nơi cổng 80 đang mở. Có thể tìm ra điều gì sai. Có lời khuyên nào không?

+0

Đó là một thông báo lỗi khủng khiếp. –

Trả lời

57

Bạn đang bắt đầu ứng dụng của bạn như là người chủ? Bởi vì số cổng thấp hơn yêu cầu quyền root. Có thể một ứng dụng sudo node app.js hoạt động?

NHƯNG, bạn KHÔNG nên chạy bất kỳ ứng dụng node.js nào trên cổng 80 với các đặc quyền root! KHÔNG BAO GIỜ!

Đề xuất của tôi là chạy nginx ở phía trước dưới dạng proxy ngược lại cho ứng dụng node.js của bạn đang chạy trên cổng, ví dụ: 3000

+0

Điều đó đã hiệu quả! Cảm ơn các mẹo bảo mật. – Vitaly

+7

Bạn có thể giải thích tại sao không chạy ứng dụng node.js làm gốc trên cổng 80 không? Im tò mò (một người mới js dev). – Christopher

+9

Điều này không áp dụng cho nút chỉ. Không nên chạy bất kỳ phần mềm máy chủ nào dưới dạng root. Nếu bạn phải, bởi vì bạn muốn sử dụng một cổng đặc quyền, quá trình này sẽ loại bỏ các đặc quyền và "chuyển tiếp" tất cả lưu lượng gửi đến trên cổng đó đến tiến trình tương ứng đang chạy trên một người dùng ít được hỗ trợ. Điều này là do không có chương trình nào là hoàn hảo. Mọi phần mềm đều có lỗi và có thể là vấn đề bảo mật. Nếu kẻ tấn công có thể sử dụng các lỗi và mã tiêm như vậy - điều này được thực hiện khi người dùng đang chạy quá trình này. Vì vậy, nếu quá trình của bạn chạy như root, kẻ tấn công có thể làm bất cứ điều gì trên máy tính của bạn. –

0

Có lẽ có điều gì khác đang chạy trên cổng 80 trước đó?

Có thể thực hiện quét cổng và xác nhận rằng nó chưa được sử dụng?

nc -z <<your IP>> 80 

Kindness,

Dan

+0

Tôi không thể nghĩ ra bất cứ điều gì. Đó là một phiên bản hoàn toàn mới với một bản sao của máy chủ cài đặt node.js và máy chủ mongodb đang chạy. nc không trả lại gì cả. – Vitaly

66

Nếu bạn thực sự muốn làm điều này bạn có thể chuyển tiếp lưu lượng trên cổng 80 đến 3000.

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000 
+0

điều này thật tuyệt! tôi đã có thể khắc phục vấn đề! –

+1

câu trả lời tốt và sạch sẽ không có nginx hoặc giải pháp proxy khác! – hazelnut

+0

Hãy cẩn thận khi sử dụng lệnh này. Nếu bạn đã đăng nhập với tư cách là người chủ trong máy chủ, điều này sẽ chuyển tiếp lưu lượng truy cập trên tất cả các tên miền của bạn đến cổng 3000. –