Конфігурація субдомену Nginx


79

У мене nginx виступає як зворотний проксі для apache. Тепер мені потрібно додати новий субдомен, який буде обслуговувати файли з іншого каталогу, але в той же час я хочу, щоб усі директиви location і proxy_pass, які я маю для хоста за замовчуванням, також застосовувались до субдомену.

Я знаю, що якщо я скопіюю правила із хосту за замовчуванням на новий субдомен, це буде працювати, але чи існує спосіб для субдомену успадкувати правила? Нижче наведено зразок конфігурації

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;
        }
}

Дякую

Відповіді:


92

Ви можете перемістити загальні частини в інший файл конфігурації та includeз обох контекстів сервера. Це має спрацювати:

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;
}

Редагувати: Ось приклад, який насправді скопійовано з мого запущеного сервера. Я налаштовую свої основні налаштування сервера у /etc/nginx/sites-enabled(звичайні матеріали для nginx на Ubuntu / Debian). Наприклад, bunkus.orgфайл конфігурації мого основного сервера такий, /etc/nginx/sites-enabledі він виглядає так:

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;
}

Як приклад, ось /etc/nginx/include.d/all-commonфайл, який включений з обох serverконтекстів:

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;
}

1
Хороша ідея. Чи потрібно мені загортати директиви під іншу, як я зробив те, що ви пропонуєте, і nginx скаржиться, коли я перезапускаю його, що директива nginx: [emerg] "location" тут не дозволена
Томас

Майже вся моя конфігурація nginx складається з аналогічно включених файлів підконфігурації. Так, це працює. Можливо, ви можете опублікувати фактичну конфігурацію за допомогою includeдиректив - і вміст включеного файлу також. Редагуйте своє оригінальне запитання відповідним чином.
Moritz Bunkus

Я оновив свою відповідь, включивши фактичні файли конфігурації робочого сервера.
Моріц Бункус,

3
Працює нормально. Моє ліжко. Я помістив цей загальний файл у каталог, де кожен файл .conf завантажувався автоматично, що спричиняло помилки. Велике спасибі
Томас

3
Так, я сам зіткнувся з цією проблемою. Ось чому я вирішив помістити всі включені файли, в /etc/nginx/include.dякі не походять звичайні файли конфігурації nginx, присутні в системі Debian / Ubuntu.
Моріц Бункус,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.