Doküman

Yaygın Nginx Linux Web Sunucusu Hataları Nasıl Giderilir

Nginx çok popüler bir web sunucusudur. Bu makalede, bir Nginx web sunucusunu çalıştırırken bazı yaygın hataları ve olası çözümlerini okuyabilirsiniz. Elbetteki tüm hataları içeren bir yazı değildir fakat önerilen çözümleri denedikten sonra hatayı hala düzeltemiyorsanız, lütfen /var/log/nginx/dizini altında bulunan Nginx sunucu günlüklerinizi kontrol edin ve Google’da arama yapın.

Unable to connect/Refused to Connect

Web sitenize erişmeye çalışırken aşağıdaki hatayı görüyorsanız:

Firefox, www.example.com adresindeki sunucuyla bağlantı kuramıyor

veya

www.example.com bağlanmayı reddetti

veya

Siteye ulaşılamıyor, www.example.com beklenmedik bir şekilde bağlantıyı kapattı.

Bu durumda;

  1. Nginx çalışmıyor. Nginx durumunu sudo systemctl status nginx ile kontrol edebilirsiniz. Nginx’i sudo systemctl start nginx ile başlatın. Nginx başlatılamazsa, yapılandırma dosyanızda bir sorun olup olmadığını bulmak için sudo nginx -t komutunu çalıştırın. Ve neden başlamadığını öğrenmek için günlüğü (sudo journalctl -eu nginx) kontrol edin.
  2. Güvenlik duvarı 80 ve 443 bağlantı noktalarını engelliyor. Debian/Ubuntu’da UFW güvenlik duvarını kullanıyorsanız, sudo ufw allow 80,443/tcp’nin 80 ve 443 numaralı TCP bağlantı noktalarını açmasını çalıştırın. Firewalld’ı RHEL/CentOS/Rocky Linux/AlmaLinux üzerinde kullanıyorsanız, sudo firewall-cmd –permanent –add-service={http,https}, ardından 80 ve 443 numaralı TCP bağlantı noktalarını açmak için sudo systemctl reload firewalld komutunu çalıştırın.
  3. Fail2ban. Sunucunuz kötü amaçlı istekleri engellemek için fail2ban kullanıyorsa, bunun nedeni fail2ban’ın IP adresinizi yasaklaması olabilir. IP adresinizin yasaklanıp yasaklanmadığını kontrol etmek için sudo journalctl -eu fail2ban komutunu çalıştırın. IP adresinizi fail2ban yoksayma listesine ekleyebilirsiniz, böylece bir daha yasaklanmaz.
  4. Nginx doğru ağ arayüzünü dinlemiyor. Örneğin, Nginx sunucunun dış IP adresini dinlemiyor olabilir.

systemctl status nginx, Nginx’in çalıştığını gösteriyor ancak sudo ss -lnpt | grep nginx, Nginx’in 80/443 numaralı TCP bağlantı noktasını dinlemediğini gösteriyorsa, /etc/nginx/nginx.conf dosyasındaki aşağıdaki satırları silmiş olabilirsiniz.

