LEMP yığını (Linux, Nginx, MariaDB, PHP-FPM), PHP sitelerini sunmak için Apache'ye hızlı ve hafif bir alternatiftir. AlmaLinux 9'da her şey resmi AppStream deposundan gelir, ancak SELinux ve firewalld biraz dikkat ister. Bu rehber, VPS Linux Infrawire sunucunuzda temiz bir kurulum yapmanıza eşlik eder; aynı adımlar Rocky Linux 9'da da geçerlidir.
📋 Ön koşullar
- AlmaLinux 9 yüklü bir KVM VPS (IP adresi ve root parolası müşteri alanınızda yer alır)
- root olarak SSH erişimi
VPS_IPadresine yönlenen birexample.comalan adı
1. Sistemi güncelleyin ve araçları kurun
Bashdnf -y update dnf -y install nano policycoreutils-python-utils
policycoreutils-python-utils, SELinux bölümünde kullanılan semanage aracını sağlar.
2. Nginx'i kurun ve güvenlik duvarını açın
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. MariaDB'yi kurun
Bashdnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation
Sihirbazı yanıtlayarak root parolası belirleyin, anonim kullanıcıları kaldırın, uzaktan root girişini yasaklayın ve test veritabanını silin. Ardından özel bir veritabanı ve kullanıcı oluşturun:
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. PHP 8.3'ü AppStream modülünden kurun
AppStream birden fazla PHP akışı sunar. Kurmadan önce istediğinizi seçin:
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
Varsayılan olarak PHP-FPM havuzu apache kullanıcısıyla çalışır. Nginx nginx kullanıcısıyla çalıştığı için havuzu ve oturum dizinlerini buna göre ayarlayın:
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
Havuz /run/php-fpm/www.sock Unix soketini dinler.
5. Server block oluşturun
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. SELinux'u yapılandırın
SELinux'u enforcing modunda bırakın (getenforce). /var/www altında oluşturulan dosyalar zaten httpd_sys_content_t etiketini alır, ancak başka yerden mv ile taşınan dosyalar eski etiketini korur. Bunları yeniden etiketleyin ve yazma iznini yalnızca gereken dizinlere verin:
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
Boolean'ları yalnızca uygulamanız gerektiriyorsa etkinleştirin:
Bash# PHP bir veritabanına TCP ile bağlanıyor (uzak sunucu veya 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # PHP veya Nginx dışarıya bağlantı kuruyor (API'ler, bir uygulamaya proxy_pass) setsebool -P httpd_can_network_connect 1
Soketi üzerinden erişilen yerel bir MariaDB için bunlardan hiçbiri gerekmez. SELinux'un neyi engellediğini görmek için ausearch -m avc -ts recent çalıştırın. Bir sorunu asla setenforce 0 ile "çözmeyin".
7. PHP'yi test edin ve test dosyasını silin
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
HTTP/1.1 200 OK beklenir. phpinfo() sayfası yapılandırmanızı ifşa eder; hemen silin. Son olarak hizmetleri kontrol edin:
Bashsystemctl is-active nginx php-fpm mariadb
🛠️ Sorun giderme
502 Bad Gateway. PHP-FPM durmuş ya da fastcgi_pass içindeki soket yolu yanlış. systemctl status php-fpm çalıştırın, ls -l /run/php-fpm/www.sock ile kontrol edin ve /var/log/nginx/error.log dosyasını okuyun. Günlükte soket için Permission denied yazıyorsa ausearch ile bir AVC reddi arayın.
403 Forbidden veya Permission denied. Sahipliği (nginx:nginx) ve SELinux etiketini ls -Z /var/www/example.com/public ile kontrol edin. Etiket httpd_sys_content_t olmalı; değilse restorecon -Rv çalıştırın.
"File not found." veya boş sayfa. root yolu ya da SCRIPT_FILENAME satırı yanlış. İkisini de kontrol edip nginx -t çalıştırın.
Harici bir veritabanına veya API'ye bağlanılamıyor. SELinux giden bağlantıları varsayılan olarak engeller: yukarıda gösterildiği gibi httpd_can_network_connect_db veya httpd_can_network_connect değerini etkinleştirin.
🎉 Nginx, MariaDB ve PHP-FPM AlmaLinux 9 üzerinde çalışıyor ve SELinux hâlâ enforcing modunda.