Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I run node.js Express in production mode via sudo?

I'm using the npm package express version 2.5.2 with node version .0.6.5. I appear to be running bash version 4.1.5 on Debian 4.4.5.

I'm trying to run my server in production mode but it still runs in development mode.

I run these commands in my bash shell:

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

I have this code inside bootstrap.js:

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

and here's what I see printed to standard out:

development

Is this a problem with my usage, or my system?

EDIT: Thanks to ThiefMaster for his properly identifying that this issue stems from my running node as root. ThiefMaster suggested using iptables to forward from port 80 to an unprivileged port, but my system gives me an error. Moving this discussion to superuser.com or serverfault.com (link to follow)

like image 277
Aaron Avatar asked Feb 22 '12 14:02

Aaron


2 Answers

Most environment variables are unset when using sudo for security reasons. So you cannot pass that environment variable to node without modifying your sudoers file to allow that variable to passt through.

However, you shouldn't run node as root anyway. So here's a good workaround:
If you just need it for port 80, run node on an unprivileged port and setup an iptables forward to map port 80 to that port:

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

Replace 1.2.3.4 with your public IP, 2.3.4.5 with the IP node runs on (could be the public one or 127.0.0.1) and 1234 with the port node runs on.


With a sufficiently recent kernel that has capability support you could also grant the node executable the CAP_NET_BIND_SERVICE privilege using the following command as root:

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

Note that this will allow any user on your system to open privileged ports using node!

like image 177
ThiefMaster Avatar answered Sep 30 '22 11:09

ThiefMaster


sudo NODE_ENV=production /usr/local/bin/node  /usr/local/apps/test/app.js
like image 25
Eugene M. Avatar answered Sep 30 '22 12:09

Eugene M.