Jakie są różne zastosowania stron dostępnych w porównaniu do katalogu conf.d dla nginx


98

Mam pewne doświadczenie w używaniu Linuksa, ale żaden nie używa nginx. Zadanie polegało mi na zbadaniu opcji równoważenia obciążenia dla serwera aplikacji.

Użyłem apt-get, aby zainstalować nginx i wszystko wydaje się w porządku.

Mam kilka pytań.

Jaka jest różnica między folderem dostępnym na stronie a folderem conf.d. Oba te foldery zostały WŁĄCZONE w domyślnej konfiguracji konfiguracji dla nginx. Samouczki wykorzystują oba. Do czego służą i jaka jest najlepsza praktyka?

Do czego służy folder obsługujący witryny? Jak z tego korzystać?

Domyślna konfiguracja odwołuje się do użytkownika danych www? Czy muszę utworzyć tego użytkownika? Jak dać temu użytkownikowi optymalne uprawnienia do uruchamiania nginx?


Zadając pytanie, staraj się unikać pełzania zakresu; www-datato osobny temat. Większość systemów operacyjnych definiuje osobnego użytkownika z niższymi uprawnieniami, które proces może uruchomić po powiązaniu z portem 80 jako root. Jest zdefiniowany w pliku konfiguracyjnym. Zastosuj stamtąd podstawowe praktyki bezpieczeństwa; nie pozwól użytkownikowi pisać na cokolwiek, na co serwer sieciowy nie powinien pisać, nie pozwól innym użytkownikom pisać do plików, chyba że jest to celowe.
Andrew B,

Odpowiedzi:


93

Folderami site- * zarządza nginx_ensitei nginx_dissite. Dla użytkowników httpd Apache, którzy znajdą to podczas wyszukiwania, odpowiednikiem jest a2ensite/ a2dissite.

sites-availableFolder jest do przechowywania wszystkich swoich konfiguracjach vhosta, czy oni nie aktualnie włączone.

sites-enabledFolder zawiera dowiązania do plików znajdujących się w folderze sites-available. Umożliwia to selektywne wyłączanie vhostów poprzez usunięcie dowiązania symbolicznego.

conf.dwykonuje zadanie, ale musisz przenieść coś z folderu, usunąć go lub wprowadzić zmiany, gdy musisz coś wyłączyć. Abstrakcja folderów site- * sprawia, że ​​sprawy są nieco bardziej zorganizowane i pozwala zarządzać nimi za pomocą osobnych skryptów wsparcia.

(chyba że jesteś taki jak ja i jeden z wielu administratorów Debiana, który właśnie zarządzał dowiązaniami symbolicznymi, nie wiedząc o skryptach ...)


12
Czy coś źle zrozumiałem? Nie rozumiem opinii.
Andrew B,

1
jestem ciekawy, czy to jest wbudowane w Nginx? zainstalowałem ręcznie github.com/perusio/nginx_ensite
lfender6445

18
Należy zauważyć, że sites-available|sites-enabledjest to Debian-ism i nie jest czymś, co robią nginx lub Apache. W przeszłości był prawdopodobnie dość użyteczny, ale jego użyteczność jest nieco ograniczona w erze zarządzania konfiguracją i kontenerami.
Michael Hampton

Czy możesz skomentować, w jaki sposób zarządzanie konfiguracją i kontenery ograniczają użyteczność dostępnych witryn |
karthik vee

1
@karthikvee chodzi o to, że obecnie serwery często pojawiają się jako efemeryczne kontenery, które obsługują tylko jedną stronę internetową / usługę, więc można je włączyć nginx.confbez utraty czytelności. Jest to sprzeczne z podejściem sprzed kilku lat, gdy serwery zwykle przechowują dziesiątki stron internetowych.
adamczi

38

Chciałbym dodać do poprzednich odpowiedzi, że najważniejsze nie jest to, jak wywołujesz katalogi (choć jest to bardzo przydatna konwencja), ale to, co faktycznie umieszczasz nginx.conf. Przykładowa konfiguracja:

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    include /etc/nginx/sites-enabled/my_own_conf;
...
}

Jedynym dyrektywa użyte tutaj jest to , więc nie ma różnicy między np wewnętrzny conf.d/i sites-enabled/.

Z powyższej dokumentacji:

Syntax:     include file | mask;
Default:    —
Context:    any

Includes another file, or files matching the specified mask, 
into configuration. Included files should consist of 
syntactically correct directives and blocks.

Tak więc, aby odpowiedzieć na pierwotne pytanie: nie ma wewnętrznej różnicy i możesz je wykorzystać w najlepszy możliwy sposób, pamiętając porady z innych odpowiedzi. I proszę, nie zapomnij wybrać „właściwej” odpowiedzi.


