Повторное использование инструкций конфигурации для доменов в nginx.conf

Скажем, у меня есть конфигурация nginx, настроенная для такого домена:

server {

  root /path/to/one;
  server_name one.example.org;

  location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include         fastcgi_params;
  }

}

Теперь, если я хочу добавить другой домен с другим контентом, есть ли способ повторно использовать эквивалентные утверждения из предыдущего домена или мне нужно дублировать все для каждого нового домена, который я хочу поддерживать?

server {

  root /path/to/two; # different
  server_name two.example.org; # different

  location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include         fastcgi_params;
  }

}

Я попытался переместить директиву location вне закрытия server, но, очевидно, что-то не так, потому что я получил ошибку "директива местоположения здесь не разрешена" при перезапуске nginx.

Ответ 1

ты можешь сделать:

 server_name one.example.org two.example.org;

если оба абсолютно идентичны, кроме имени домена

если у вас есть похожие блоки местоположения, вы можете переместить эти местоположения в отдельный файл, а затем выполнить

include /etc/nginx/your-filename; 

легко использовать его в каждом блоке сервера

Ответ 2

Это хороший пример использования модуля nginx Map. http://wiki.nginx.org/HttpMapModule

Вот что я пытался. Он работает в моем devbox. Примечание

  • Директива map
  • может быть помещена только в http-блок.
  • Снижение производительности при объявлении директивы карты незначительно (см. ссылку выше)
  • у вас может быть свобода иметь другую корневую папку, номер порта и т.д.

    map $subdomain $root_folder {
      one  /path/to/one;
      two  /path/to/two;
    }
    
    map $subdomain $port_number {
      one 9000;
      two 9100;
    }
    
    server {
      listen  80;
      server_name  ~^(?P<subdomain>.+?)\.mydomain\.com$;
      root  $root_folder;
    
       location ~ \.php$ {
        try_files       $uri =404;
        fastcgi_pass    127.0.0.1:$port_number;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
      }
    }