Nginx subdomain configuration

I have nginx acting as a reverse proxy to apache. I now need to add a new subdomain that will serve files from another directory, but at the same time I want all location and proxy_pass directives that I have for the default host to apply to the subdomain also.

I know that if I copy the rules from the default host to the new subdomain it will work, but is there a way for the subdomain to inherit the rules? Below is a sample configuration

server {
listen       80;
server_name  www.somesite.com;
access_log  logs/access.log;
error_log  logs/error.log error;




location /mvc {
proxy_pass  http://localhost:8080/mvc;
}




location /assets {
alias   /var/www/html/assets;
expires     max;
}


... a lot more locations
}


server {
listen       80;
server_name  subdomain.somesite.com;


location / {
root   /var/www/some_dir;
index  index.html index.htm;
}
}

Thanks

124777 次浏览

You could move the common parts to another configuration file and include from both server contexts. This should work:

server {
listen 80;
server_name server1.example;
...
include /etc/nginx/include.d/your-common-stuff.conf;
}


server {
listen 80;
server_name another-one.example;
...
include /etc/nginx/include.d/your-common-stuff.conf;
}

Edit: Here's an example that's actually copied from my running server. I configure my basic server settings in /etc/nginx/sites-enabled (normal stuff for nginx on Ubuntu/Debian). For example, my main server bunkus.org's configuration file is /etc/nginx/sites-enabled and it looks like this:

server {
listen   80 default_server;
listen   [2a01:4f8:120:3105::101:1]:80 default_server;


include /etc/nginx/include.d/all-common;
include /etc/nginx/include.d/bunkus.org-common;
include /etc/nginx/include.d/bunkus.org-80;
}


server {
listen   443 default_server;
listen   [2a01:4f8:120:3105::101:1]:443 default_server;


include /etc/nginx/include.d/all-common;
include /etc/nginx/include.d/ssl-common;
include /etc/nginx/include.d/bunkus.org-common;
include /etc/nginx/include.d/bunkus.org-443;
}

As an example here's the /etc/nginx/include.d/all-common file that's included from both server contexts:

index index.html index.htm index.php .dirindex.php;
try_files $uri $uri/ =404;


location ~ /\.ht {
deny all;
}


location = /favicon.ico {
log_not_found off;
access_log off;
}


location ~ /(README|ChangeLog)$ {
types { }
default_type text/plain;
}