1
Zgadza się, sites-enabledzostał w jakiś sposób wymyślony przez jakąś dystrybucję, poruszając się, jak irytujący pośrednik. Idź złap nginx z oficjalnego źródła : dostaniesz aktualny produkt, a także pozbędziesz się tej konfiguracji badziewia / piekła.
Bernard Rosset,

2
To wyjaśnia, dlaczego nie ma ani jednego odwołania do tej konwencji nazw w oficjalnej dokumentacji Nginx. To projekt strony trzeciej! github.com/perusio/nginx_ensite
AxeEffect

30

Zazwyczaj sites-enabledfolder jest używany do definicji hosta wirtualnego, podczas gdy conf.dsłuży do globalnej konfiguracji serwera. Jeśli wspierasz wiele stron internetowych - tj. Wirtualnych hostów - wtedy każdy z nich otrzymuje własny plik, dzięki czemu możesz je bardzo łatwo włączać i wyłączać, przenosząc pliki do iz nich sites-enabled(lub tworząc i usuwając dowiązania symboliczne, co prawdopodobnie lepszy pomysł).

Użyj conf.ddo takich rzeczy jak ładowanie modułów, pliki dziennika i inne rzeczy, które nie są specyficzne dla pojedynczego wirtualnego hosta.

Domyślna konfiguracja odwołuje się do użytkownika danych www? Czy muszę utworzyć tego użytkownika?

Powinieneś mieć nginx działający jako użytkownik inny niż root. W niektórych przypadkach jest to nazywane www-data, ale możesz nazwać to, co chcesz.

Jak dać temu użytkownikowi optymalne uprawnienia do uruchamiania nginx?

Nie jestem pewien odpowiedzi na to pytanie (w tej chwili nie korzystam z Nginx), ale jeśli jest coś takiego jak Apache, odpowiedź jest taka, że www-dataużytkownik potrzebuje tylko uprawnień do odczytu do dowolnych plików statycznych (i read + wykonaj w katalogach ), które podajesz lub odczytujesz / wykonujesz uprawnienia do takich rzeczy jak skrypty CGI i żadnych innych uprawnień.


1
posiadanie dedykowanego użytkownika do uruchamiania serwera WWW jest również ważne ze względu na wyłączenie możliwości logowania dla tego użytkownika przez usunięcie prawidłowego rekordu powłoki.
DukeLion

> „Powinieneś mieć nginx działający jako użytkownik inny niż root” - czy mógłbyś rozwinąć więcej na ten temat?
lfender6445,

1
Działanie jako użytkownik nieuprzywilejowany jest sposobem na ograniczenie szkód, które mogą wyniknąć z odległego kompromisu. Jeśli używasz serwera WWW jako rooti istnieje jakiś zdalny kompromis, osoba atakująca ma natychmiast pełny dostęp do systemu. Podczas działania jako nieuprzywilejowany użytkownik dostęp administracyjny byłby dostępny tylko w połączeniu z jakimś rodzajem lokalnego exploita.
larsks

14

Co się dzieje?

Musisz używać Debiana lub Ubuntu, ponieważ zło sites-available / sites-enabledlogika nie jest używana przez upstream pakietu nginx ze strony http://nginx.org/packages/ .

W obu przypadkach oba są implementowane jako konwencja konfiguracji za pomocą standardowej includedyrektywy w /etc/nginx/nginx.conf.

Oto fragment /etc/nginx/nginx.confoficjalnego pakietu nginx z witryny nginx.org:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}

Oto fragment /etc/nginx/nginx.confz Debian / Ubuntu :

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Tak więc, z punktu widzenia NGINX, jedyną różnicą byłoby to, że pliki conf.dbędą przetwarzane wcześniej, i jako takie, jeśli masz konfiguracje, które dyskretnie ze sobą konfliktują, wtedy te z conf.dmogą mieć pierwszeństwo przed tymi w sites-enabled.


Najlepszą praktyką jest conf.d.

Powinieneś używać /etc/nginx/conf.d, ponieważ jest to standardowa konwencja i powinna działać wszędzie.

Jeśli chcesz wyłączyć witrynę, po prostu zmień nazwę pliku, aby nie mieć już .confsufiksu, jest to bardzo łatwe, proste i odporne na błędy:

sudo mv -i /etc/nginx/conf.d/default.conf{,.off}

Lub odwrotnie, aby włączyć witrynę:

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}


Unikaj sites-availablei za sites-enabledwszelką cenę.

