Blog članak

Granice datotečnih opisa i nginx worker_connections: Praktični vodič

Praktični vodič za upravljanje granicama otvorenih datotečnih opisa i konfiguriranje nginx worker_connections za produkcijske deploymente, uključujući systemd override, granice SSH sesija i graciozno ponovno učitavanje bez prekida rada.

Granice datotечnih opisa i nginx worker_connections: Praktični vodič

Ovaj članak pokriva dva kritična aspekta produkcijskog deploymenta nginxa: upravljanje granicama otvorenih datotечnih opisa (ulimit -n) i konfiguriranje worker_connections za deploymente bez prekida rada.


Sadržaj

  1. Razumijevanje datotечnih opisa
  2. Zadane granice systemd-a
  3. Prekidanje usluge nginxa
  4. Granice sesija SSH-a
  5. Konfiguracija nginx worker_connections
  6. Graciozno ponovno učitavanje i nulti downaj
  7. Rješavanje čestih problema

1. Razumijevanje datotечnih opisa

Datotечni opis je cijeli broj identificator za otvorenu datoteku, socket, cijev ili drugi I/O resurs. Svaki proces ima granicu na broj istovremenih datotечnih opisa koje može imati otvorenih. Kada se dostigne ta granica, sustav vraća grešku EMFILE (Previše otvorenih datoteka).

Zašto je ovo važno za nginx

Nginx rukuje tisućama istovremenih veza koristeći neblokirajuću event-driven arhitekturu. Pod visokim opterećenjem:

  • Svaka veza zahtijeva barem jedan datotечni opis (socket)
  • Trajne keep-alive veze množaju broj
  • Poveznice s upstream backendima također troše opise

Klasična greška koju ćete susresti:

2024/06/23 14:32:15 [error] 1234#1234: *9876 accept() failed (24: Too many open files)

2. Zadane granice systemd-a

Na modernim Linux sustavima koji koriste systemd, zadani ulimit za većinu usluga je 1024. Ovo je često nedovoljno za produkcijske deploymente nginxa.

Provjera trenutne granice

# Provjera shell granice (utječe na interaktivne sesije)
ulimit -n

# Provjera procesne granice za trčeci nginx radnik
cat /proc/<pid>/limits | grep "open files"

# Primjer izlaza:
# Max open files                 1024              65536               files             hard soft

Sustavna zadana vrijednost

Kernelova sustavna maksimalna vrijednost definirana je u /etc/security/limits.conf:

# Pogledavanje defaulta
grep -E "^*" /etc/security/limits.conf | grep nofile

Tipični default:

*                soft    nofile   1024
*                hard    nofile   4096

3. Prekidanje usluge nginxa

Najpouzdaniji način postavljanja granica za nginx je putem systemd service override datoteke. Ovaj pristup traje kroz ponovno pokretanje i ne zahtijeva ručnu intervenciju.

Metoda 1: Korištenje systemctl edit (Preporučeno)

Ova metoda stvara uredivu drop-in datoteku bez izravnog modifikiranja sustavskih datoteka:

# Kreiranje/uredjenje nginx service override-a
sudo systemctl edit --drop-in nginx.conf <<EOF

# Povećanje granica otvorenih datotечnih opisa za nginx
[Service]
LimitNOFILE=65535
LimitNPROC=65535
EOF

Ili pisanje u datoteku:

sudo mkdir -p /etc/systemd/system/nginx.service.d/
sudo tee /etc/systemd/system/nginx.service.d/limits.conf > /dev/null <<EOF
[Service]
LimitNOFILE=65535
LimitNPROC=65535
EOF

Metoda 2: Korištenje systemctl edit sa Drop-in Sintaksom

Za detaljniju kontrolu, navedite granice u override formatu:

sudo systemctl edit --drop-in nginx.conf <<EOF
# Override za nginx datotечne opise
[Service]
LimitNOFILE=65535
LimitNPROC=65535

# Opcionalno: Također postavite rlimit_nofile u nginx configu ako je potrebno
Environment="NGINX_LIMIT_NOFILE=65535"
EOF

Ponovno učitavanje i ponovno pokretanje

Nakon kreiranja override-a:

# Ponovno učitavanje systemd za prihvaćanje promjena
sudo systemctl daemon-reload

# Ponovno pokretanje nginxa (ne samo reload - rlimit promjene zahtijevaju restart)
sudo systemctl restart nginx

# Provjera da li su nove granice primijenjene
systemctl show nginx -p LimitNOFILE -p LimitNPROC --value

# Provjera trčećeg radničkog procesa
cat /proc/$(pgrep -f 'nginx: worker')/limits | grep "open files"

Alternativa: U /etc/security/limits.conf

Za sustave koji ne koriste systemd ili za dodatnu sigurnost:

