nginx is a web server used by many web sites, you can follow the link for further information. In this post, I'll briefly talk about how to serve two sites from the same port.

Why?

Prices, of course. I had two small websites to serve, which can fit into a small setup easily, why open to separate servers for that?. After setting up two separate websites, I saw the exception Address already in use because two applications cannot bind to the same port. For the sake of a clean blog URL, I didn't want to use arbitrary ports like mtyurt.net:2222.

Prerequisites

I assume you have basic knowledge of nginx, have a server already set up, have two different web servers up and running. If you don't have a server and want to serve just static files, that's even easier, just copy the static files to a location on the server.

nginx configuration

The nginx configuration files rests under /etc/nginx directory. The main configuration file is /etc/nginx/nginx.conf (at least there is in Ubuntu). Please check the nginx.conf file has following line as the last line in http block:

http {
    #other config
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
    #...

    #include other sites
    include /etc/nginx/sites-enabled/*;
}

Because we'll add new configuration files under /etc/nginx/sites-available/ directory and create a symbolic link to them in /etc/nginx/sites-enabled/(best practice, you can enable/disable websites by deleting the link, not the configuration file itself).

First server

Here we go: the first server is actually a web server, so this configuration creates a reverse proxy which proxies requests incoming into 80 to localhost:2222. Of course, it assumes the running server listens to port 2222. The content of /etc/nginx/sites-available/ghost is:

server {
    listen 80;
    server_name mtyurt.net; # Replace with your domain

    root /usr/share/nginx/html;
    index index.html index.htm;

    location / {
        proxy_pass http://localhost:2222;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }
}

Ghost is the platform by blog is based on, hence the name of the file is ghost. Then, I ran following command to create the symbolic link:

sudo ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

The site should be ready - remember, you should reload nginx for changes to show effect. As a result, requests to mtyurt.net should be proxied to locahost:2222.

Second server

The second server is a WordPress blog. It uses fastcgi_pass to pass requests to php server. Here is the content of /etc/nginx/sites-available/otherblog:

server {
	listen 80;
	server_name otherblog.com; #Change it!

	root /var/www/otherblog;
	index index.php index.html index.htm;

	location / {
		try_files $uri $uri/ /index.php?q=$uri&$args;
	}

	error_page 404 /404.html;
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root /usr/share/nginx/html;
	}

	location ~ \.php$ {
		try_files $uri =404;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}
}

Similar to previous configuration file, I have created a symbolic link:

sudo ln -s /etc/nginx/sites-available/otherblog /etc/nginx/sites-enabled/otherblog
Conclusion

Voilà! We have two websites served on port 80. Do not forget to reload nginx before refreshing your page.