Sobes.tech
Middle

Proč instalovat Nginx před Ruby?

sobes.tech AI

Odpověď od AI

Nginx se instaluje před Ruby aplikací (například Rails nebo Sinatra) z následujících důvodů:

  1. Obsluha statických souborů: Nginx efektivně (rychleji a s menší spotřebou zdrojů) obsluhuje statické soubory (CSS, JS, obrázky), čímž uvolňuje procesy Ruby pro zpracování dynamických požadavků.
  2. Reverse proxy: Nginx funguje jako reverzní proxy, přijímá všechny příchozí HTTP požadavky a přeposílá je na Ruby servery (například Puma, Unicorn) přes protokol (například HTTP nebo Unix Domain Socket). To umožňuje spravovat více Ruby procesů a vyvažovat zátěž.
  3. SSL/TLS terminace: Nginx může zpracovávat šifrované SSL/TLS spojení, odlehčující Ruby aplikaci od této úlohy.
  4. Caching: Nginx může ukládat odpovědi do cache, což urychluje doručování často požadovaného obsahu.
  5. Komprese: Nginx může komprimovat odpovědi (gzip, brotli), snižujíc objem přenášených dat.
  6. Vyvažování zátěže: Nginx může rozdělovat příchozí požadavky mezi více instancí Ruby aplikace, zvyšujíc dostupnost a škálovatelnost.
  7. Logování: Nginx nabízí výkonné možnosti logování HTTP požadavků.
  8. Bezpečnost: Nginx může provádět základní bezpečnostní funkce, jako je omezení rychlosti požadavků, blokování IP adres a ochrana před některými typy útoků (například DDoS na úrovni HTTP).
  9. Oddělení odpovědností: Nginx se stará o infrastrukturní úkoly (obsluha HTTP, SSL), což umožňuje Ruby aplikaci soustředit se na obchodní logiku.

Příklad konfigurace Nginx pro proxy na Unicorn:

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://unix:/path/to/your/app/tmp/sockets/unicorn.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Volitelné: přímo obsluhovat statické soubory
    location ~* \.(css|js|jpg|jpeg|gif|png|html)$ {
        root /path/to/your/app/public;
        expires 1d;
    }
}