Polski

Instalacja stosu LEMP na VPS Linux z AlmaLinux 9

2 min
Hosting VPS/VDS

Stos LEMP (Linux, Nginx, MariaDB, PHP-FPM) to szybka i lekka alternatywa dla Apache w obsłudze stron PHP. W AlmaLinux 9 wszystko pochodzi z oficjalnego repozytorium AppStream, ale SELinux i firewalld wymagają odrobiny uwagi. Ten poradnik prowadzi przez czystą instalację na Twoim VPS Linux Infrawire; te same kroki działają w Rocky Linux 9.

📋 Wymagania wstępne

  • VPS KVM z AlmaLinux 9 (adres IP i hasło roota znajdziesz w panelu klienta)
  • Dostęp SSH jako root
  • Domena example.com wskazująca na VPS_IP

1. Aktualizacja systemu i instalacja narzędzi

Bash
dnf -y update dnf -y install nano policycoreutils-python-utils

Pakiet policycoreutils-python-utils dostarcza semanage, używane w sekcji o SELinux.

2. Instalacja Nginx i otwarcie zapory

Bash
dnf -y install nginx systemctl enable --now nginx firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload firewall-cmd --list-services

3. Instalacja MariaDB

Bash
dnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation

Odpowiedz na pytania kreatora: ustaw hasło roota, usuń anonimowych użytkowników, zablokuj zdalne logowanie roota i usuń bazę testową. Następnie utwórz bazę danych i osobnego użytkownika:

Bash
mysql -u root -p
SQL
1CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; 3GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; 4FLUSH PRIVILEGES; 5EXIT;

4. Instalacja PHP 8.3 z modułu AppStream

AppStream oferuje kilka strumieni PHP. Przed instalacją wybierz właściwy:

Bash
dnf module list php dnf -y module reset php dnf -y module enable php:8.3 dnf -y install php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip php -v

Domyślnie pula PHP-FPM działa jako użytkownik apache. Ponieważ Nginx działa jako nginx, dopasuj pulę i katalogi sesji:

Bash
sed -i 's/^user = apache/user = nginx/; s/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf chown -R root:nginx /var/lib/php/session /var/lib/php/wsdlcache /var/lib/php/opcache grep -E '^(user|group|listen)' /etc/php-fpm.d/www.conf systemctl enable --now php-fpm

Pula nasłuchuje na gnieździe Unix /run/php-fpm/www.sock.

5. Utworzenie server blocku

Bash
mkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 root /var/www/example.com/public; 6 index index.php index.html; 7 8 location / { 9 try_files $uri $uri/ /index.php?$query_string; 10 } 11 12 location ~ \.php$ { 13 include fastcgi_params; 14 fastcgi_pass unix:/run/php-fpm/www.sock; 15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 16 } 17 18 location ~ /\.(?!well-known) { 19 deny all; 20 } 21}
Bash
nginx -t && systemctl reload nginx

6. Konfiguracja SELinux

Pozostaw SELinux w trybie enforcing (getenforce). Pliki tworzone w /var/www dostają już etykietę httpd_sys_content_t, ale pliki przeniesione przez mv z innego miejsca zachowują starą. Nadaj im etykiety ponownie i przyznaj zapis tylko katalogom, które go potrzebują:

Bash
restorecon -Rv /var/www/example.com mkdir -p /var/www/example.com/public/uploads semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/public/uploads(/.*)?' restorecon -Rv /var/www/example.com/public/uploads

Włączaj wartości logiczne tylko wtedy, gdy aplikacja ich potrzebuje:

Bash
# PHP łączy się z bazą przez TCP (serwer zdalny lub 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # PHP lub Nginx nawiązuje połączenia wychodzące (API, proxy_pass do aplikacji) setsebool -P httpd_can_network_connect 1

Lokalna MariaDB dostępna przez gniazdo nie wymaga żadnej z nich. Aby zobaczyć, co blokuje SELinux, uruchom ausearch -m avc -ts recent. Nigdy nie „naprawiaj” problemu poleceniem setenforce 0.

7. Test PHP i usunięcie pliku testowego

Bash
echo '<?php phpinfo();' > /var/www/example.com/public/info.php curl -sI http://example.com/info.php | head -n 1 rm /var/www/example.com/public/info.php

Oczekuj HTTP/1.1 200 OK. Strona phpinfo() ujawnia konfigurację, więc usuń ją od razu. Na koniec sprawdź usługi:

Bash
systemctl is-active nginx php-fpm mariadb

🛠️ Rozwiązywanie problemów

502 Bad Gateway. PHP-FPM jest zatrzymany lub ścieżka gniazda w fastcgi_pass jest błędna. Uruchom systemctl status php-fpm, sprawdź ls -l /run/php-fpm/www.sock i przeczytaj /var/log/nginx/error.log. Jeśli log pokazuje Permission denied na gnieździe, poszukaj odmowy AVC przez ausearch.

403 Forbidden lub Permission denied. Sprawdź właściciela (nginx:nginx) i etykietę SELinux poleceniem ls -Z /var/www/example.com/public. Powinna to być httpd_sys_content_t; jeśli nie, wykonaj restorecon -Rv.

„File not found.” lub pusta strona. Błędna ścieżka root albo linia SCRIPT_FILENAME. Sprawdź obie, a potem nginx -t.

Brak połączenia z zewnętrzną bazą lub API. SELinux domyślnie blokuje połączenia wychodzące: włącz httpd_can_network_connect_db lub httpd_can_network_connect, jak pokazano wyżej.


🎉 Nginx, MariaDB i PHP-FPM działają na AlmaLinux 9, a SELinux nadal pracuje w trybie enforcing.

Bądź na bieżąco z najnowszymi ofertami, zniżkami i promocjami specjalnymi.

Zobacz promocje

Używamy plików cookie

Używamy plików cookie analitycznych, aby ulepszać nasz serwis. Nie sprzedajemy danych stronom trzecim. Więcej w polityce prywatności.