Svetainės diegimas Nginx: server block po žingsnį

Paleiskite serveryje viena komanda (pirmiausia patikrinkite skripto turinį žemiau):

curl -sSL https://cp.lv/scripts/razvernut-sajt-na-nginx.sh | sudo bash

…arba su wget:

wget -qO- https://cp.lv/scripts/razvernut-sajt-na-nginx.sh | sudo bash

Skripto turinys razvernut-sajt-na-nginx.sh:

#!/usr/bin/env bash
set -e

# 1. Site directory and permissions
sudo mkdir -p /var/www/example.com
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
echo "<h1>example.com works</h1>" | sudo tee /var/www/example.com/index.html > /dev/null

# 2. server block (quoted 'EOF' leaves Nginx variables alone)
sudo tee /etc/nginx/sites-available/example.com > /dev/null << 'EOF'
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(jpg|jpeg|png|webp|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;
}
EOF

# 3. Enable the site and disable the default config
sudo ln -sf /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx
echo "Site deployed: open http://example.com"

Kad Nginx aptarnautų jūsų svetainę, jam reikia aprašyti „virtualų hostą“ — server block: kur guli failai, kokį domeną aptarnauti ir kaip apdoroti užklausas. Žemiau — veikianti schema tiek statikai, tiek PHP.

1 žingsnis. Svetainės katalogo paruošimas

Patalpinkite svetainės failus atskirame kataloge ir savininku nustatykite žiniatinklio vartotoją www-data:

sudo mkdir -p /var/www/example.com
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com

Įkelkite failus (pavyzdžiui, per rsync arba git clone). Patikrai sukurkite pradinį puslapį:

echo "<h1>example.com works</h1>" | sudo tee /var/www/example.com/index.html

2 žingsnis. Server block statinei svetainei

Atidarykite /etc/nginx/sites-available/example.com redaktoriuje:

sudo nano /etc/nginx/sites-available/example.com

Failo turinys:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(jpg|jpeg|png|webp|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;
}

Arba sukurkite visą konfigūraciją viena komanda — nukopijuokite ir įklijuokite į konsolę (kabutės 'EOF' svarbios, kad Nginx kintamieji $uri liktų nepakeisti):

sudo tee /etc/nginx/sites-available/example.com > /dev/null << 'EOF'
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(jpg|jpeg|png|webp|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;
}
EOF

Direktyva try_files ... =404 grąžina failą, jei jis egzistuoja, priešingu atveju — sąžiningą 404. Blokas su expires įjungia statikos talpyklą naršyklėje.

3 žingsnis. Variantas PHP svetainei

Jei svetainė veikia su PHP, pridėkite apdorojimą per PHP-FPM ir index.php. Atidarykite tą patį failą redaktoriuje (sudo nano /etc/nginx/sites-available/example.com) ir pertvarkykite jį taip:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
}

Arba įrašykite PHP variantą viena komanda (kabutės 'EOF' svarbios, kad Nginx kintamieji $uri liktų nepakeisti):

sudo tee /etc/nginx/sites-available/example.com > /dev/null << 'EOF'
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
}
EOF

Čia try_files su atsarga į /index.php — standartas CMS ir karkasams su draugiškais URL (WordPress, Laravel).

4 žingsnis. Aktyvavimas ir patikra

Įjunkite svetainę simboline nuoroda, patikrinkite sintaksę ir perkraukite:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

nginx -t turi atsakyti syntax is ok ir test is successful. Jei ne — klaida nurodys failą ir eilutę.

5 žingsnis. Numatytosios svetainės išjungimas

Kad Nginx nerodytų numatytojo užsklandos puslapio, pašalinkite numatytąją konfigūraciją:

sudo rm /etc/nginx/sites-enabled/default
sudo systemctl reload nginx

Tipinės klaidos

Simptomas Priežastis Sprendimas
403 Forbidden nėra teisių į failus chown www-data ir chmod 755
404 visuose URL neteisingas root patikrinkite kelią iki katalogo
PHP atsisiunčiamas failu nėra bloko location ~ \.php$ pridėkite FPM apdorojimą
Atsidaro svetimas puslapis neišjungtas default pašalinkite numatytąją konfigūraciją

6 žingsnis. Žurnalai diagnostikai

Jei kas nors neveikia, žiūrėkite konkrečios svetainės klaidų žurnalą:

sudo tail -f /var/log/nginx/example.com.error.log

Dažni klausimai

Kuo server block skiriasi nuo virtual host Apache serveryje? Tai ta pati sąvoka — atskiros svetainės aprašas. Nginx vienas blokas server { } = vienas virtualus hostas.

Ar reikia perkrauti Nginx po kiekvieno pakeitimo? Pakanka systemctl reload nginx — jis pritaikys konfigūraciją nenutraukdamas aktyvių ryšių. Pilnas restart reikalingas retai.

Kaip talpinti kelias svetaines viename serveryje? Sukurkite atskirą failą kataloge sites-available kiekvienam domenui su unikaliu server_name ir root, tada įjunkite nuorodomis kataloge sites-enabled.

Kodėl naršyklė rodo seną puslapio versiją? Suveikė talpykla iš bloko expires. Išvalykite naršyklės talpyklą arba kūrimo metu laikinai sumažinkite talpinimo laiką.

Po paleidimo pridėkite HTTPS — Nginx puikiai dirba su Let’s Encrypt sertifikatais. Realioms svetainėms tiks planai puslapyje VPS serverio nuoma, o CMS — WordPress VPS.

Edgars Kalējs