Server web cu HTTPS: nginx sau Apache și Let's Encrypt
Instalarea nginx sau Apache, configurarea unui site pentru domeniul dvs. și obținerea unui certificat gratuit Let's Encrypt cu certbot.
Pe această pagină
Acest ghid vă arată cum publicați un site pe serverul BLACKBOX: instalați serverul web nginx sau Apache, configurați site-ul pentru domeniul dvs. și obțineți un certificat HTTPS gratuit de la Let's Encrypt, cu certbot. Lucrați în terminalul serverului, conectat prin SSH ca root (Conectarea la server prin SSH (Windows, macOS, Linux)). Panoul app.blackbox.md nu are o secțiune pentru servere web sau certificate: din el vă trebuie doar adresa IP a serverului, afișată pe cardul serverului în pagina „Serverele mele” (app.blackbox.md/my-servers).
Disponibil pentru: oricine are acces root prin SSH la un server BLACKBOX cu Ubuntu 24.04, 22.04 sau 20.04, Debian 12 sau 11, AlmaLinux 9 ori CentOS Stream 9.
În comenzi, înlocuiți DOMENIU cu domeniul dvs. fără www (de exemplu example.com). Alegeți un singur server web, nginx sau Apache: ambele folosesc porturile 80 și 443 și nu pot rula în același timp.
Dacă aveți un plan „VPS hosting” cu panou de control, nu instalați alt server web peste panou: site-urile și certificatele se configurează din panoul de control. Dacă nu știți ce panou aveți sau cum intrați în el, scrieți suportului. Vedeți Planurile „VPS hosting” cu panou de control.
Înainte de a începe
| Condiție | Detalii |
|---|---|
| Domeniul indică serverul | înregistrările A pentru DOMENIU și www.DOMENIU au valoarea IP_SERVER și nu există nicio înregistrare AAAA rămasă de la o găzduire veche; vedeți Cum îndreptați domeniul către server |
| Porturile 80 și 443 sunt deschise | pe un server nou, filtrarea din rețea BLACKBOX permite SSH (22), HTTP (80), HTTPS (443) și ping; firewall-ul din sistem (ufw, firewalld) nu este activat |
| Porturile 80 și 443 sunt libere | niciun alt program (alt server web) nu ascultă pe ele |
Verificați pe server ce programe ascultă pe porturile 80 și 443. Pe un server nou comanda nu afișează nimic:
ss -tlnp | grep -E ':80|:443'Dacă ați activat singur firewall-ul din sistem, permiteți HTTP și HTTPS. Pe Ubuntu și Debian (ufw):
ufw allow 80,443/tcpPe AlmaLinux și CentOS Stream (firewalld):
firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --reloadNu activați firewall-ul doar pentru acest ghid. Dacă vreți să-l activați, permiteți întâi SSH și păstrați deschisă o a doua sesiune SSH, ca să nu pierdeți accesul: Firewall: filtrarea din rețea și ufw/firewalld pe server.
Varianta 1: nginx
Ubuntu și Debian
Instalați nginx. Serviciul pornește automat după instalare.
apt update apt install -y nginxCreați directorul site-ului și o pagină de test:
mkdir -p /var/www/DOMENIU echo "DOMENIU OK" > /var/www/DOMENIU/index.htmlCreați fișierul de configurare al site-ului:
nano /etc/nginx/sites-available/DOMENIULipiți conținutul de mai jos, 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.html index.htm; location / { try_files $uri $uri/ =404; } }Activați site-ul:
ln -s /etc/nginx/sites-available/DOMENIU /etc/nginx/sites-enabled/Verificați configurația și reîncărcați nginx.
nginx -ttrebuie să afișeze „syntax is ok” și „test is successful”; dacă afișează o eroare, corectați fișierul înainte de reîncărcare.nginx -t systemctl reload nginx
AlmaLinux și CentOS Stream
Instalați și porniți nginx:
dnf install -y nginx systemctl enable --now nginxCreați directorul site-ului și pagina de test, apoi aplicați eticheta SELinux pentru conținut web: fișierele fără ea primesc „403 Forbidden”. Rulați din nou
restoreconși după ce mutați (mv) în director fișiere din alt loc.mkdir -p /var/www/DOMENIU echo "DOMENIU OK" > /var/www/DOMENIU/index.html restorecon -Rv /var/wwwCreați fișierul de configurare (dacă
nanolipsește, prima comandă îl instalează):dnf install -y nano nano /etc/nginx/conf.d/DOMENIU.confLipiți același bloc
server { … }ca la Ubuntu și Debian, salvați și ieșiți.Verificați configurația și reîncărcați nginx:
nginx -t systemctl reload nginx
Varianta 2: Apache
Ubuntu și Debian
Instalați Apache. Serviciul pornește automat după instalare.
apt update apt install -y apache2Creați directorul site-ului și pagina de test, cu comenzile de la pasul 2 din varianta nginx.
Creați fișierul de configurare al site-ului:
nano /etc/apache2/sites-available/DOMENIU.confLipiți conținutul de mai jos, salvați și ieșiți:
<VirtualHost *:80> ServerName DOMENIU ServerAlias www.DOMENIU DocumentRoot /var/www/DOMENIU ErrorLog ${APACHE_LOG_DIR}/DOMENIU-error.log CustomLog ${APACHE_LOG_DIR}/DOMENIU-access.log combined </VirtualHost>Activați site-ul, verificați configurația și reîncărcați Apache.
apachectl configtesttrebuie să afișeze „Syntax OK”.a2ensite DOMENIU.conf apachectl configtest systemctl reload apache2
AlmaLinux și CentOS Stream
Instalați Apache (
httpd) și modulul HTTPS (mod_ssl, necesar pentru certbot), apoi porniți serviciul:dnf install -y httpd mod_ssl systemctl enable --now httpdCreați directorul site-ului și pagina de test, cu comenzile de la pasul 2 din varianta nginx, inclusiv
restorecon.Creați fișierul de configurare al site-ului (dacă
nanolipsește, instalați-l ca la pasul 3 din varianta nginx):nano /etc/httpd/conf.d/DOMENIU.confLipiți blocul
<VirtualHost *:80>de la Ubuntu și Debian, cu alte căi pentru jurnale:/var/log/httpd/DOMENIU-error.logși/var/log/httpd/DOMENIU-access.log. Salvați și ieșiți.Verificați configurația și reîncărcați Apache:
apachectl configtest systemctl reload httpd
Verificarea site-ului prin HTTP
De pe calculatorul dvs. deschideți http://DOMENIU în browser: trebuie să apară textul „DOMENIU OK”. Sau rulați comanda de mai jos (pe Windows, în PowerShell, scrieți curl.exe în loc de curl); răspunsul trebuie să înceapă cu HTTP/1.1 200 OK. Dacă site-ul nu răspunde, rezolvați întâi problema: certbot are nevoie de un site accesibil prin HTTP.
curl -I http://DOMENIUCertificatul Let's Encrypt cu certbot
Instalarea certbot
Ubuntu și Debian. Pentru Apache, instalați python3-certbot-apache în locul python3-certbot-nginx.
apt install -y certbot python3-certbot-nginxAlmaLinux și CentOS Stream. Certbot vine din depozitul EPEL. Ultima comandă pornește timerul de reînnoire, care aici nu se activează singur. Pentru Apache, instalați python3-certbot-apache.
dnf install -y epel-release
dnf install -y certbot python3-certbot-nginx
systemctl enable --now certbot-renew.timerPe Ubuntu și Debian puteți folosi și varianta snap, recomandată de dezvoltatorii certbot: are de obicei o versiune mai nouă și include pluginurile nginx și Apache. Folosiți fie apt, fie snap, nu pe amândouă. Dacă ați instalat deja certbot cu apt, eliminați-l:
apt remove -y certbotPe Debian, instalați întâi snapd:
apt install -y snapd
snap install coreApoi instalați certbot din snap:
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbotObținerea certificatului
Rulați certbot cu pluginul serverului dvs. web. Pentru nginx:
certbot --nginx -d DOMENIU -d www.DOMENIUPentru Apache:
certbot --apache -d DOMENIU -d www.DOMENIULa prima rulare, certbot vă cere o adresă de email și acceptarea condițiilor Let's Encrypt: scrieți adresa și răspundeți
Y. La întrebarea despre buletinul informativ EFF puteți răspundeN.Dacă certbot întreabă dacă să redirecționeze HTTP spre HTTPS (versiunile mai vechi), alegeți „2: Redirect”. Versiunile noi adaugă redirecționarea fără să întrebe.
La final apare un mesaj care începe cu „Congratulations!”. Certificatul și cheia sunt în
/etc/letsencrypt/live/DOMENIU/, iar certbot a adăugat în configurația site-ului blocul HTTPS (portul 443) și redirecționarea de la HTTP.Deschideți
https://DOMENIUîn browser și verificați lacătul. Comanda de mai jos afișează certificatele, domeniile și data expirării („Expiry Date”):certbot certificates
Reînnoirea automată
Certificatul este valabil 90 de zile. Timerul certbot verifică certificatele de două ori pe zi și le reînnoiește singur înainte de expirare. Cu --nginx și --apache, certbot reîncarcă și serverul web după reînnoire.
| Cum ați instalat certbot | Timerul de reînnoire | Pornit automat |
|---|---|---|
| apt (Ubuntu, Debian) | certbot.timer |
da |
| snap | snap.certbot.renew.timer |
da |
| EPEL (AlmaLinux, CentOS Stream) | certbot-renew.timer |
nu: îl porniți cu systemctl enable --now certbot-renew.timer |
Verificați timerul și simulați o reînnoire. --dry-run nu emite un certificat nou și se încheie cu „Congratulations, all simulated renewals succeeded” (în versiunile vechi, „Congratulations, all renewals succeeded”).
systemctl list-timers | grep -i certbot
certbot renew --dry-runNotă Let's Encrypt nu mai trimite emailuri înainte de expirarea certificatelor și a anunțat că va scurta treptat durata lor de valabilitate. Nu programați reînnoiri manuale după calendar: lăsați timerul certbot să lucreze și verificați din când în când data expirării cu
certbot certificates.
Certificat wildcard (*.DOMENIU) cu validare prin DNS
Un certificat wildcard acoperă toate subdomeniile de un nivel (www.DOMENIU, api.DOMENIU etc.) și se obține doar cu validare prin DNS: certbot creează temporar înregistrarea TXT _acme-challenge.DOMENIU. Ca reînnoirea să rămână automată, certbot are nevoie de un plugin pentru furnizorul dvs. de DNS. Exemplul este pentru Cloudflare; pentru alți furnizori vedeți lista pluginurilor DNS din documentația certbot. Fără plugin (--manual), certificatul nu se mai reînnoiește automat. Dacă aveți nevoie de wildcard, urmați pașii de mai jos în locul celor de la „Obținerea certificatului”.
În contul Cloudflare, creați un token doar pentru certbot: „My Profile” → „API Tokens” → „Create Token” → șablonul „Edit zone DNS”. La „Zone Resources” alegeți doar zona
DOMENIU, creați tokenul și copiați-l. Nu refolosiți tokenul conectat în pagina „DNS” a panoului: pe unul separat îl puteți revoca fără să afectați panoul.Instalați pluginul Cloudflare. Ubuntu și Debian:
apt install -y python3-certbot-dns-cloudflareAlmaLinux și CentOS Stream:
dnf install -y python3-certbot-dns-cloudflareDacă folosiți certbot din snap:
snap set certbot trust-plugin-with-root=ok snap install certbot-dns-cloudflarePe Ubuntu 20.04, pluginul din apt este prea vechi și nu acceptă tokenuri API: folosiți certbot și pluginul din snap.
Salvați tokenul într-un fișier:
mkdir -p /root/.secrets nano /root/.secrets/cloudflare.iniConținutul fișierului, cu tokenul dvs. în locul
TOKEN_CLOUDFLARE:dns_cloudflare_api_token = TOKEN_CLOUDFLARELăsați fișierul accesibil doar pentru root:
chmod 600 /root/.secrets/cloudflare.iniObțineți certificatul.
--deploy-hookreîncarcă serverul web după fiecare reînnoire; pentru Apache scriețisystemctl reload apache2(Ubuntu, Debian) sausystemctl reload httpd(AlmaLinux, CentOS Stream).certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/cloudflare.ini -d DOMENIU -d "*.DOMENIU" --deploy-hook "systemctl reload nginx"certonlynu modifică configurația serverului web: adăugați singur în fișierul site-ului un bloc pentru HTTPS. Pentru nginx, adăugați blocul de mai jos, apoi rulaținginx -tși reîncărcați nginx. Pentru un subdomeniu, copiați blocul și schimbațiserver_nameșiroot; liniile certificatului rămân aceleași.server { listen 443 ssl; server_name DOMENIU www.DOMENIU; root /var/www/DOMENIU; ssl_certificate /etc/letsencrypt/live/DOMENIU/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/DOMENIU/privkey.pem; }Ca să redirecționați HTTP spre HTTPS, în blocul cu
listen 80înlocuiți liniileroot,indexși blocullocationcureturn 301 https://$host$request_uri;.Pentru Apache, adăugați în fișierul site-ului blocul de mai jos. Ca să redirecționați HTTP spre HTTPS, adăugați în blocul
<VirtualHost *:80>liniaRedirect permanent / https://DOMENIU/.<VirtualHost *:443> ServerName DOMENIU ServerAlias www.DOMENIU DocumentRoot /var/www/DOMENIU SSLEngine on SSLCertificateFile /etc/letsencrypt/live/DOMENIU/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/DOMENIU/privkey.pem </VirtualHost>Pe Ubuntu și Debian, activați modulul SSL, verificați configurația și reporniți Apache:
a2enmod ssl apachectl configtest systemctl restart apache2Pe AlmaLinux și CentOS Stream,
mod_ssleste deja instalat (pasul 1 din varianta Apache):apachectl configtest systemctl reload httpd
Probleme frecvente
| Mesaj sau simptom | Cauza | Ce faceți |
|---|---|---|
| „DNS problem: NXDOMAIN looking up A for DOMENIU” | înregistrarea A lipsește sau nu s-a propagat | creați înregistrarea, așteptați și verificați cu dig +short DOMENIU A |
| „Timeout during connect (likely firewall problem)” | portul 80 este blocat sau domeniul indică altă adresă | permiteți 80 și 443 în ufw/firewalld; verificați înregistrările A și AAAA; dacă tot nu merge, scrieți suportului |
| „Connection refused” | serverul web nu rulează | systemctl status nginx (sau apache2, httpd) și ss -tlnp |
| „Invalid response from http://DOMENIU/.well-known/acme-challenge/…” cu 404 | cererea ajunge la alt server: o înregistrare A sau AAAA veche ori proxy-ul Cloudflare | corectați înregistrările DNS; opriți temporar proxy-ul |
| „Could not automatically find a matching server block for DOMENIU” | lipsește server_name cu acest domeniu |
adăugați server_name, rulați nginx -t, reîncărcați și rulați din nou certbot |
| „bind() to 0.0.0.0:80 failed (98: Address already in use)” | alt server web ocupă portul 80 | opriți-l sau eliminați-l; păstrați un singur server web |
| „too many failed authorizations” sau „too many certificates” | limitele Let's Encrypt | așteptați (vedeți mai jos); testați cu --dry-run |
| „403 Forbidden” pe AlmaLinux sau CentOS Stream | eticheta SELinux a fișierelor | restorecon -Rv /var/www |
„502 Bad Gateway” pe AlmaLinux sau CentOS Stream, cu „(13: Permission denied)” în /var/log/nginx/error.log |
SELinux nu lasă nginx să se conecteze la aplicația din spate | setsebool -P httpd_can_network_connect 1; vedeți Aplicații Node.js, Python și alte servicii: nginx ca reverse proxy |
ERR_TOO_MANY_REDIRECTS prin Cloudflare |
modul SSL „Flexible” în Cloudflare | alegeți modul „Full (strict)” |
Jurnalul complet al certbot este în /var/log/letsencrypt/letsencrypt.log.
După ce corectați cauza, testați emiterea pe serverul de test Let's Encrypt, fără să obțineți un certificat real. --dry-run funcționează doar cu certonly și renew; pentru Apache scrieți --apache.
certbot certonly --nginx --dry-run -d DOMENIU -d www.DOMENIUAtenție Let's Encrypt limitează încercările: după 5 validări eșuate pentru același nume într-o oră, noile încercări sunt refuzate temporar, iar pentru exact același set de nume se pot emite cel mult 5 certificate în 7 zile. Nu rulați certbot iar și iar: testați cu
--dry-run, care nu consumă aceste limite. Detalii: limitele Let's Encrypt.
Domeniul trece prin proxy-ul Cloudflare
- Pentru prima emitere, lăsați înregistrările
DOMENIUșiwwwpe „DNS only” (în pagina „DNS” a panoului, caseta „Proxy” nebifată) sau folosiți validarea prin DNS de mai sus. - După ce site-ul funcționează cu HTTPS direct pe server, activați proxy-ul.
- În contul Cloudflare, la „SSL/TLS”, alegeți modul de criptare „Full (strict)”. Modul „Flexible” provoacă bucle de redirecționare, pentru că serverul trimite HTTP spre HTTPS.
Detalii despre proxy: Cum îndreptați domeniul către server.
Pașii următori
- Instalați un site WordPress pe acest server: WordPress pe LEMP (nginx, MariaDB, PHP).
- Publicați o aplicație Node.js sau Python prin nginx: Aplicații Node.js, Python și alte servicii: nginx ca reverse proxy.
- Încărcați fișierele site-ului în
/var/www/DOMENIU: Transferul fișierelor pe server (scp, rsync, SFTP). - Urmăriți reînnoirea: după aproximativ două luni,
certbot certificatestrebuie să arate o dată de expirare nouă. Dacă data nu se schimbă, verificați timerul și jurnalul certbot.
Întrebări frecvente
Pot găzdui mai multe site-uri pe același server?
Da. Pentru fiecare domeniu creați un director și un fișier de configurare separat (un bloc server la nginx, un VirtualHost la Apache), apoi rulați certbot cu numele acelui domeniu.
Cum adaug un subdomeniu la un certificat existent?
Creați înregistrarea A pentru subdomeniu, adăugați-l în server_name (sau ServerAlias), reîncărcați serverul web și rulați certbot cu toate numele, cele vechi și cel nou. Pentru Apache, scrieți --apache în loc de --nginx:
certbot --nginx --expand -d DOMENIU -d www.DOMENIU -d app.DOMENIUCe se întâmplă dacă reînnoirea eșuează?
Certificatul actual rămâne valabil până la data expirării, iar timerul reîncearcă de două ori pe zi. Cauza este în /var/log/letsencrypt/letsencrypt.log; după ce o corectați, confirmați cu certbot renew --dry-run.
Poate asistentul AI să facă acești pași în locul meu?
Da, dacă tokenul lui are permisiunile „Citește lista și statusul serverelor mele” (servers:read) și „Rulează orice comandă ca root pe serverele mele” (servers:exec). Domeniul trebuie să indice deja serverul. Vedeți Exemple de sarcini pentru asistentul AI și permisiunile necesare.
Am urmat pașii, dar site-ul tot nu se deschide. Parcurgeți lista de verificări din Site-ul nu se deschide. Dacă problema rămâne, scrieți-ne: Cum contactați suportul BLACKBOX.