include /etc/nginx/conf.d/*;

Dolayısıyla Nginx, /etc/nginx/conf.d/ dizinindeki sanal ana bilgisayar dosyalarını kullanmaz. Bu satırı geri ekleyin.

The Connection Has Timed Out

Bu hata, sunucunuzun çevrimdışı olduğu veya Nginx’in düzgün çalışmadığı anlamına gelebilir. Bir keresinde, /var/log/nginx/error.log dosyasında aşağıdaki hata mesajını görüyorsanız, sunucunuzun belleği yetersiz kalmış olabilir.

fork() failed while spawning "worker process" (12: Cannot allocate memory)

404 Not Found

404 bulunamadı, Nginx’in web tarayıcınızın istediği kaynakları bulamadığı anlamına gelir. Nedeni şunlar olabilir:

  1. Web kök dizini sunucunuzda mevcut değil. Nginx’te, web root dizini root yönergesi kullanılarak şu şekilde yapılandırılır: root /usr/share/nginx/linuxbabe.com/;. Web sitesi dosyalarınızın (HTML, CSS, JavaScript, PHP) doğru dizinde olduğundan emin olun.
  2. PHP-FPM çalışmıyor. PHP-FPM durumunu sudo systemctl status php7.4-fpm (Debian/Ubuntu) veya sudo systemctl status php-fpm ile kontrol edebilirsiniz.
  3. try_files $uri /index.php$is_args$args; Nginx sunucu yapılandırma dosyanızdaki yönerge. PHP kodunu işlemek için bu yönerge gereklidir.
  4. Sunucunuzda boş disk alanı yok. Biraz disk alanı boşaltmayı deneyin. Hangi dizinlerin büyük miktarda disk alanı kapladığını öğrenmek için ncdu yardımcı programını (sudo apt install ncdu veya sudo dnf install ncdu) kullanabilirsiniz.

403 Forbidden

Bu hata, istek kaynaklarına erişmenize izin verilmediği anlamına gelir. Olası senaryo şunları içerir:

  • Web sitesi yöneticisi, bir IP beyaz listesi veya diğer yöntemlerle istenen kaynaklara genel erişimi engellemiş olabilir.
  • Web sitesi, izinsiz giriş saldırısı algılayan ModSecurity gibi bir web uygulaması güvenlik duvarı kullanıyor olabilir, bu nedenle isteği engellemiş olabilir.

Bazı web uygulamaları, 403 yasaklı hatası oluştuğunda farklı bir hata mesajı gösterebilir. Sebep aynıyken size “güvenli bağlantı başarısız oldu” diyebilir.

500 Internal Server Error

Bu, web uygulamasında bazı hatalar olduğu anlamına gelir. Aşağıdaki durumlardan kaynaklanabilir.

  1. Veritabanı sunucusu kapalı. MySQL/MariaDB durumunu sudo systemctl status mysql ile kontrol edin. Sudo systemctl start mysql ile başlatın. Neden başlamadığını öğrenmek için sudojournalctl -eu mysql komutunu çalıştırın. Yetersiz bellek sorunu nedeniyle MySQL/MariaDB işlemi sonlandırılabilir.
  2. Nginx’i PHP-FPM kullanacak şekilde yapılandırmadınız, bu nedenle Nginx PHP kodunu nasıl çalıştıracağını bilmiyor.
  3. Web uygulamanızın yerleşik bir önbelleği varsa, bu hatayı düzeltmek için uygulama önbelleğini temizlemeyi deneyebilirsiniz.
  4. Web uygulamanız kendi hata günlüğünü oluşturabilir. Bu hatayı ayıklamak için bu günlük dosyasını kontrol edin.
  5. Web uygulamanızın bir hata ayıklama modu olabilir. Açın ve web sayfasında daha ayrıntılı hata mesajları göreceksiniz. Örneğin, /srv/modoboa/instance/instance/settings.py dosyasında DEBUG = True ayarını yaparak Modoboa posta sunucusu barındırma platformunda hata ayıklama modunu açabilirsiniz.
  6. PHP-FPM aşırı yüklenmiş olabilir. PHP-FPM günlüğünüzü kontrol edin (/var/log/php7.4-fpm.log gibi). [pool www] meşgul görünüyorsa (pm.start_servers veya pm.min/max_spare_servers’ı artırmanız gerekebilir) uyarı mesajını bulursanız, PHP-FPM’ye daha fazla kaynak ayırmanız gerekir.
  7. Bazen PHP-FPM’yi yeniden yüklemek (sudo systemctl reload php7.4-fpm)) hatayı düzeltebilir.
  8. Ayrıca PHP için veritabanı modülünü yüklememiş olabilirsiniz, bu nedenle PHP veritabanına bağlanamaz. MySQL/MariaDB için sudo apt install php7.4-mysql komutunu çalıştırın. PostgreSQL için sudo apt install php7.4-pgsql komutunu çalıştırın.

Nginx Shows the default page

Bir Nginx sanal sunucu kurmayı deneyip, web tarayıcınıza alan adını yazdığınızda, varsayılan Nginx sayfası geliyorsa,

  1. Nginx sanal sunucu dosyanız server_name yönergesine sahip değil. ,
  2. Nginx sanal sunucunuzda server_name yönergesi için gerçek bir alan adı kullanmadınız.
  3. Nginx’i yeniden başlatmayı unuttunuz.
  4. Nginx’teki varsayılan sanal sunucu dosyasını silmeyi deneyebilirsiniz (sudo rm /etc/nginx/sites-enabled/default).

The page isn’t redirecting properly

Firefox bu hatayı, Sayfa düzgün şekilde yönlendirilmiyor olarak görüntüler. Google Chrome, www.example.com sizi çok fazla yönlendirdiği için bu hatayı gösterir.

Bu hata, Nginx yeniden yönlendirmesini çok fazla yapılandırdığınız anlamına gelir. Örneğin, HTTP’yi HTTPS bağlantısına yönlendirmek için https sunucu bloğuna gereksiz bir dönüş 301 yönergesi eklemiş olabilirsiniz.

Nginx FastCGI önbelleği gibi bir sayfa önbelleği ayarladıysanız, sunucu sayfa önbelleğinizi temizlemeniz gerekir.

504 Gateway time-out

Bu hata, PHP-FPM/MySQL/MariaDB gibi yukarı akışın isteği yeterince hızlı işleyemediği anlamına gelir. Hatayı geçici olarak düzeltmek için PHP-FPM’yi yeniden başlatmayı deneyebilirsiniz, ancak daha hızlı performans için PHP-FPM/MySQL/MariaDB’yi ayarlamaya başlamak daha faydalıdır.

MySQL/MariaDB Performansını Optimize Edin

/etc/mysql/mariadb.conf.d/50-server.cnf dosyasındaki InnoDB yapılandırması. Bu çok basit bir performans ayarıdır.

innodb_buffer_pool_size = 1024M
innodb_buffer_pool_dump_at_shutdown = ON
innodb_buffer_pool_load_at_startup  = ON
innodb_log_file_size = 512M
innodb_log_buffer_size = 8M

#Improving disk I/O performance
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 400
innodb_flush_method = O_DIRECT
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_buffer_pool_instances = 3
  1. InnoDB arabellek havuzu boyutunun RAM’inizin en az yarısı kadar olması gerekir. (Az miktarda RAM içeren VPS için, arabellek havuzu boyutunu 400M gibi daha küçük bir değere ayarlamanızı öneririm, aksi takdirde VPS’nizde RAM biter.)
  2. InnoDB günlük dosyası boyutunun arabellek havuzu boyutunun %25’i olması gerekir.
  3. Okunan IO iş parçacığını ayarlayın ve IO iş parçacığını maksimuma (64) yazın ve
  4. MariaDB’nin 3 InnoDB arabellek havuzu örneğini kullanmasını sağlayın. Örnek sayısı, sisteminizde aynı sayıda CPU çekirdeği olmalıdır.

Değişiklikleri kaydettikten sonra MariaDB’yi yeniden başlatın.

sudo systemctl restart mariadb

Hangi PHP Komut Dosyasının 504 Hatasına Neden Olduğunu Bulun

Herhangi bir hatalı istek olup olmadığını görmek için web sunucusu erişim günlüğünü kontrol edebilirsiniz. Örneğin, bazı kişiler Nextcloud erişim günlüğü dosyasında (/var/log/nginx/nextcloud.access) aşağıdaki satırları bulabilir.

"GET /apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 499 0 "-" "Nextcloud Server Crawler"
"GET /apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 499 0 "-" "Nextcloud Server Crawler"
"GET /apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 499 0 "-" "Nextcloud Server Crawler"

HTTP durum kodu 499’a dikkat edin; bu, HTTP istemcisinin, sunucu yanıt vermeden önce bağlantıdan çıktığı anlamına gelir. Başarılı HTTP kodu 2xx veya 3xx olmalıdır. 4xx HTTP kodunu bulabilirseniz, bu HTTP isteğinde bir sorun var demektir. Bu örnekte, Nextcloud richdocumentscode uygulaması çalışmıyor.

Zaman Aşımı Ayarlarını Artırın

Ağ geçidi zaman aşımı olasılığını azaltmak için Nginx’te daha uzun bir zaman aşımı değeri de ayarlayabilirsiniz. Nginx sanal ana bilgisayar dosyanızı düzenleyin ve sunucu {…} bloğuna aşağıdaki satırları ekleyin.

  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;

PHP-FPM ile Nginx kullanıyorsanız, fastcgi_read_timeout değerini 300 saniye gibi daha büyük bir değere ayarlayın. Varsayılan 60 saniyedir.

 location ~ \.php$ {
     try_files $uri /index.php$is_args$args;
     include snippets/fastcgi-php.conf;
     fastcgi_split_path_info ^(.+\.php)(/.+)$;

     fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     include fastcgi_params;
     fastcgi_read_timeout 300;
 }

sonra Nginx’i yeniden yükleyin

sudo systemctl reload nginx

PR_END_OF_FILE_ERROR

  1. Nginx’i HTTP isteğini HTTPS’ye yeniden yönlendirecek şekilde yapılandırdınız, ancak Nginx’te HTTPS isteği sunan sunucu bloğu yok.
  2. Belki Nginx çalışmıyordur?
  3. Bazen ana Nginx ikili dosyası çalışır, ancak bir çalışan işlemi çeşitli nedenlerle başarısız olabilir ve çıkabilir. /var/log/nginx/error.logHata ayıklamak için Nginx hata günlüğünü ( ) kontrol edin .

502 Bad Gateway

Bu hataya şunlar neden olabilir:

  1. PHP-FPM çalışmıyor. Durumunu kontrol edin: sudo systemctl durumu php7.4-fpm.
  2. PHP-FPM çalışıyor, ancak Nginx PHP-FPM’ye bağlanamıyor (Kaynak geçici olarak kullanılamıyor), .
  3. PHP-FPM çalışıyor, ancak Nginx’in PHP-FPM soketine bağlanma izni yok (İzin verilmedi). Nginx, nginx kullanıcısı olarak çalışıyor olabilir, ancak /run/php/php7.4-fpm.sock soket dosyası www-data kullanıcısına aittir.
  4. Nginx’i www-data kullanıcısı olarak çalışacak şekilde yapılandırmalısınız.

Two Virtual Host files For the Same Website

Sudo nginx -t çalıştırırsanız ve aşağıdaki uyarıyı görürseniz.

nginx: [warn] conflicting server name "example.com" on [::]:443, ignored
nginx: [warn] conflicting server name "example.com" on 0.0.0.0:443, ignored

Aynı sunucu_adı yapılandırmasını içeren iki sanal sunucu dosyası olduğu anlamına gelir. Bir web sitesi için iki sanal ana bilgisayar dosyası oluşturmayın.

Yazının orijinalini buradan okuyabilirsiniz.