Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Apache'den Nginx'e Geçiş Sonrası Yaygın Hatalar ve Çözümleri (404, 403, PHP Çalışmaması)

devnix

Üye
Katılım
14 Mart 2026
Mesajlar
20
Merhaba arkadaşlar, bugün sizlere Apache'den Nginx'e geçiş yaptıktan sonra en sık karşılaşılan sorunlardan ve bunların nasıl çözüleceğinden bahsedeceğim. Bu geçişi yaparken, Apache'nin `.htaccess` mantığından, farklı konfigürasyon yapısından dolayı bazen ufak tefek sorunlar yaşanabiliyor. Ben de kendi sunucularımda bu süreçten geçtiğim için tecrübelerimi paylaşmak istiyorum.

🔍 Apache'den Nginx'e Geçişte Temel Fark Nedir?

Apache, `.htaccess` dosyaları ile dizin bazlı kuralları dinamik olarak okuyabilirken, Nginx'te tüm bu kurallar ana konfigürasyon dosyasında (`nginx.conf` veya site konfigü dosyasında) tanımlanmalıdır. Bu, performans açısından çok daha iyidir ama geçiş sırasında unutulursa 404 (Bulunamadı) veya 403 (Erişim Engellendi) hatalarına yol açar. Ayrıca PHP'nin çalışma şekli de farklılık gösterir.

⚠️ Hata 1: 404 Not Found (Dosya Bulunamadı)

Bu hatanın en yaygın sebebi, Apache'de `.htaccess` ile güzelce çalışan "pretty URL" (temiz URL) yapısının Nginx'e taşınmamış olmasıdır. Örneğin, WordPress, Laravel veya benzeri bir framework kullanıyorsanız, tüm isteklerin `index.php` dosyasına yönlendirilmesi gerekir.

Çözüm için, ilgili site konfigürasyonunuzun `server` bloğuna aşağıdaki gibi bir `location /` kuralı eklemeniz gerekebilir. Benim genelde uyguladığım yöntem şudur:

NGINX:
server {
    listen 80;
    server_name sitem.com www.sitem.com;
    root /var/www/sitem_public_html;

    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Diğer kurallar...
}

Buradaki `try_files` direktifi, Nginx'e şunu söyler: "Önce istenen dosyayı (`$uri`) bul, bulamazsan bir dizin olarak dene (`$uri/`), onu da bulamazsan isteği `index.php` dosyasına yönlendir." Bu, Laravel ve benzeri frameworkler için standart çözümdür. WordPress için ise genellikle şu kural kullanılır:

NGINX:
location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

⚠️ Hata 2: 403 Forbidden (Erişim Engellendi)

403 hatası genellikle dosya/dizin izinleri veya Nginx'in doğru dizine erişememesiyle ilgilidir. İlk kontrol etmeniz gereken şey, `root` direktifinin doğru dizini işaret ettiğinden emin olmaktır.

Daha sonra, Nginx işlemcisinin (`www-data` veya `nginx` kullanıcısının) o dizindeki dosyaları okuyabilme izni olduğundan emin olun. Benim sunucularda genelde şu komutla temel izinleri ayarlarım:

Bash:
sudo chown -R www-data:www-data /var/www/siteniz
sudo find /var/www/siteniz -type d -exec chmod 755 {} \;
sudo find /var/www/siteniz -type f -exec chmod 644 {} \;

Ayrıca, `index` direktifinde belirttiğiniz varsayılan dosyanın (`index.php`, `index.html`) ilgili dizinde bulunduğundan emin olun. Eğer `index` dosyası yoksa ve dizin listeleme (`autoindex`) kapalıysa, Nginx 403 hatası verecektir.

⚠️ Hata 3: PHP Dosyalarının İndirilmesi veya Çalışmaması

Bu, geçişte en çok can sıkan hatalardan biridir. Apache `mod_php` kullanırken, Nginx genellikle PHP-FPM ile birlikte çalışır. PHP'nin çalışmamasının nedeni, PHP dosyalarını işlemek için gerekli `location` bloğunun tanımlanmamış olmasıdır.

Çözüm olarak, PHP isteklerini `php-fpm` soketine veya TCP portuna yönlendirmelisiniz. Aşağıdaki konfigürasyon, benim test sunucularımda sıklıkla kullandığım standart bir yapıdır:

NGINX:
server {
    # ... diğer temel ayarlar ...

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # PHP versiyonunuza göre güncelleyin!
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # PHP dosyalarına doğrudan erişimi engellemek isteyebilirsiniz
    location ~ /\.ht {
        deny all;
    }
}

Şu ayara çok dikkat etmelisiniz: fastcgi_pass. Buradaki socket veya TCP adresi, sisteminizdeki PHP-FPM servisinin dinlediği yerdir. Hangi socket'in kullanıldığını öğrenmek için şu komutu kullanabilirsiniz:

Bash:
sudo systemctl status php8.1-fpm # veya php-fpm, php7.4-fpm

Servis dosyasının içine bakarak veya /etc/php/8.1/fpm/pool.d/www.conf (versiyon değişir) dosyasındaki `listen` direktifini kontrol ederek doğru socket/port bilgisini öğrenebilirsiniz.

✅ Konfigürasyonu Test Et ve Nginx'i Yeniden Yükle

Herhangi bir değişiklik yaptıktan sonra, mutlaka Nginx konfigürasyonunuzun sözdizimini kontrol edin:

Bash:
sudo nginx -t

Eğer her şey yolundaysa ve "syntax is ok" mesajını alırsanız, Nginx'i yeniden başlatın:

Bash:
sudo systemctl reload nginx  # veya restart

`reload` komutu, kesinti yaşamadan konfigürasyonu yeniden yükler, bu yüzden ben tercih ederim.

Umarım bu rehber, Apache'den Nginx dünyasına geçiş yapan arkadaşlarımızın işini kolaylaştırır. Temel hatalar bunlar, doğru konfigürasyon ile Nginx'in performans avantajlarını sonuna kadar hissedebilirsiniz.

Peki siz bu geçiş sürecinde hangi zorluklarla karşılaştınız? Veya kendi sunucularınızda farklı, daha optimize ettiğiniz Nginx kurallarınız var mı? Sorusu olan veya eklemek isteyen aşağıya yazsın, beraber tartışalım.
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri