Jak warunkowo dołączyć pliki do vgin Nginx?

12

W poniższych linii, ja może mieć plik konfiguracyjny site-specific, który zawiera dodatkowe fastcgi_params unikalne dla tej witryny. Jeśli ten plik istnieje, chcę go załadować.

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;


                if (-f /path/www/$host/nginx.conf) {
                        include /path/www/$host/nginx.conf;
                }
        }
}

Jednak to nie działa i pojawia się błąd:

nginx: [emerg] Dyrektywa „include” nie jest dozwolona tutaj w ...

Aktualizacja

Pomyślałem, że zamiast osobno sprawdzać, mogę pozwolić na włączenie czeku dla mnie.

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;

                include /path/www/$host/*.nginx;
        }
}

To jednak nie działa.

Xeoncross
źródło
Czy znalazłeś rozwiązanie tego problemu? Jestem na tej samej łodzi i zastanawiam się, jak to zrobiłeś?
jackweirdy
Przepraszam, myślę, że w końcu rozwiązałem ten problem inaczej.
Xeoncross

Odpowiedzi:

8

includerobi to podczas uruchamiania serwera - zmiennych wykonawczych takich jak $hostnie można używać, ani nie można ich używać w ifkontekście, jak się dowiedziałeś.

Musisz podzielić serverbloki dla różnych hostów. Przepraszam!

Shane Madden
źródło
31

Cóż, to dość stare, ale i tak znalazłem obejście.

Mam konfigurację z vhostami skonfigurowanymi w tym stylu:

/etc/nginx/sites-enabled/site.com.conf

Zamiast sprawdzać, czy plik istnieje (co nie jest możliwe), po prostu wykonuję:

include /etc/nginx/sites-customizations/site.com.*.conf

W ten sposób mogę po prostu utworzyć plik w sites-customizationsfolderze, który zgodnie z moją konwencją ma taką samą nazwę jak główna konfiguracja. Te *prace prawie jak if, gdyż nie złamać, jeżeli nie ma dodatkowych plików konfiguracyjnych. Jeśli chcesz, umożliwia to również dodanie wielu dodatkowych konfiguracji w osobnych plikach.

użytkownik158786
źródło
5

Wiem, że to stare, ale rozwiązanie może pomóc komuś, kto szuka odpowiedzi tak jak ja.

Miałem kilka przekierowań, które musiałem uwzględnić tylko dla konkretnego hosta i chociaż includenie jest to dozwolone w ifdyrektywie, ostatecznie dodałem ifplik, który zawierałem ...

Mam więc include /etc/nginx/conf.d/redirectsi wewnątrz tego pliku mam:

if ($host = "www.example.com") {
    # Some conf or redirects for this site only.
}
Titi
źródło
5

Korzystam z glob()rozszerzenia wzorca funkcji, które jest używane przez nginx w includedyrektywie i działa dobrze na moich serwerach Debiana.

W twoim przypadku spróbuj zastąpić ten wiersz:

include /path/www/$host/nginx.conf;

z tym:

include /path/www/<hostname>/nginx[.]conf;

jest to maska ​​pliku, która pasuje tylko do jednego pliku i nie spowoduje, że nginx narzeka, jeśli plik nie istnieje. Jednak zmienne nie są dozwolone w dyrektywach włączających, więc musisz podać stałą wartość w <hostname>. Musieliśmy stworzyć skrypt, który generuje pojedyncze pliki .conf (jeden na vhost).

Edytować

Jak zauważył Gerald Schneider , sugerowałem pozostanie $hostw zastępstwie, co jest niedozwolone. Zmieniłem powyższą sugestię.

Alberto Pastore
źródło
1
zmienna $hostnadal tu nie będzie działać.
Gerald Schneider
Przepraszamy, masz rację, zmienne nie są dozwolone w dyrektywach dołączania. Używamy skryptu Pythona, który tworzy jeden plik .conf dla każdego hosta vhosta z listy, ale w szerokim zakresie wykorzystujemy dodatkowe „niestandardowe” dodatkowe odchylenia od standardowego hosta.
Alberto Pastore