Vietnes izvietošana uz Nginx: server block soli pa solim

Palaist serverī ar vienu komandu (vispirms pārbaudiet skripta saturu zemāk):

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

…vai ar wget:

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

Skripta saturs razvernut-sajt-na-nginx.sh:

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

# 1. Vietnes katalogs un tiesības
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 darbojas</h1>" | sudo tee /var/www/example.com/index.html > /dev/null

# 2. server block (pēdiņas 'EOF' — Nginx mainīgos neaiztiekam)
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. Vietnes aktivizācija un noklusējuma konfigurācijas atslēgšana
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 "Vietne izvietota: atveriet http://example.com"

Lai Nginx apkalpotu jūsu vietni, tam jāapraksta «virtuālais hosts» — server block: kur atrodas faili, kuru domēnu apkalpot un kā apstrādāt pieprasījumus. Zemāk ir darbojošās shēmas gan statiskai vietnei, gan PHP projektam.

1. solis. Vietnes kataloga sagatavošana

Novietojiet vietnes failus atsevišķā direktorijā un iestatiet īpašnieku — tīmekļa lietotāju 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

Augšupielādējiet failus (piemēram, ar rsync vai git clone). Pārbaudei izveidojiet sākuma lapu:

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

2. solis. Server block statiskai vietnei

Atveriet /etc/nginx/sites-available/example.com redaktorā:

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

Faila saturs:

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;
}

Vai arī izveidojiet konfigurāciju uzreiz ar vienu komandu — nokopējiet un ielīmējiet konsolē (pēdiņas 'EOF' ir svarīgas, lai Nginx mainīgie $uri paliktu neskarti):

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

Direktīva try_files ... =404 atdod failu, ja tas eksistē, pretējā gadījumā godīgu 404. Bloks ar expires ieslēdz statikas kešošanu pārlūkā.

3. solis. Variants PHP vietnei

Ja vietne ir uz PHP, pievienojiet apstrādi caur PHP-FPM un index.php. Atveriet to pašu failu redaktorā (sudo nano /etc/nginx/sites-available/example.com) un pārveidojiet to šādi:

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;
    }
}

Vai arī ierakstiet PHP variantu uzreiz ar vienu komandu (pēdiņas 'EOF' ir svarīgas, lai Nginx mainīgie $uri paliktu neskarti):

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

Šeit try_files ar atkāpšanos uz /index.php ir standarts CMS un ietvariem ar draudzīgiem URL (WordPress, Laravel).

4. solis. Aktivizācija un pārbaude

Ieslēdziet vietni ar simbolisko saiti, pārbaudiet sintaksi un pārlādējiet:

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

nginx -t jāatbild syntax is ok un test is successful. Ja nē — kļūda norādīs failu un rindu.

5. solis. Noklusējuma vietnes atslēgšana

Lai Nginx neatdotu noklusējuma lapu, noņemiet default konfigurāciju:

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

Tipiskās kļūdas

Simptoms Cēlonis Risinājums
403 Forbidden nav tiesību uz failiem chown www-data un chmod 755
404 visos URL nepareizs root pārbaudiet ceļu uz katalogu
PHP tiek lejupielādēts kā fails nav bloka location ~ \.php$ pievienojiet FPM apstrādi
Atveras sveša vietne nav atslēgts default dzēsiet noklusējuma konfigurāciju

6. solis. Žurnāli diagnostikai

Ja kaut kas nestrādā, skatiet konkrētās vietnes kļūdu žurnālu:

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

Biežākie jautājumi

Ar ko server block atšķiras no virtual host Apache serverī? Tas ir viens un tas pats jēdziens — atsevišķas vietnes apraksts. Nginx viens bloks server { } ir viens virtuālais hosts.

Vai Nginx jāpārstartē pēc katras izmaiņas? Pietiek ar systemctl reload nginx — tas piemēros konfigurāciju, nepārtraucot aktīvos savienojumus. Pilns restart vajadzīgs reti.

Kā vienā serverī izvietot vairākas vietnes? Katram domēnam izveidojiet atsevišķu failu sites-available ar unikālu server_name un root, pēc tam ieslēdziet tos ar saitēm sites-enabled.

Kāpēc pārlūks rāda lapas veco versiju? Nostrādājis kešs no bloka expires. Notīriet pārlūka kešatmiņu vai izstrādes laikā uz laiku samaziniet kešošanas termiņu.

Pēc izvietošanas pievienojiet HTTPS — Nginx lieliski strādā ar Let’s Encrypt sertifikātiem. Ražošanas vietnēm noderēs tarifi lapā VPS serveru noma, bet CMS projektiem — WordPress VPS.

Edgars Kalējs