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:
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:
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:
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:
Ş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:
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:
Eğer her şey yolundaysa ve "syntax is ok" mesajını alırsanız, Nginx'i yeniden başlatın:
`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.
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.
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;
}
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.
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.
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.