Nginx Web Sunucusu
NGinX[1] (“engine x” enciniks olarak söylenir) web sunucusu, yüksek eş zamanlı çalışma kabiliyeti, yüksek performans ve düşük hafıza kullanımına odaklanılarak tasarlanmış bir web sunucusudur. Tüm işletim sistemlerine kurulabilen açık kaynak kodlu özgür bir yazılımdır. Dünyada Apache’den sonra en çok kullanılan web sunucusu yazılımı Nginx’dir. Bu özellikleri ile Raspberry Pi gibi donanım kaynakları sınırlı olan platformlarda, özellikle bellek kullanımı açısından ilk tercih edilen web sunucu yazılımı olmaktadır. Bunun anlamı, ihtiyaç duyulan uygulamaya göre; Nginx’in göreceli olarak daha düşük sistem kaynağı tüketmek üzere yapılandırılabilmesine imkân sağlamasıdır.
Nginx ve Apache başarım karşılaştırması
Apache’nin ilk tercih edilme nedeni, oldukça uzun bir geçmişi ve buna bağlı olarak geniş bir kitle ve desteğe sahip olmasıdır. Bu açıdan Apache standartları belirleyen bir web sunucusudur. Fakat kaynak tüketiminin istenilen seviyelerde olmamasından ötürü farklı alternatifleri türemiştir. Nginix de bu alternatifler arasında iyi bir seçenektir. Nginx’i kurmak için aşağıdaki komutları sırasıyla çalıştırın:
1 2 3 |
pi@raspberry ~ $ sudo apt update pi@raspberry ~ $ sudo apt full-upgrade pi@raspberry ~ $ sudo apt install -y nginx |
Kurulum tamamlandıktan sonra, Nginx /var/www/html varsayılan yayın dizininden hemen yayın yapmaya başlar. Tarayıcınızın adres satırına Raspberry Pi’ınızın IP adresini yazarak bu yayını görüntüleyebilirsiniz.
Nginx Web Sunucu Test Sayfası
Şimdi dilerseniz, varsayılan sayfanın yerine kendi karşılama sayfamızı hazırlayalım. Bunun için /var/www/html dizini içinde aşağıdaki gibi bir HTML sayfası oluşturalım ve daha sonra tarayıcımızın sayfasını tazeleyelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
pi@raspberry ~ $ sudo nano /var/www/html/index.html <html> <head> <title>Raspberry Pi Nginx Web Sunucusuna Hoş Geldiniz!</title> </head> <body> <center> <h1>Raspberry Pi <br><br>Nginx<br><br>Web Sunucusuna Hoş Geldiniz!</h1> </center> </body> </html> |
Nginx Karşılama Sayfamız
/var/www/html dizininde index.html dosyamızı oluşturduktan sonra Nginx’in varsayılan site yapılandırma dosyası olan /etc/nginx/sites-available/default içeriğine gözatalım. Aşağıdaki yapılandırma dosyasındaki açıklamalara dikkat edin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
pi@raspberry ~ $ sudo nano /etc/nginx/sites-available/default # Default server configuration # server { # Standart WWW port’u olan 80’den yayin yap # Sahip olunan tum IP adreslerinden yayin yap listen 80 default_server; listen [::]:80 default_server; # Yayin dizininin Raspberry Pi’ın dosya sistemindeki yeri root /var/www/html; # Varsayılan indeks dosyasi isimleri index index.html index.htm index.nginx-debian.html; # Dilerseniz bir sunucu adi veya IP adresi belirtebilirsiniz server_name localhost; # İstekleri ana dizinden itibaren sunmaya basla # istek bir dosya adi ile uyusmazsa dizin oldugunu varsay # aksi takdirde 404 hata sayfasini goruntule location / { try_files $uri $uri/ =404; } |
Nginx Web Sunucusuna PHP Kurmak
Nginx, PHP’yi bir CGI[2](Common Gateway Interface) uygulaması olarak ele alır. CGI kullanımında bir PHP betiği ayrı bir işlem olarak çalıştırılır. Önceki bölümde Apache’nin bir modülü olarak kurulumunu yaptığımız PHP, CGI’a göre daha fazla bellek kullanımına sahipti. Nginx’e CGI olarak kuracağımız PHP, PHP-FPM (FastCGI Process Manager) olarak adlandırılmaktadır. Kurmak için aşağıdaki komutu çalıştırın:
1 2 3 |
pi@raspberry ~ $ sudo apt update pi@raspberry ~ $ sudo apt install php-fpm -y |
Yükleme tamamlandıktan sonra Nginx’in PHP yapılandırmasını gerçekleştirmek üzere varsayılan yapılandırma dosyasını nano ile açarak aşağıdaki ayarları ekleyelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
pi@raspberry ~ $ sudo nano /etc/nginx/sites-available/default server { listen 80; server_name localhost; listen [::]:80 default_server; root /var/www/html; index index.php index.html index.htm; location ~* \.php$ { fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_index index.php; include fastcgi_params; try_files $uri =404; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } error_page 404 /404.htm; location /404.htm { internal; } } |
Dikkat ederseniz yukarıdaki yapılandırmada error_page seçeneği yer almaktadır. Bir ziyaretçi web sunucusunda bulunmayan bir dosya talep ettiğinde, Nginx’in özelleştirilmiş bir hata (sayfa bulunamadı) sayfası görüntülemesini sağlayabilirsiniz. Yukarıdaki error_page seçeneği bu iş için kullanılmaktadır. Sonraki satırdaki location değeri ise 404.htm’nindoğrudan çağrılamamasını (internal yani dâhili bir dosya olarak kalmasını) sağlamaktadır. Tabi ki ana yayın dizininizde 404.htm adlı bir dosyanın bulunduğundan da emin olmalısınız
Yukarıdaki yapılandırmada php7.3-fpm.sock adlı soket dosyasının yer aldığı dizin, kurulan PHP’nin sürümüne göre farklılık gösterebilir. Bu dosyanın konumunu ilgili dizinden teyit ederek güncellemeniz gerekir. PHP’nin 7.3 sürümü itibari ile bu dosya /var/run/php/php7.3-fpm.sock konumunda yer alıyordu.
Tüm bu ayarların geçerli olması için Nginx’i yeniden başlatın:
1 |
pi@raspberry ~ $ sudo service nginx restart |
PHP yapılandırmasını sınamak için yayın dizininde aşağıdaki gibi bir PHP betiği oluşturarak tarayıcınız ile ziyaret edebilirsiniz. Ziyaret etmek için tarayıcınızın adres satırına http://raspberry-ip-adresi/phpinfo.php yazabilirsiniz. Bu betik size (PHP’nin phpinfo() fonksiyonu) mevcut PHP yapılandırmanız hakkında oldukça detaylı bir liste görüntüleyecektir.
1 2 3 4 5 6 7 |
pi@raspberry ~ $ sudo nano /var/www/html/phpinfo.php <?php echo phpinfo(); ?> |
Sık Kullanılan Nginx Yapılandırma Seçenekleri
/etc/nginx/nginx.conf dosyası Nginx web sunucusunun ana yapılandırma dosyasıdır. Çoğu zaman gerek olmasa da ihtiyaç duyabileceğiniz bazı Nginx yapılandırma seçenekleri ve görevleri şunlardır:
worker_process seçeneği
/etc/nginx/nginx.conf dosyasında worker_process değeri HTTP istekleri işlenirken kaç farklı Nginx hizmetçisinin aynı anda çalıştırılacağını tanımlar. Her bir Nginx hizmetçisi web sunucusuna gelen sayfa isteklerini işleyen tarayıcıya çıktının gönderilmesini sağlayan işlemlerdir. Bu işlemlerin Nginx’in alt bileşenleri olarak sürekli çalışarak sayfa isteklerini karşılarlar. Web sunucu (Nginx) içindeki bağımsız web sunucular olarak düşünebilirsiniz. Bu ayarın en ideal değeri her bir hizmet prosesine bir işlemci çekirdeği tahsis etmekle gerçekleşir. Mevcut Raspberry Pi’nizin kaç çekirdeği olduğunu görmek için cpuinfo dosyasına göz atabilirsiniz:
1 |
pi@raspberry ~ $ cat /proc/cpuinfo | grep processor |
worker_process değerine ihtiyacınıza göre çekirdek ataması yapabilirsiniz. Örneğin bir Raspberry Pi 3 sisteminin her bir çekirdeğine bir Nginx prosesi atamak için aşağıdaki tanımlamayı yapabilirsiniz.
1 |
worker_process = 4; |
Tabii ki, worker_process değerini çok daha yüksek bir değere de ayarlayabilirsiniz. Bu değeri mevcut boş RAM miktarınıza ve Raspberry Pi’ın işlemcisinin yoğunluğuna göre belirleyebilirsiniz. Çekirdek sayısının üzerinde verilecek değerlerde Raspberry Pi multi-threading (çok kanallılık) yaparak Nginx proseslerinin her bir işlemci çekirdeği üzerine zaman paylaşımlı olarak yayılmasını sağlar.
worker_connections seçeneği
/etc/nginx/nginx.conf yapılandırma dosyasının events bloğunda kullanılan worker_connections değeri ise bir Nginx prosesinin aynı anda kaç HTTP isteği ile ilgileneceğini tanımlar. Raspberry Pi’niz üzerindeki mevcut yük durumuna ve HTTP ile sunduğunuz içeriğin ihtiyaç duyduğu işlemci gücüne göre worker_connections değerini ayarlayabilirsiniz. Genel olarak her bir worker’ için 1000 değeri çoğu durumda uygun görülmüştür.
1 |
worker_connections = 1000; |
Çok yoğun işlem gücüne ihtiyaç duyan bir web içeriği/uygulaması barındırıyorsanız bu değeri azaltabilir worker_process değerini artırabilirsiniz. worker_process ve worker_connections ‘in optimal değerlerini htop programının çıktısı ve yük testleri yaparak belirleyebilirsiniz.
server_tokens seçeneği
/etc/nginx/nginx.conf yapılandırma dosyasının http bloğunda yer alan bu ayar Nginx’in istemciye gönderdiği Nginx’in versiyon bilgisini gizlemek için kullanılır. Bu değeri gizlemenin amacı güvenlik içindir. Web sunucunuzu ziyaret eden herhangi bir kişi kullanmış olduğunuz Nginx sunucunuzun sürüm bilgisini öğrenemez; yalnızca ileri teknikler kullanılarak tespit edilebilir (örn: nmap tarayıcısı). Bu değer varsayılan olarak aktif durumdadır (on) ve bir istemci (örn.:web tarayıcısı) aşağıdaki başlık cevabında yer aldığı gibi Nginx sürümünü kolayca görebilir. Bu değeri görmek için örneğin Chrome tarayıcısında sayfa üzerine sağ tıklatarak incele (inspect) seçeneğini seçin ve daha sonra Network sekmesini açarak istek yapılan sayfayı seçin, ardından da Header’s sekmesinde ilgili başlık bilgisini inceleyin.
1 2 3 4 5 6 7 8 9 10 11 |
Connection:keep-alive Content-Encoding:gzip Content-Type:text/html; charset=UTF-8 Date:Wed, 20 Apr 2016 11:53:10 GMT Server:nginx/1.6.2 Transfer-Encoding:chunked |
Değer “off” durumuna getirildikten sonra Nginx yeniden başlatılırsa (sudo service nginx restart) istemciye gönderilen başlık bilgisi aşağıdaki gibi görünecektir:
1 2 3 4 5 6 7 8 9 10 11 |
Connection:keep-alive Content-Encoding:gzip Content-Type:text/html; charset=UTF-8 Date:Wed, 20 Apr 2016 11:56:17 GMT Server:nginx Transfer-Encoding:chunked |
[1] Nginx Web Sunucu Yazılımı – https://tr.wikipedia.org/wiki/Nginx
[2] CGI – https://goo.gl/HqPg4a