# Dodavanje u /etc/security/limits.conf
*                soft    nofile   65535
*                hard    nofile   65535
nginx            soft    nofile   65535
nginx            hard    nofile   65535

Napomena: Ovo utječe samo na procese pokretane login shellovima. Za systemd-upravljane usluge, preporučuje se metoda override datoteke.


4. Granice sesija SSH-a

SSH sesije su zahvaćene PAM konfiguracijom i /etc/security/limits.conf. Bez pravilnih granica, možete doći do ENFILE ili EMFILE grešaka kada pokrežete naredbe koje otvaraju mnogo datoteka.

Provjera trenutne SSH granice

# Interaktivna sesija
ulimit -n

# Trebalo bi pokazati 65535 ako je pravilno konfigurirano

Konfiguracija PAM granica

Uredite /etc/pam.d/sshd:

sudo nano /etc/pam.d/sshd

Dodajte ili izmijenite pam_limits.so liniju:

session required pam_limits.so

Osigurajte da limits.conf ima pravilne unose (kao što je gore prikazano).

Testiranje SSH sesijskih granica

Nakon promjena, odspojite se i ponovno spojite kako biste primijenili nove granice. Napomena da neke konfiguracije zahtijevaju puni logout/login ciklus.


5. Konfiguracija nginx worker_connections

Direktiva worker_connections u /etc/nginx/nginx.confu kontrolira maksimalan broj istovremenih veza koje svaki radnički proces može rukovati.

Osnovna konfiguracija

http {
    # Povećanje granice datotечnih opisa za nginx radnike
    worker_rlimit_nofile 65535;

    events {
        # Maksimalan broj istovremenih veza po radničkom procesu
        worker_connections 1024;

        # Korištenje accept() umjesto poll() na nekim platformama
        use epoll;

        # Omogućavanje neblokirajućeg I/O (default)
        multi_accept on;
    }

    http {
        # Keepalive postavke
        keepalive_timeout 65;
        keepalive_requests 1000;

        # Granice veza
        server_tokens off;
    }
}

Računanje maksimalnih veza

Ukupne istovremene veze = worker_processes × worker_connections

Primjer sa zadanim konfiguracijom:

  • worker_processes auto (obično jednak CPU jezgrama, npr. 8)
  • worker_connections 1024
  • Maksimalno: 8 × 1024 = 8,192 istovremene veze

Za scenarije visokog prometa:

  • Povećajte worker_connections na 4096 ili više
  • Korištenjem worker_rlimit_nofile osigurajte dovoljno datotечnih opisa

Preporučene vrijednosti po razini prometa

Razina prometaworker_processesworker_connectionsKapacitet
Development1512512
Low410244,096
Medium8204816,384
High16409665,536
Very High328192262,144

6. Graciozno ponovno učitavanje i nulti downaj

Nginx podržava graciozna ponovna učitavanja koja omogućuju novoj konfiguraciji da stupi na snagu bez gubitka postojećih veza.

Četiri faze nginx reload-a

  1. Master proces čita novu konfiguraciju
  2. Radnički procesi su signalizirani da prestanu prihvaćati nove veze
  3. Postojeće veze završavaju graciozno
  4. Novi radnički procesi kreću sa novom konfiguracijom

Korištenje nginx -s reload (SIGUSR2)

# Standardno graciozno ponovno učitavanje
sudo nginx -s reload

# Ekvivalentna systemctl naredba
sudo systemctl reload nginx

Što se događa:

  • Postojeće veze nastavljaju neometano
  • Novim vezama koristi se nova konfiguracija
  • Nema downaja za korisnike

Korištenje nginx -s reopen (SIGHUP)

Za ponovno otvaranje log datoteka bez odvajanja klijenata:

sudo nginx -s reopen

Korištenje nginx -s stop i start (SIGQUIT + SIGCHLD)

Nije preporučljivo za produkciju osim ako vam je potreban pun restart:

# Ovo odvaja sve postojeće veze
sudo nginx -s stop  # Pošalje SIGQUIT
sudo systemctl start nginx  # Pokreće nove radnike

Najbolje prakse za deploymente bez downaja

Priprema prije deploymenta

# 1. Validacija sintakse konfiguracije
sudo nginx -t

# Očekivani izlaz:
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file test is successful

# 2. Provjera trenutnih granica
ulimit -n
cat /proc/$(pgrep nginx)/limits | grep "open files"

# 3. Provjera radničkih procesa
systemctl status nginx

Sekvenca deploymenta

# Korak 1: Backup trenutne konfiguracije
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup.$(date +%Y%m%d)

# Korak 2: Primjena nove konfiguracije (uredite nginx.conf)
sudo nano /etc/nginx/nginx.conf

# Korak 3: Validacija sintakse
sudo nginx -t

# Korak 4: Graciozno ponovno učitavanje
sudo nginx -s reload

# Korak 5: Monitoring grešaka
tail -f /var/log/nginx/error.log

