WordPress pe LEMP (nginx, MariaDB, PHP)
Instalarea pas cu pas a unui site WordPress pe un server Ubuntu sau Debian, cu HTTPS, copii de rezervă zilnice și setări de bază.
Pe această pagină
Ghidul arată cum instalați un site WordPress pe stiva LEMP: Linux, nginx (serverul web), MariaDB (baza de date) și PHP-FPM, cu un certificat HTTPS gratuit de la Let's Encrypt. Toate comenzile se rulează pe server, ca root, într-o sesiune SSH: Conectarea la server prin SSH (Windows, macOS, Linux). Adresa IP a serverului este în panoul app.blackbox.md, „Infrastructură” → „Serverele mele” (app.blackbox.md/my-servers), în câmpul „IP” de pe cardul serverului.
Disponibil pentru: titularul unui server VPS BLACKBOX fără panou de control, cu acces root prin SSH. Pașii sunt scriși pentru Ubuntu 24.04 LTS și Debian 12; diferențele pentru AlmaLinux 9 și CentOS Stream 9 sunt într-o secțiune separată. Pe un plan „VPS hosting” cu panou de control, site-urile se creează din panou: Planurile „VPS hosting” cu panou de control.
Ce plan și ce sistem alegeți
Pentru un site obișnuit, un plan Standard S sau Standard M este un început bun:
| Plan | vCPU | RAM | Disc | Preț | Potrivit pentru |
|---|---|---|---|---|---|
| Standard S | 1 | 2 GB | 20 GB | 443 MDL/lună | site de prezentare, blog |
| Standard M | 2 | 4 GB | 40 GB | 578 MDL/lună | magazin online, site cu multe plugin-uri |
Toate planurile sunt în Planurile VPS: cum alegeți. Când site-ul crește, treceți la un plan mai mare: Upgrade server: trecerea la un plan mai mare.
Ca sistem de operare, alegeți Ubuntu 24.04 LTS (selectat implicit la comandă) sau Debian 12. Ubuntu 20.04 LTS și Debian 11 vin cu PHP 7.4, pe care proiectul PHP nu-l mai actualizează: nu le folosiți pentru un site nou.
Înainte de instalare, verificați:
- înregistrările A pentru
DOMENIUșiwww.DOMENIUindică adresa IP a serverului; altfel certificatul HTTPS nu poate fi emis: Cum îndreptați domeniul către server; - porturile 80 și 443 sunt deschise. Filtrul de rețea BLACKBOX le lasă deschise implicit, iar firewall-ul sistemului (ufw sau firewalld) nu este pornit pe un server nou. Dacă l-ați pornit, permiteți porturile 80 și 443 și acolo: Firewall: filtrarea din rețea și ufw/firewalld pe server.
În toate comenzile, înlocuiți DOMENIU cu numele site-ului fără www, de exemplu example.com.
Pasul 1. Instalați nginx, MariaDB și PHP
Actualizați lista de pachete și instalați componentele. Pe Ubuntu și Debian, serviciile pornesc automat după instalare.
apt update apt install -y nginx mariadb-server php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl curlAflați versiunea PHP instalată după numele socket-ului PHP-FPM:
ls /run/php/Sistem PHP Socket PHP-FPM Serviciul PHP-FPM Ubuntu 24.04 LTS 8.3 /run/php/php8.3-fpm.sockphp8.3-fpmDebian 12 8.2 /run/php/php8.2-fpm.sockphp8.2-fpmUbuntu 22.04 LTS 8.1 /run/php/php8.1-fpm.sockphp8.1-fpmImportant Exemplele folosesc PHP 8.3 (Ubuntu 24.04 LTS). Pe alt sistem, înlocuiți
8.3cu versiunea dvs. peste tot: în căile/etc/php/8.3/…, în numele serviciuluiphp8.3-fpmși în socket-ul din configurația nginx.Măriți mărimea maximă a fișierelor încărcate în WordPress (implicit, PHP acceptă doar 2 MB) și reporniți PHP-FPM:
printf 'upload_max_filesize = 64M\npost_max_size = 64M\n' > /etc/php/8.3/fpm/conf.d/99-wordpress.ini systemctl restart php8.3-fpm
Pasul 2. Creați baza de date
Rulați scriptul de securizare MariaDB și răspundeți ca în tabel:
mariadb-secure-installationÎntrebarea Răspunsul Enter current password for root (enter for none):Enter Switch to unix_socket authentication [Y/n]nChange the root password? [Y/n]n, dacă scriptul a scris „You already have your root account protected, so you can safely answer 'n'.”; altfelYși o parolă puternicăRemove anonymous users?,Disallow root login remotely?,Remove test database and access to it?,Reload privilege tables now?Yla toateUtilizatorul
rootal MariaDB intră prin contulrootal sistemului (autentificareunix_socket), cu comandamariadb, fără parolă.Generați o parolă puternică pentru utilizatorul bazei de date și notați-o. Mai jos, ea apare ca
PAROLA_DB:openssl rand -hex 20Deschideți consola MariaDB:
mariadbCreați baza de date
wordpressși utilizatorulwpuser, cu drepturi doar pe această bază, apoi ieșiți:CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'PAROLA_DB'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost'; FLUSH PRIVILEGES; EXIT;
Utilizatorul wpuser se poate conecta doar de pe server (localhost). Nu deschideți portul 3306 spre internet. Mai multe despre MariaDB: Baze de date: MariaDB/MySQL și PostgreSQL.
Pasul 3. Copiați fișierele WordPress
Descărcați ultima versiune de pe wordpress.org și dezarhivați-o în
/var/www/DOMENIU:mkdir -p /var/www/DOMENIU cd /tmp curl -O https://wordpress.org/latest.tar.gz tar -xzf latest.tar.gz -C /var/www/DOMENIU --strip-components=1 rm latest.tar.gzCreați
wp-config.phpși scrieți în el datele bazei de date. ÎnlocuițiPAROLA_DBcu parola din pasul 2.cd /var/www/DOMENIU cp wp-config-sample.php wp-config.php sed -i "s/database_name_here/wordpress/; s/username_here/wpuser/; s/password_here/PAROLA_DB/" wp-config.phpÎnlocuiți cele 8 chei de securitate (salts) cu valori unice, generate de serviciul WordPress.org:
curl -s https://api.wordpress.org/secret-key/1.1/salt/ -o /tmp/wp-salts.txt sed -i '/put your unique phrase here/d' wp-config.php sed -i '/#@-/r /tmp/wp-salts.txt' wp-config.php rm /tmp/wp-salts.txtVerificați rezultatul. Trebuie să vedeți 3 rânduri
DB_cu datele dvs. și 8 rânduri, de laAUTH_KEYlaNONCE_SALT, cu șiruri lungi aleatorii.grep -E "DB_(NAME|USER|PASSWORD)|_KEY'|_SALT'" wp-config.phpTreceți fișierele în proprietatea utilizatorului
www-data, cu care rulează nginx și PHP-FPM, și setați permisiunile:chown -R www-data:www-data /var/www/DOMENIU find /var/www/DOMENIU -type d -exec chmod 755 {} + find /var/www/DOMENIU -type f -exec chmod 644 {} + chmod 640 /var/www/DOMENIU/wp-config.phpAstfel, WordPress își poate instala singur actualizările și plugin-urile, iar
wp-config.php, cu parola bazei de date și cheile, nu poate fi citit de ceilalți utilizatori ai sistemului.
Pasul 4. Configurați nginx
Creați fișierul site-ului:
nano /etc/nginx/sites-available/DOMENIULipiți configurația de mai jos, înlocuiți
DOMENIU, salvați cu Ctrl+O și Enter, apoi ieșiți cu Ctrl+X:server { listen 80; server_name DOMENIU www.DOMENIU; root /var/www/DOMENIU; index index.php index.html; client_max_body_size 64M; location / { try_files $uri $uri/ /index.php?$args; } location ~* /wp-content/uploads/.*\.php$ { deny all; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } location ~ /\.(?!well-known) { deny all; } }Rândul Ce face try_files $uri $uri/ /index.php?$args;servește fișierele existente și trimite restul cererilor la WordPress (necesar pentru legăturile permanente) fastcgi_pass unix:/run/php/php8.3-fpm.sock;trimite fișierele .phpla PHP-FPM; calea trebuie să fie exact socket-ul din pasul 1client_max_body_size 64M;mărimea maximă a unui fișier încărcat, aceeași ca în PHP location ~* /wp-content/uploads/.*\.php$interzice rularea scripturilor PHP din folderul cu fișiere încărcate location ~ /\.(?!well-known)blochează fișierele ascunse ( .htaccess,.git), dar lasă accesibil/.well-known/pentru Let's EncryptActivați site-ul, verificați configurația și reîncărcați nginx:
ln -s /etc/nginx/sites-available/DOMENIU /etc/nginx/sites-enabled/ nginx -t systemctl reload nginxnginx -ttrebuie să afișezesyntax is okșitest is successful. Dacă afișează o eroare, corectați rândul indicat și repetați testul înainte de reîncărcare.
Pasul 5. Activați HTTPS
Instalați certbot cu modulul pentru nginx:
apt install -y certbot python3-certbot-nginxObțineți certificatul pentru ambele nume:
certbot --nginx -d DOMENIU -d www.DOMENIULa prima rulare, certbot cere o adresă de email și acceptarea condițiilor Let's Encrypt. Dacă întreabă dacă să redirecționeze HTTP spre HTTPS, alegeți redirecționarea. La final apare un mesaj care începe cu „Congratulations!”: certbot a adăugat certificatul în configurația nginx și a reîncărcat nginx.
Certificatul este valabil 90 de zile și se reînnoiește automat. Verificați reînnoirea:
certbot renew --dry-run
Detalii și erori frecvente: Server web cu HTTPS: nginx sau Apache și Let's Encrypt.
Pasul 6. Finalizați instalarea în browser
- Deschideți
https://DOMENIU. Apare asistentul de instalare WordPress. - Alegeți limba site-ului și continuați.
- Completați titlul site-ului, numele administratorului, parola și adresa de email. Nu folosiți
adminca nume și păstrați parola puternică propusă de WordPress. - Confirmați instalarea, apoi intrați în panoul de administrare la
https://DOMENIU/wp-admin.
Instalați WordPress după pasul 5: așa, site-ul își salvează de la început adresa cu https://.
Securitate
- Actualizări WordPress. Actualizările minore de securitate se instalează automat. Versiunile majore, plugin-urile și temele le actualizați din panoul de administrare WordPress; pentru plugin-uri puteți activa actualizarea automată din lista de plugin-uri. Ștergeți plugin-urile și temele pe care nu le folosiți.
- Permisiuni. După ce încărcați fișiere prin SFTP ca
root, rulați din nou toate cele patru comenzi din pasul 3, punctul 5 (pe AlmaLinux, cuapache:apache): Transferul fișierelor pe server (scp, rsync, SFTP). - Sistemul. Activați actualizările automate de securitate și fail2ban: Actualizări de sistem și actualizări automate de securitate, Protecție împotriva încercărilor de ghicire a parolei cu fail2ban.
Dezactivați și editorul de cod din panoul WordPress, ca un cont de administrator compromis să nu poată modifica direct fișierele PHP:
sed -i "/That's all, stop editing/i define( 'DISALLOW_FILE_EDIT', true );" /var/www/DOMENIU/wp-config.phpCopii de rezervă zilnice
Salvați în fiecare zi baza de date și folderul wp-content, cu temele, plugin-urile și fișierele încărcate. Scriptul de mai jos rulează zilnic prin cron. Dacă folderul /etc/cron.daily nu există pe server, instalați întâi pachetul cron (Ubuntu, Debian) sau cronie (AlmaLinux, CentOS Stream).
Creați folderul pentru copii și fișierul scriptului:
mkdir -p /root/backup nano /etc/cron.daily/wordpress-backupLipiți conținutul de mai jos, înlocuiți
DOMENIUși salvați:#!/bin/sh D=$(date +%F) mysqldump --single-transaction wordpress | gzip > /root/backup/wordpress-db-$D.sql.gz tar -czf /root/backup/wp-content-$D.tar.gz -C /var/www/DOMENIU wp-content find /root/backup -type f -mtime +7 -deleteFaceți scriptul executabil și rulați-l o dată pentru test:
chmod +x /etc/cron.daily/wordpress-backup /etc/cron.daily/wordpress-backup ls -lh /root/backupTrebuie să apară două fișiere cu data de azi. De acum, scriptul rulează zilnic, iar copiile mai vechi de 7 zile se șterg singure. Pe un disc mic (Standard S are 20 GB), urmăriți spațiul ocupat: Discul serverului este plin.
Atenție Copiile din
/root/backupstau pe același server și se pierd odată cu el. Copiați-le regulat în altă parte: pe alt server sau într-un spațiu de stocare extern. BLACKBOX nu face automat copii de rezervă ale datelor de pe server: Strategia de backup pentru serverul dvs..
Performanță
OPcache. Cache-ul de cod PHP este activ implicit. Verificați: rezultatul trebuie să conțină Zend OPcache.
php-fpm8.3 -m | grep -i opcacheCache de pagini. Instalați din panoul WordPress un singur plugin de cache al paginilor, de exemplu WP Super Cache. Pluginul salvează paginile gata generate și le servește din nou fără interogări la baza de date, deci mult mai repede.
Memorie swap. Pe planurile cu 2 GB RAM, cum este Standard S, adăugați 1–2 GB de swap, ca vârfurile de trafic să nu oprească MariaDB din lipsă de memorie: Adăugarea memoriei swap. Dacă serverul folosește swap tot timpul, treceți la un plan mai mare. Cum vedeți încărcarea: Diagnosticarea încărcării serverului (CPU, RAM, disc, rețea).
AlmaLinux 9 și CentOS Stream 9
Pașii sunt aceiași, cu diferențele de mai jos. SELinux este activ: nu-l dezactivați, ci setați etichetele corecte.
Activați PHP 8.3 (implicit, sistemul instalează PHP 8.0), instalați pachetele și porniți serviciile, care aici nu pornesc singure. Extensia curl este inclusă în pachetul de bază PHP.
dnf module enable -y php:8.3 dnf install -y nginx mariadb-server php-fpm php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip nano tar systemctl enable --now nginx mariadb php-fpmFolosiți căile și numele din coloana din dreapta:
Ce Ubuntu și Debian AlmaLinux și CentOS Stream Utilizatorul PHP-FPM și proprietarul fișierelor www-dataapacheSocket-ul PHP-FPM /run/php/php8.3-fpm.sock/run/php-fpm/www.sockFișierul site-ului nginx /etc/nginx/sites-available/DOMENIUși link însites-enabled/etc/nginx/conf.d/DOMENIU.conf, fără linkLimitele de încărcare PHP /etc/php/8.3/fpm/conf.d/99-wordpress.ini/etc/php.d/99-wordpress.iniServiciul PHP-FPM php8.3-fpmphp-fpmMariaDB ascultă aici pe toate interfețele: legați-l la
127.0.0.1ca în Baze de date: MariaDB/MySQL și PostgreSQL.În configurația nginx, înlocuiți blocul
location ~ \.php$cu acesta (fișierulsnippets/fastcgi-php.confnu există aici):location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }Treceți fișierele în proprietatea utilizatorului
apache, apoi permiteți prin SELinux scrierea în folderul site-ului (încărcări, actualizări) și conexiunile PHP spre internet (descărcarea actualizărilor și a plugin-urilor):chown -R apache:apache /var/www/DOMENIU dnf install -y policycoreutils-python-utils semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/DOMENIU(/.*)?" restorecon -Rv /var/www/DOMENIU setsebool -P httpd_can_network_connect 1Dacă mai târziu mutați (
mv) în folderul site-ului fișiere din alt folder, refaceți etichetele SELinux:restorecon -Rv /var/www/DOMENIUInstalați certbot din depozitul EPEL și porniți timerul de reînnoire, care aici nu pornește singur:
dnf install -y epel-release dnf install -y certbot python3-certbot-nginx systemctl enable --now certbot-renew.timerVerificarea OPcache se face cu
php-fpmîn loc dephp-fpm8.3:php-fpm -m | grep -i opcache
Probleme frecvente
| Mesaj sau simptom | Cauza | Ce faceți |
|---|---|---|
502 Bad Gateway |
PHP-FPM este oprit sau fastcgi_pass indică alt socket |
verificați systemctl status php8.3-fpm și comparați fastcgi_pass cu rezultatul ls /run/php/ |
| Browserul descarcă fișierul PHP sau afișează pagina implicită nginx | fișierul site-ului nu este activat sau lipsește blocul pentru .php |
verificați linkul din sites-enabled, rulați nginx -t și reîncărcați nginx |
| „Error establishing a database connection” (sau traducerea lui) | date greșite în wp-config.php ori MariaDB oprit |
comparați rândurile DB_ cu pasul 2; verificați systemctl status mariadb |
413 Request Entity Too Large |
fișierul depășește client_max_body_size |
măriți limita în nginx și în fișierul 99-wordpress.ini, apoi reîncărcați nginx și reporniți PHP-FPM |
| WordPress cere date FTP când instalați un plugin | fișierele nu aparțin utilizatorului PHP-FPM | rulați din nou chown din pasul 3 (apache:apache pe AlmaLinux) |
| Încărcările sau actualizările eșuează pe AlmaLinux, cu „Permission denied” | etichetele SELinux | repetați comenzile semanage, restorecon și setsebool de mai sus |
| certbot nu obține certificatul | domeniul nu indică serverul sau portul 80 este blocat | verificați înregistrările A; vedeți Site-ul nu se deschide |
Erorile nginx sunt în /var/log/nginx/error.log.
Întrebări frecvente
Pot pune mai multe site-uri WordPress pe același server?
Da. Pentru fiecare site, repetați pașii 2–6 cu o bază de date, un utilizator, un folder în /var/www/ și un fișier nginx separate; scriptul mariadb-secure-installation nu se mai rulează. Adăugați baza de date și folderul noului site și în scriptul de copii de rezervă. Urmăriți memoria și spațiul pe disc.
WordPress nu trimite emailuri (resetarea parolei, formularele de contact). Pe un server nou, de regulă nu este configurat un serviciu de trimitere a emailurilor. Instalați un plugin SMTP și conectați-l la contul unui serviciu de email.
Am deja un site WordPress la alt furnizor. Cum îl mut aici? Pregătiți serverul cu pașii 1, 2 și 4, apoi urmați Mutarea unui site pe serverul BLACKBOX: copiați fișierele, importați baza de date și schimbați DNS-ul la final.
Poate BLACKBOX să instaleze WordPress în locul meu? Da, ca serviciu profesional la cerere, prin suport. Volumul lucrării, prețul și condițiile le primiți în oferta echipei: Servicii profesionale la cerere: administrare, DevOps, migrare.