Nginx works as a front end server, which in this case proxies the requests to a node.js server. Therefore you need to setup an nginx config file for node.
This is what I have done in my Ubuntu box:
Create the file yourdomain.com
at /etc/nginx/sites-available/
:
vim /etc/nginx/sites-available/yourdomain.com
In it you should have something like:
# the IP(s) on which your node server is running. I chose port 3000.
upstream app_yourdomain {
server 127.0.0.1:3000;
keepalive 8;
}
# the nginx server instance
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
access_log /var/log/nginx/yourdomain.com.log;
# pass the request to the node.js server with the correct headers
# and much more can be added, see nginx config options
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://app_yourdomain/;
proxy_redirect off;
}
}
If you want nginx (>= 1.3.13) to handle websocket requests as well, add the following lines in the location /
section:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Once you have this setup you must enable the site defined in the config file above:
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com
Create your node server app at /var/www/yourdomain/app.js
and run it at localhost:3000
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');
Test for syntax mistakes:
nginx -t
Restart nginx:
sudo /etc/init.d/nginx restart
Lastly start the node server:
cd /var/www/yourdomain/ && node app.js
Now you should see "Hello World" at yourdomain.com
One last note with regards to starting the node server: you should use some kind of monitoring system for the node daemon. There is an awesome tutorial on node with upstart and monit.
Best Answer
The gist
In Node.js,
__dirname
is always the directory in which the currently executing script resides (see this). So if you typed__dirname
into/d1/d2/myscript.js
, the value would be/d1/d2
.By contrast,
.
gives you the directory from which you ran thenode
command in your terminal window (i.e. your working directory) when you use libraries likepath
andfs
. Technically, it starts out as your working directory but can be changed usingprocess.chdir()
.The exception is when you use
.
withrequire()
. The path insiderequire
is always relative to the file containing the call torequire
.For example...
Let's say your directory structure is
and
pathtest.js
containsand you do
you get
Your working directory is
/dir1/dir2
so that's what.
resolves to. Sincepathtest.js
is located in/dir1/dir2
that's what__dirname
resolves to as well.However, if you run the script from
/dir1
you get
In that case, your working directory was
/dir1
so that's what.
resolved to, but__dirname
still resolves to/dir1/dir2
.Using
.
insiderequire
...If inside
dir2/pathtest.js
you have arequire
call into include a file insidedir1
you would always dobecause the path inside
require
is always relative to the file in which you are calling it. It has nothing to do with your working directory.