# Korak 6: Provjera da li novi radnici trče
pgrep -a nginx

Rješavanje konfiguracijskih grešaka

Ako nginx -t ne uspije, reload je abortiran i postojeće veze ostaju aktivne:

# Ako je detektirana sintaksná greška
sudo nginx -t
# Izlaz uključuje "syntax error" - NEMA RELOAD-a

# Ispravite konfiguracijsku datoteku
sudo nano /etc/nginx/nginx.conf

# Ponovite validaciju
sudo nginx -t

# Tada reload kada uspije
sudo nginx -s reload

Napredno: Phased Reload sa OpenResty/OpenSSL

Za još glađe prijelaze, možete koristiti Lua-based phased deploymente ili rotaciju SSL certifikata bez downaja.


7. Rješavanje čestih problema

Problem 1: “Too many open files” Greška

Simptom:

2024/06/23 14:32:15 [error] accept() failed (24: Too many open files)

Rješenje:

# Provjera trenutne granice
ulimit -n

# Ako je i dalje niska, provjerite systemd override
systemctl show nginx -p LimitNOFILE --value

# Restart nginxa za primjenu promjena
sudo systemctl restart nginx

# Provjera radničkih procesnih granica
cat /proc/$(pgrep -f 'nginx: worker')/limits | grep "open files"

Problem 2: Connection Refused Nakon Reload-a

Simptom: Klijenti ne mogu spojiti odmah nakon nginx -s reload.

Uzrok: Nova konfiguracija može imati netočne listen direktive.

Rješenje:

# Provjera nginx statusa
systemctl status nginx

# Ako je failed, rollback na backup
sudo cp /etc/nginx/nginx.conf.backup.* /etc/nginx/nginx.conf
sudo systemctl restart nginx

# Tada ispravite konfiguraciju i ponovno reloadajte
sudo nginx -t && sudo nginx -s reload

Problem 3: Radnički procesi ne kreću se

Simptom: Samo master proces trči, nema radnika.

Provjerite:

# Pogledavanje nginx statusa
systemctl status nginx

# Provjera logova
journalctl -u nginx -n 50

# Česti uzroci:
# - Nevaljana konfiguracijska sintaksa
# - Nedovoljne granice datotечnih opisa
# - Nedostajuće direktoriji/datoteke referencirane u configu

Problem 4: Granice ne primjenjuju se nakon reboot-a

Simptom: ulimit -n pokazuje nisku vrijednost nakon ponovnog pokretanja sustava.

Rješenje:

# Provjera da li systemd override datoteka postoji
ls -la /etc/systemd/system/nginx.service.d/

# Osigurajte da je service enabled
sudo systemctl enable nginx

# Reload i restart
sudo systemctl daemon-reload
sudo systemctl restart nginx

# Provjera da li su granice primijenjene
systemctl show nginx --property=LimitNOFILE,LimitNPROC

Quick Reference Commands

Granice datotечnih opisa

# Provjera trenutne granice
ulimit -n

# Provjera procesne granice
cat /proc/<pid>/limits | grep "open files"

# Pogledavanje systemd granica
systemctl show nginx -p LimitNOFILE,LimitNPROC --value

# Reload systemd daemon
sudo systemctl daemon-reload

# Restart nginx (potrebno za rlimit promjene)
sudo systemctl restart nginx

Nginx Worker Connections

# Testiranje konfiguracije
sudo nginx -t

# Graciozno ponovno učitavanje
sudo nginx -s reload
# ili
sudo systemctl reload nginx

# Provjera radničkih procesa
pgrep -a nginx | grep "worker"

# Pogledavanje trenutne konfiguracije
grep -E "(worker_processes|worker_connections)" /etc/nginx/nginx.conf

Zaključak

Pravilna konfiguracija granica datotечnih opisa i worker_connections je neophodna da nginx učinkovito rukuje produkcijskim opterećenjima. Korištenjem systemd service override-a, osiguravate da te postavke traju kroz ponovna pokretanja bez ručne intervencije. Uvijek validirajte svoju konfiguraciju s nginx -t prije reload-a kako biste održali deploymente bez prekida rada.

Ključni zaključci

  1. Systemd override-i (systemctl edit --drop-in) su najpouzdaniji način postavljanja granica
  2. Restart, ne reload, je potreban kada se mijenjaju granice datotечnih opisa
  3. Graciozno ponovno učitavanje (nginx -s reload) održava nulti downaj za konfiguracijske promjene
  4. Uvijek validirajte s nginx -t prije deploymenta promjena
  5. Monitorite log grešaka nakon svake konfiguracijske promjene

Povezana područja

Ova su područja rada usklađena s temom članka i daju čišći prijelaz od edukativnog sadržaja do konkretne implementacije.

Nastavite čitati

Prvo po zajedničkim kategorijama, a zatim po najjačem preklapanju u tagovima.