Lielākais murgs jebkuram uzņēmējam ir situācija, kad dārgi apmaksātā reklāmas kampaņa beidzot sāk nest tūkstošiem apmeklētāju, bet mājaslapa pēc piecām minūtēm kļūst nepieejama un rāda "504 Gateway Timeout" vai "502 Bad Gateway" kļūdas paziņojumu. Katra dīkstāves minūte šādā brīdī nozīmē simtiem vai tūkstošiem eiro negūtu ieņēmumu un neatgriezeniski zaudētu pircēju uzticību.
Daudzi uzņēmumi kļūdaini uzskata, ka risinājums ir vienkārši dārgāks serveris ar vairāk procesora kodoliem. Tomēr praksē pat 32 kodolu serveris bez pareizas kešatmiņas arhitektūras sabrūk jau pie 100 vienlaicīgiem dinamiskiem PHP pieprasījumiem. Šajā tehniskajā pamācībā parādīsim, kā ar atvērtā koda rīkiem veikt reālu slodzes testēšanu un ieviest Nginx FastCGI mikrokešatmiņu, kas ļauj parastam virtuālajam serverim bez piepūles apkalpot tūkstošiem pieprasījumu sekundē.
1. Solis: Reālistiska slodzes testa izveide ar k6
Vienkārša vienas lapas pingēšana nesniedz patiesu priekšstatu par to, kā vietne uzvedīsies, kad reāli lietotāji meklēs produktus, pievienos preces grozam un pārlūkos kategorijas. Slodzes testam ir jābūt daudzpakāpju scenārijam. Rīks k6 ir ideāli piemērots, jo tas ļauj rakstīt scenārijus modernā JavaScript sintaksē.
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '1m', target: 50 }, // Iesildīšanās līdz 50 lietotājiem
{ duration: '3m', target: 200 }, // Pīķa slodze: 200 vienlaicīgi lietotāji
{ duration: '1m', target: 0 }, // Atslābums
],
thresholds: {
http_req_duration: ['p(95)<400'], // 95% atbilžu jābūt zem 400ms
http_req_failed: ['rate<0.01'], // Kļūdu skaits zem 1%
},
};
export default function () {
// 1. Apmeklē sākumlapu
let res1 = http.get('https://marketmenow.eu/');
check(res1, { 'status ir 200': (r) => r.status === 200 });
sleep(1);
// 2. Pārlūko pakalpojumu sadaļu
let res2 = http.get('https://marketmenow.eu/majaslapu-izstrade/');
check(res2, { 'pakalpojumu lapa ielādēta': (r) => r.status === 200 });
sleep(2);
}
Šādu testu izpildot no ārēja servera, jūs redzēsiet precīzu punktu, kurā servera CPU noslogojums sasniedz 100% un atbildes laiki sāk nekontrolējami pieaugt.
"Katrs dinamisks WordPress lapas pieprasījums prasa 50 līdz 150 datubāzes vaicājumus un simtiem PHP failu interpretāciju. Ja jums vienā minūtē atnāk 1,000 apmeklētāju, tas nozīmē 100,000 datubāzes vaicājumu. Nginx FastCGI mikrokešatmiņa saglabā gatavu HTML atbildi uz 5 līdz 60 sekundēm RAM atmiņā. Rezultātā PHP un MySQL netiek lieki darbināti vispār, un lapas atbildes laiks krītas no 800ms uz 8ms."
2. Solis: Nginx FastCGI mikrokešatmiņas ieviešana
Mikrokešatmiņas (microcaching) noslēpums ir ļoti īss kešatmiņas laiks (piemēram, 10 sekundes statiskajām lapām un emuāram). Tas nozīmē, ka saturs apmeklētājiem vienmēr ir svaigs, bet pēkšņos pīķos visi 500 apmeklētāji saņem vienu un to pašu iepriekš uzģenerēto HTML failu tieši no Nginx atmiņas.
# 1. Definē kešatmiņas ceļu Nginx konfigurācijas sākumā (ārpus server bloka)
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m max_size=1g;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
# 2. Servera blokā definē izņēmumus (Grozi, kases, autorizēti lietotāji)
set $skip_cache 0;
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/cart/|/checkout/|/my-account/") {
set $skip_cache 1;
}
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
# 3. PHP lokācijā pieslēdz kešatmiņu
location ~ \.php$ {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 10s;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-FastCGI-Cache $upstream_cache_status;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
3. Solis: Veiktspējas salīdzinājums pirms un pēc
Zemāk redzami reāli rādītāji, testējot standarta VPS serveri (4 vCPU, 8 GB RAM) ar 200 vienlaicīgiem aktīviem lietotājiem:
| Metrika | Standarta PHP-FPM bez kešatmiņas | Nginx FastCGI mikrokešatmiņa |
|---|---|---|
| Pieprasījumi sekundē (RPS) | 18 RPS (sistēma nosmok) | 1,450+ RPS (brīva jauda) |
| Servera atbildes laiks (TTFB) | 1,850 ms (kavēšanās) | 12 ms (zibenīgs) |
| CPU noslodze pīķa brīdī | 100% (bloķēti procesi) | 14% (optimāls režīms) |
| Kļūdu biežums (502 / 504) | 34.2% kļūdu | 0.00% kļūdu |
Servera pārbaudes soļi pirms lielajām izpārdošanām
X-FastCGI-Cache: HIT publiskajām lapām.BYPASS.