Sunucuyu satın aldınız, SSH ile bağlandınız ve şimdi boş bir prompt'un karşısında oturuyorsunuz. curl localhost hiçbir şey döndürmüyor, systemctl status nginx unit bulunamadı diyor ve önce web sunucusunu mu yoksa PHP'yi mi ayağa kaldırmanız gerektiğini bilmiyorsunuz. Eğer burada sırayı yanlış yaparsanız, iki saat sonra 502 Bad Gateway hatasıyla ve içinde hiçbir işe yarar bilgi olmayan bir log'la boğuşursunuz.
Doğru sıra şudur: web sunucusu, sonra PHP, sonra veritabanı. Her katmanı bir sonrakine geçmeden önce test edin. Bu on dakikanızı alır ve sonrasında saatlerinizi kurtarır.
Web sunucusunu kurmadan önce şu üç şeyi kontrol edin
Birincisi, gerçekten düşündüğünüz sunucuda mısınız? hostnamectl ve ip a komutlarını çalıştırın. Bulut sunucunuz varsa, özel IP görebilirsiniz ve genel IP başka bir yerde olabilir.
İkincisi, sistem saati. Saat geri veya ileri olursa, sonrasında SSL ve cookie'ler tuhaf davranışlar gösterir:
timedatectl set-timezone Asia/Tehran
timedatectl status
Üçüncüsü, disk alanı ve RAM. 1 GB RAM'e sahip bir sunucuda MySQL varsayılan ayarlarla kolayca OOM olur. Her kurulumdan önce free -m ve df -h komutlarına bakın.
Stack seçimi: Nginx mi Apache mi?
Kısa cevabım: Nginx. Yüksek eşzamanlı yük, daha az RAM tüketimi ve statik dosya sunumu için Nginx daha iyi bir seçimdir. Apache'yi, .htaccess'e bağımlı bir uygulamanız olduğunda ve onu yeniden yazmak istemediğinizde seçerim.
| Kriter | Nginx | Apache |
|---|---|---|
| İşleme modeli | Olay tabanlı, çok süreçli | Bağlantı başına süreç/thread |
| Ağır yük altında RAM tüketimi | Daha az | Daha fazla |
| Statik dosya | Daha hızlı | Kabul edilebilir |
| Dizin başına yapılandırma | Yok | .htaccess |
Debian 12 veya Ubuntu 22.04 ve sonrasında:
apt update
apt install -y nginx
systemctl enable --now nginx
curl -I http://127.0.0.1
Eğer HTTP/1.1 200 OK aldıysanız, ilk katman tamamdır. Almadıysanız, journalctl -u nginx -n 50 komutuna bakın. En yaygın neden: 80 portu zaten Apache veya bir panel gibi bir şey tarafından kullanılıyor. ss -tlnp | grep :80 ile kimin dinlediğini görün.
PHP kurulumu ve web sunucusuna bağlanması
PHP'yi Apache modülü olarak değil, FPM olarak kurun. FPM ayrı bir süreçtir, ayrı olarak yeniden başlatabilirsiniz ve Nginx onunla Unix socket üzerinden konuşur.
apt install -y php8.2-fpm php8.2-mysql php8.2-curl php8.2-mbstring
systemctl enable --now php8.2-fpm
ls -l /run/php/php8.2-fpm.sock
O socket'i Nginx site yapılandırmasında belirtin:
server {
listen 80;
server_name example.com;
root /var/www/example;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
}
Şimdi bir test dosyası koyun ve sunucunun dışından curl -I http://example.com/info.php ile kontrol edin. Eğer 502 aldıysanız, neredeyse her zaman yapılandırmadaki socket yolu gerçek yolla uyuşmuyor ya da PHP sürümünü yükseltmişsiniz ve socket adı değişmiş demektir. Burada hata yapıyorlar: yapılandırmayı php7.4-fpm.sock ile yazıyorlar, sonra PHP'yi 8.2'ye yükseltiyorlar ve site 502 ile düşüyor, oysa PHP'nin kendisi sağlıklı ve systemctl status php8.2-fpm yeşil gösteriyor.
Test dosyasını onayladıktan sonra silin. İnternete açık bir phpinfo(), sürümlerinizin ve modüllerinizin tam yol haritasını herkese verir.
Veritabanı: MySQL mi MariaDB mi ve gerçekten önemli olan ayarlar
Uygulamanız açıkça MySQL 8 istemiyorsa MariaDB kurun. Komut uyumluluğu yüksektir ve az RAM'li sunucularda daha hafiftir.
apt install -y mariadb-server
mysql_secure_installation
mysql_secure_installation içinde tüm sorulara evet deyin, özellikle anonim kullanıcıyı silme ve uzaktan root girişini devre dışı bırakma konusunda. Daha fazla ayrıntı MySQL güvenliği ve erişimleri kısıtlama kılavuzunda yer alıyor.
Az söylenen bir nokta: MariaDB'de bind-address varsayılan olarak 127.0.0.1'dir ve bu doğrudur. Başka bir sunucudan bağlanmak için bunu 0.0.0.0 olarak değiştirdiyseniz, 3306 portunu internete açmış olursunuz. Bu durumda en azından ufw allow from 10.0.0.5 to any port 3306 ile erişimi belirli bir IP'ye kısıtlayın.
PHP uygulamaları için veritabanı kullanıcısını % yerine localhost ile oluşturun:
CREATE DATABASE app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'güçlü-şifre';
GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
Şimdi PHP içinden PDO ile bağlanın ve bir SELECT 1 çalıştırın. Bu çalışırsa, üç katman hazırdır.
SSL ve sıkılaştırma, siteyi herkese açmadan önce
Certbot'u kurun ve sertifika alın. İlk koşul: alan adı önceden sunucunun IP'sine işaret etmeli ve 80 portu dışarıdan açık olmalı. DNS yeni ayarlandıysa, birkaç dakikadan birkaç saate kadar sürebilir; acele etmeyin ve Certbot log'unu okuyun.
apt install -y certbot python3-certbot-nginx
certbot --nginx -d example.com -d www.example.com
Tam adımlar ve yaygın hatalar Certbot ile ücretsiz sertifika kurulumu bölümünde açıklanmıştır. Bundan sonra güvenlik duvarını kapatın: yalnızca 22, 80 ve 443 açık kalsın. Bir yönetim paneliniz varsa, erişimini kendi IP'nize kısıtlayın.
Her katmanı sırayla test edin
- Sunucunun kendisinde
curl -I http://127.0.0.1: web sunucusu çalışıyor mu? - Yalnızca
echo "ok";içeren basit bir PHP dosyası: FPM bağlı mı? - Veritabanına bağlanan bir PHP betiği: kimlik bilgileri doğru mu?
- Dışarıdan
curl -I https://example.com: DNS, güvenlik duvarı ve SSL hepsi sağlıklı mı?
Bir yerde takılırsanız, tahmin etmek yerine o katmanın log'unu okuyun: /var/log/nginx/error.log, journalctl -u php8.2-fpm, /var/log/mysql/error.log. Vakaların yüzde doksanında cevap o son birkaç satırdadır.
Kaynaklar hakkında bir uyarı: Küçük bir VPS'te tüm bunları birlikte ayağa kaldırıyorsanız ve kurulumdan sonra site yavaşlıyorsa, sorun muhtemelen yapılandırma değil, RAM yetersizliğidir. free -m ve vmstat 1 ile swap'ın ne kadar devreye girdiğine bakın. Sürekli swap yapıyorsanız, ya RAM'i artırın ya da gereksiz servisleri kapatın. Daha ciddi yükler için, kaynakları yükseltilebilen bir bulut sunucuya geçmek, doymuş bir makineyi ayarlamaktan daha az zahmetlidir.
Tüm bu süreci kendiniz yönetmemeyi ve yalnızca kodu yüklemeyi tercih ediyorsanız, Linux hosting aynı stack'i hazır olarak size sunar. Ancak amaç öğrenmek veya tam kontrolse, bu manuel yol buna değer.
Sıkça sorulan sorular
PHP kurulumundan sonra sitem neden 502 Bad Gateway hatası veriyor?
Çoğu durumda Nginx yapılandırmasındaki FPM socket yolu, diskteki gerçek yolla aynı değildir. ls /run/php/ ile socket'in tam adını görün ve onu fastcgi_pass içine koyun. İkinci neden, PHP-FPM servisinin hiç ayağa kalkmamış olmasıdır; systemctl status php8.2-fpm komutunu kontrol edin.
Her ikisi de doğruysa, /var/log/nginx/error.log dosyasına bakın. connect() to unix:... failed (13: Permission denied) mesajı, sorunun PHP'nin kendisinde değil, www-data kullanıcısının socket'e erişiminde olduğu anlamına gelir.
Nginx kuruyorsam Apache'yi kaldırmalı mıyım?
Apache 80 portunu dinliyorsa, Nginx ayağa kalkmaz ya da site Apache'ye gider ve siz Nginx yapılandırmasının etkisi yok sanırsınız. ss -tlnp | grep :80 ile portu hangi sürecin aldığını görün. Apache'ye ihtiyacınız yoksa, systemctl disable --now apache2 yeterlidir; tamamen kaldırmak gerekli değildir.
Hangi PHP sürümünü kurmalıyım?
Uygulamanızın resmi olarak desteklediği sürümü, mevcut en yeni sürümü değil. Bir CMS üzerinde çalışıyorsanız, o sürümün gereksinimler sayfasına bakın. 7.4 için yazılmış bir uygulamaya PHP 8.2 kurmak, deprecated hataları ve bazen ölümcül hatalar verir.
Pratik ipucu: Sonradan yükseltme yapacaksanız, PHP sürümünü socket adına sabit kodlamayın. Bir symlink veya yapılandırmada bir değişken bulundurun ki yükseltme tek satırlık bir değişiklik olsun.
Kurulumdan sonra yapmam gereken ilk şey nedir?
Güvenlik duvarını kapatın ve test dosyalarını silin. İnternette kalan bir info.php, tam PHP sürümünüzü, kurulum yollarınızı ve etkin modüllerinizi herkese gösterir. Sonrasında otomatik veritabanı yedeklemesini ayarlayın; yedeklemesiz kurulum, tamamlanmamış kurulumdur.
Ve bir gün erişiminizi kaybederseniz, geri dönüş yolunun olduğunu bilin. Sunucuyu yeniden kurma ve rescue moduyla çalışma yöntemlerini ihtiyaç duymadan önce bir kez okuyun.