Renunț la Apache2 și trec la Nginx

  • 3 minute de citit
  • 8 exemple de cod în Shell
  • 1 imagine

Disponibil și în English

Pe această pagină

Salut,

Am vrut să găzduiesc singur blogul meu WordPress și pentru asta am ales un furnizor de găzduire pe care nu îl mai recomand..

Pentru că sunt leneș și nu știu să configurez prea bine serverele web, am folosit instalarea WordPress dintr-un click a lui XXX. Pachetul a instalat WordPress și a făcut următoarele:

  • Activează firewall-ul UFW, permițând doar accesul SSH (portul 22, cu limită de rată), HTTP (portul 80) și HTTPS (portul 443).
  • Setează parola de root pentru MySQL, rulează mysql_secure_installation și creează un utilizator wordpress cu permisiunile necesare.
  • Configurează utilizatorul debian-sys-maint în MySQL, ca scripturile de inițializare ale sistemului pentru MySQL să funcționeze fără a cere parola utilizatorului root din MySQL.
  • Creează fișierul inițial de configurare WordPress, pentru a seta cheile de sare și a permite instanței WordPress să se conecteze la baza de date.
  • Dezactivează XML-RPC pentru a ajuta la prevenirea atacurilor DDoS și a atacurilor de forță brută. (Dacă ai nevoie de xmlrpc, rulează „a2disconf block-xmlrpc” din terminal pentru a dezactiva blocarea.)
  • Modifică unele setări PHP pentru a crește dimensiunea maximă a fișierelor și timpul maxim de execuție.
  • Activează modulul de rescriere Apache, pentru ca funcția de permalink-uri din WordPress să funcționeze.
  • Configurează Apache cu UseCanonicalName On pentru a atenua CVE-2017-8295.

Este foarte convenabil, pentru că poți avea un blog complet funcțional în mai puțin de 10 minute, singurul lucru care lipsește este configurarea emailului.

Dar există o problemă. Apache2 este vechi, mai greu de configurat, de securizat și de întreținut… Nu mi-a plăcut, așa că am vrut să îl înlocuiesc cu Nginx.


Pregătirea inițială

Primul pas pe care l-am făcut a fost să opresc Apache2 și să blochez porturile web din firewall-ul cloud al lui XXX. Blocarea porturilor este importantă, pentru că nu vreau să servesc din greșeală fișierul meu inițial de configurare WordPress ca text.

sudo systemctl stop apache2

Apoi, am instalat dependențele necesare:

sudo apt updatesudo apt install nginxsudo apt install python-certbot-nginxsudo apt install php7.2-cli php7.2-fpm php7.2-mysql php7.2-json php7.2-opcache php7.2-mbstring php7.2-xml php7.2-gd php7.2-curl

Configurarea Nginx

Am șters fișierul de configurare implicit al Nginx și am creat fișierul de configurare pentru blogul meu WordPress.

sudo rm /etc/nginx/sites-available/default /etc/nginx/sites-enabled/defaultsudo touch /etc/nginx/sites-available/wp-blogsudo ln -s /etc/nginx/sites-available/wp-blog /etc/nginx/sites-enabled/

Deschide /etc/nginx/sites-available/wp-blog și lipește următoarele:

# Redirecționează HTTP -> HTTPSserver {    listen 80;    server_name www.domain.tld domain.tld;    include snippets/letsencrypt.conf;    return 301 https://domain.tld$request_uri;}# Ascultă pe HTTPSserver {    listen 443 ssl http2;    server_name domain.tld;    root /var/www/html;    index index.php;    # Parametrii SSL    ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;    ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;    ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/chain.pem;    include snippets/ssl.conf;    include snippets/letsencrypt.conf;    # fișierele de log    access_log /var/log/nginx/domain.tld.access.log;    error_log /var/log/nginx/domain.tld.error.log;    location = /favicon.ico {        log_not_found off;        access_log off;    }    location = /robots.txt {        allow all;        log_not_found off;        access_log off;    }    location / {        try_files $uri $uri/ /index.php?$args;    }    location ~ .php$ {        include snippets/fastcgi-php.conf;        fastcgi_pass unix:/run/php/php7.2-fpm.sock;    }    location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {        expires max;        log_not_found off;    }}

Apoi, creează /etc/nginx/snippets/letsencrypt.conf și lipește:

location ^~ /.well-known/acme-challenge/ {  allow all;  root /var/lib/letsencrypt/;  default_type "text/plain";  try_files $uri =404;}

Și, în final, creează /etc/nginx/snippets/ssl.conf și lipește:

ssl_dhparam /etc/ssl/certs/dhparam.pem;ssl_session_timeout 1d;ssl_session_cache shared:SSL:50m;ssl_session_tickets off;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';ssl_prefer_server_ciphers on;ssl_stapling on;ssl_stapling_verify on;resolver 8.8.8.8 8.8.4.4 valid=300s;resolver_timeout 30s;add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";add_header X-Frame-Options SAMEORIGIN;add_header X-Content-Type-Options nosniff;

Ultimul lucru de care avem nevoie este să creăm fișierul dh-param.pem:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Acum, ca să testăm că și configurația noastră este validă, rulăm nginx -t. Nu ar trebui să vezi nicio eroare.

Notă: Ar trebui să înlocuiești domain.tld cu propriul tău domeniu. Eu aveam deja certificatul Let’s Encrypt pe mașină; dacă nu ai unul, ar trebui să generezi unul folosind certbot.

Dezinstalarea Apache2

Ar trebui să pornești site-ul și să verifici dacă rulează corect, apoi poți dezinstala apache2.

sudo apt-get purge apache2sudo rm -rf /etc/apache2 

Concluzii

Am scăpat de Apache2 în mai puțin de 20 de minute, iar blogul rulează. Dacă vrei să încerci și tu, te rog să faci mai întâi o copie de rezervă!

Mulțumesc pentru lectură!