Nie widzę absolutnie żadnego powodu, aby używać sites-available/ sites-enabled:

  • Niektórzy wspominali nginx_ensitei nginx_dissiteskrypty - nazwy tych skryptów są jeszcze gorsze niż reszta tego niepowodzenia - ale skrypty te również nie można znaleźć - nie ma ich w nginxpakiecie nawet w Debianie (i prawdopodobnie również w Ubuntu) , a także nieobecne we własnym pakiecie, czy naprawdę potrzebujesz całego niestandardowego skryptu innej firmy, aby po prostu przenieść i / lub połączyć pliki między dwoma katalogami ?!

  • A jeśli nie korzystasz ze skryptów (co jest tak naprawdę dobrym wyborem, jak opisano powyżej), pojawia się kwestia zarządzania stronami:

    • Czy tworzysz dowiązania symboliczne od sites-availabledo sites-enabled?
    • Skopiować pliki?
    • Przenieś pliki?
    • Czy edytować pliki na miejscu w sites-enabled?

Powyższe może wydawać się drobnymi problemami do rozwiązania, dopóki kilku ludzi nie zacznie zarządzać systemem lub dopóki nie podejmiesz szybkiej decyzji, ale zapomnisz o tym miesiące lub lata później…

Co prowadzi nas do:

  • Czy usunięcie pliku jest bezpieczne sites-enabled? Czy to miękki link? Twardy link? Czy jedyna kopia konfiguracji? Doskonały przykład piekła konfiguracji.

  • Które strony zostały wyłączone? (Za pomocą conf.dpo prostu wykonaj wyszukiwanie inwersyjne plików, które nie kończą się na .conf- find /etc/nginx/conf.d -not -name "*.conf"lub użyj grep -v).

Nie tylko wszystkie powyższe, ale także zwróć uwagę na konkretną includedyrektywę używaną przez Debian / Ubuntu - /etc/nginx/sites-enabled/*- nie podano sufiksu nazwy pliku sites-enabled, w przeciwieństwie do conf.d.

  • Oznacza to, że jeśli któregoś dnia zdecydujesz się szybko edytować plik lub dwa w nim /etc/nginx/sites-enabled, i emacsutworzysz plik kopii zapasowej default~, to znaczy, że nagle masz jedno defaulti drugie default~jako aktywną konfigurację, która w zależności od zastosowanych dyrektyw może nawet nie dać ostrzeżenia i powodują przedłużenie sesji debugowania. (Tak, to mi się przydarzyło; miało to miejsce podczas hackatonu i byłem całkowicie zdziwiony, dlaczego moje conf nie działa).

Jestem zatem przekonany, że sites-enabledto czyste zło!


Oprócz wszystkich powyższych, najwyraźniej bardzo często tworzy się nieprawidłowe dowiązania symboliczne! stackoverflow.com/a/14107803/1122270 Na wypadek, gdybyś nie uważał, że sites-enabledto wystarczająco złe!
cnst

Czasami może się zdarzyć, że ktoś zdecyduje się na edycję plików sites-enabled, ale inna osoba zdecyduje się je wyłączyć, usuwając go, prawdopodobnie myśląc, że to tylko dowiązanie symboliczne, wymagające kolejnego zrzutu pamięci sterty nginx w celu odzyskania pliku conf: stackoverflow.com/q/45852224/1122270
cnst

Muszę się nie zgodzić z twierdzeniami dotyczącymi sites-availablei sites-enabled; ważne jest, aby móc przygotować pliki konfiguracyjne poza katalogiem „na żywo”, aby w przypadku ponownego załadowania lub ponownego uruchomienia nginx nie pobierał częściowych plików konfiguracyjnych. Przydatne może być również przechowywanie plików konfiguracyjnych, które nie są już aktywne. Tworzenie dowiązań symbolicznych nie jest szczególnie trudnym zadaniem, jeśli masz wystarczające doświadczenie, aby w pierwszej kolejności zarządzać nginx, IMO.
BE77Y

@ BE77Y podchodzisz do bardziej skomplikowanego podejścia. W programowaniu za najlepszą praktykę uważa się całkowite usunięcie nieużywanego kodu, a nie tylko jego wyłączanie lub komentowanie; Nie widzę powodu, dla którego DevOps miałby być inny - jeśli konfiguracja nie jest już potrzebna, usuń ją (powinna nadal istnieć w VCS). To samo z częściowymi plikami conf - dlaczego miałbyś je edytować i włączyć nginx za plecami? ( USR1który ponownie otwiera dzienniki, nie przeładowuje conf.) Uważam, że komentarze „doznania” dowiązania symbolicznego zostały źle skierowane - problem dotyczy spójności, która nie ma wiele wspólnego z doświadczeniem.
cnst

2
Oczywiste jest, że a) nie jest to odpowiednie medium do tej dyskusji, a może nawet co ważniejsze, b) w każdym razie może być bezowocne. Zgódźmy się na niezgodę.
BE77Y
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.