AlmaLinux 9 Linux VPS'e LEMP Yığını Kurulumu

2 min
VPS/VDS Hosting

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_IP adresine yönlenen bir example.com alan adı

1. Sistemi güncelleyin ve araçları kurun

Bash
dnf -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

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. MariaDB'yi kurun

Bash
dnf -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:

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. PHP 8.3'ü AppStream modülünden kurun

AppStream birden fazla PHP akışı sunar. Kurmadan önce istediğinizi seçin:

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

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:

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

Havuz /run/php-fpm/www.sock Unix soketini dinler.

5. Server block oluşturun

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. 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:

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

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

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

HTTP/1.1 200 OK beklenir. phpinfo() sayfası yapılandırmanızı ifşa eder; hemen silin. Son olarak hizmetleri kontrol edin:

Bash
systemctl 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.

En yeni teklifler, indirimler ve özel promosyonlardan haberdar olun.

Promosyonları gör

Çerez kullanıyoruz

Sitemizdeki deneyiminizi iyileştirmek için analiz çerezleri kullanıyoruz. Hiçbir veri üçüncü taraflara satılmaz. Daha fazlasını şurada öğrenin: gizlilik politikası.