8

Tôi đang sử dụng gói npm express phiên bản 2.5.2 với phiên bản nút .0.6.5. Dường như tôi đang chạy phiên bản bash 4.1.5 trên Debian 4.4.5.Làm cách nào để chạy node.js Express ở chế độ sản xuất qua sudo?

Tôi đang cố chạy máy chủ ở chế độ sản xuất nhưng máy vẫn chạy trong chế độ phát triển.

tôi chạy các lệnh trong shell bash của tôi:

$ export NODE_ENV=production 
$ echo $NODE_ENV 
production 
$ sudo echo $NODE_ENV 
production 
$ sudo node bootstrap.js 

tôi có mã này bên bootstrap.js:

var bootstrap_app = module.exports = express.createServer(); 
//... 
console.log(bootstrap_app.settings.env); 

và đây là những gì tôi thấy in tiêu chuẩn ra:

development 

Đây có phải là vấn đề với việc sử dụng của tôi hoặc hệ thống của tôi không?

CHỈNH SỬA: Cảm ơn ThiefMaster đã xác định chính xác vấn đề này xuất phát từ nút đang chạy của tôi dưới dạng gốc. ThiefMaster đề nghị sử dụng iptables để chuyển tiếp từ cổng 80 đến một cổng không có đặc quyền, nhưng hệ thống của tôi đã cho tôi một lỗi. Chuyển cuộc thảo luận này sang superuser.com hoặc serverfault.com (liên kết để theo dõi)

+2

Hầu hết các biến môi trường không được đặt khi sử dụng sudo vì lý do bảo mật. Vì vậy, bạn không thể chuyển biến môi trường đó đến nút mà không sửa đổi tệp sudoers của bạn để cho phép biến đó chuyển qua. Tuy nhiên, bạn không nên chạy nút dưới dạng root. Nếu bạn chỉ cần nó cho cổng 80, hãy chạy nút trên một cổng không có đặc quyền và thiết lập một iptables về phía trước để ánh xạ cổng 80 đến cổng đó. – ThiefMaster

+0

Cảm ơn bạn đã đề xuất! Tôi đã chạy một trong các ứng dụng không phải cổng 80 và đã xác định chính xác môi trường là sản xuất! Bạn nên đăng câu trả lời này - Tôi sẽ chấp nhận nó. Cảm ơn bạn lần nữa! – Aaron

+0

Tôi vừa thử cài đặt và sử dụng iptables (iptables -t -nat L) và gặp lỗi "iptables v1.4.8: không thể khởi tạo bảng iptables' nat ': Quyền bị từ chối (bạn phải root) Có lẽ iptables hoặc hạt nhân của bạn cần được nâng cấp." Debian 4.4 là một phiên bản khá cũ, phải không?/Proc/phiên bản nói" Phiên bản Linux 3.1.9-vs2.3.2.5 " – Aaron

Trả lời

9

Hầu hết các biến môi trường không được đặt khi sử dụng sudo vì lý do bảo mật. Vì vậy, bạn không thể chuyển biến môi trường đó đến nút mà không sửa đổi tệp sudoers của bạn để cho phép biến đó chuyển qua.

Tuy nhiên, bạn không nên chạy nút dưới dạng gốc. Vì vậy, đây là một cách giải quyết tốt:
Nếu bạn chỉ cần nó cho cổng 80, chạy nút trên một cổng không có đặc quyền và thiết lập một iptables chuyển tiếp để ánh xạ cổng 80 đến cổng rằng:

iptables -A PREROUTING -d 1.2.3.4/32 -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 2.3.4.5:1234 

Thay 1.2.3.4 với công chúng của bạn IP, 2.3.4.5 với nút IP chạy trên (có thể là nút công khai hoặc 127.0.0.1) và 1234 với nút cổng chạy trên.


Với một hạt nhân đủ gần đây đã hỗ trợ khả năng bạn cũng có thể cấp node thực thi các đặc quyền CAP_NET_BIND_SERVICE bằng cách sử dụng lệnh sau đây như là người chủ:

setcap 'cap_net_bind_service=+ep' /usr/bin/node 

Lưu ý rằng điều này sẽ cho phép bất kỳ người dùng trên hệ thống của bạn để mở các cổng đặc quyền bằng nút!

+0

Tôi đã thử giải pháp đầu tiên, sử dụng iptables, và tôi Tôi đã đăng toàn bộ thông báo lỗi dưới dạng chỉnh sửa cho câu hỏi của tôi (để sử dụng định dạng mà nó cho phép) – Aaron

+2

Có lẽ tốt hơn nên hỏi về điều đó trên http : //superuser.com hoặc http://serverfault.com – ThiefMaster

+0

Tại sao không sử dụng 'authbind'? – configurator

2
sudo NODE_ENV=production /usr/local/bin/node /usr/local/apps/test/app.js 
Các vấn đề liên quan