Jakie najlepsze praktyki stosujesz podczas korzystania z NGinx?
Jakie najlepsze praktyki stosujesz podczas korzystania z NGinx?
Odpowiedzi:
Jak łączyć bloki HTTP i HTTPS.
server {
listen 80;
listen 443 default ssl;
# other directives
}
Zostało to opublikowane jako odpowiedź na inne pytanie. Zobacz tutaj .
Jak dotąd najlepsze wskazówki, jakie kiedykolwiek widziałem, pochodzą od autora na stronie z pułapką: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
Ogólnie rzecz biorąc, użycie „if” jest złą praktyką (według autora nginx). jeśli to możliwe, lepiej użyć try_file dyrektyw error_page zamiast „if (-f ...)”
Łącząc wskazówkę z plikiem maintenence.html i wskazówkę z plikami try_files, otrzymujemy:
Lokalizacja / { try_files /maintenance.html $ uri $ uri / @wordpress; }
Po zakończeniu konserwacji po prostu mv Maintenance.html z $ root.
if (-f ...) { return 503; }
i error_page 503 /maintenance.html
. Co myślisz?
Skonfiguruj nginx, aby używał silniejszych szyfrów SSL. Domyślnie protokół SSLv2 jest włączony (który należy wyłączyć, jeśli to możliwe).
ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
http://tumblelog.jauderho.com/post/121851623/nginx-and-stronger-ssl
Często bardziej efektywne jest stosowanie map
dyrektywy zamiast wyrażeń regularnych podczas przełączania katalogu głównego na pasujące subdomeny:
server {
server_name mysite.tld ~^.+\.mysite\.tld$;
map $host $files {
default common;
mysite.tld common;
www.mysite.tld common;
admin.mysite.tld admin;
system.mysite.tld system;
*.mysite.tld users;
}
root /var/www/mysite/$files;
}
empty_gif
Moduł jest również bardzo przydatna, zwłaszcza jeśli potrzebujesz odpowiedzi monitora z serwera WWW (przy użyciu Nagios / Monit / etc):
location /token {
empty_gif;
}
location /favicon.ico {
empty_gif;
}
location /img/1px.gif {
empty_gif;
}
access_log off;
dla tych lokalizacji jest powszechną praktyką
Skonfigurowaliśmy Nginx z Chefem, używając tej książki kucharskiej, która zawiera skrypty do obsługi konfiguracji nginx, podobnie jak Debian robi Apache2, a także niektóre przykładowe szablony z rozsądnymi ustawieniami domyślnymi.
Oto dobry sposób na zwrócenie strony konserwacji. Wszystkie żądania są przepisywane i zwracany jest prawidłowy kod HTTP. (503 Usługa niedostępna)
error_page 503 /maintenance.html;
location /
{
if (-f $document_root/maintenance.html)
{
return 503;
}
try_files $uri /index.php?$args;
}
location = /maintenance.html
{
rewrite ^ /maintenance.html break;
}
if
oświadczeniu, jeśli używasz go poprawnie - dokumenty mówią, że if
s są bezpieczne, jeśli po prostu robię return xxx;
.
location = /maintenance.html { break; }
konieczne?
Począwszy od nginx 0.7.12 i późniejszych, w nazwie nazwa_serwera można używać znaku „” do przechwytywania żądań bez nagłówka „Host”.
Można użyć następujących elementów jako catchall dla niezdefiniowanych hostów wirtualnych.
server {
server_name _ "";
}
Jakiś czas temu napisałem również o tym, jak poprawnie obsługiwać kompresję gzip za pomocą nginx, ponieważ starsze przeglądarki mogą mieć problemy tylko z ogólną instrukcją gzip. HTH.
http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx
Nie wiem, czy jest to najlepsza praktyka, ale zdecydowanie fajny hack, aby uzyskać zagnieżdżone warunki w Nginx. Oto próbka z wiki nginx .
location /xxxx/ {
set $test "";
if ($request_method = POST) {
set $test P;
}
if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
set $test "${test}C";
}
if ($test = PC) {
#rewrite rule goes here.
}
}
Jeśli potrzebujesz przełączać kontekstowo między http i https dla poddomen obsługiwanych przez ten sam blok serwera, możesz użyć do tego zmiennych. To może nie być najbardziej efektywny sposób na robienie rzeczy, ale działa:
server {
server mysite.tld ~^.+\.mysite\.tld$;
set $req_ssl = 0;
map $host $files {
default common;
mysite.tld common;
www.mysite.tld common;
admin.mysite.tld admin;
system.mysite.tld system;
*.mysite.tld users;
}
root /var/www/mysite/$files;
if ( $files = "admin" ){
set $req_ssl 1;
}
if ( $files = "common" ){
set $req_ssl 2;
}
if ( $scheme = http )
{
set $req_ssl $req_ssl.1;
}
if ( $scheme = https )
{
set $req_ssl $req_ssl.2;
}
if ($req_ssl = 1.1){
rewrite ^ https://$host$uri;
}
if ($req_ssl = 2.2){
rewrite ^ http://$host$uri;
}
}
Jeśli używasz nginx jako serwera proxy, dostosowanie ustawień limitu czasu może być ważne, aby upewnić się, że nie masz połączeń zrzucanych nginx przed zakończeniem aplikacji, zwłaszcza jeśli masz do czynienia z aplikacją o dużym ruchu:
proxy_connect_timeout
proxy_send_timeout
Spojrzałeś tutaj?