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.comwskazująca naVPS_IP
1. Aktualizacja systemu i instalacja narzędzi
Bashdnf -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
Bashdnf -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
Bashdnf -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:
Bashmysql -u root -p
SQL1CREATE 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:
Bashdnf 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:
Bashsed -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
Bashmkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx1server { 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}
Bashnginx -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ą:
Bashrestorecon -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
Bashecho '<?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:
Bashsystemctl 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.