Php5 (PHP-FPM) + MySQL destekli Nginx Kurulumu
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYfGmmsR' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
Amazon AWS üzerinde bir ec2 micro instance'ım var. Bu sunucu sadece 615 MB memory'e sahip olduğu için üzerinde koşan uygulamalara ram'i damlalıkla vermek icap ediyor. Böyle durumlarda oldukça lightweight olmasından ötürü nginx kullanmak mantıklı bir seçim olabilir. nginx özellikle static content serve etmek konusunda oldukça başarılı ve reverse proxy olarak da yaygın olarak kullanılıyor. Ayrıca, php konusunda da php-fpm üzerinden epey iyi iş çıkarıyor.
Sonuç olarak kaynaksızlıktan kırılan zavallı bir sunucunuz varsa nginx kullanmayı deneyebilirsiniz. Aşağıda centos 6.4 üzerinde php ve mysql destekli bir nginx kurulumunun nasıl yapılabileceğini bulabilirsiniz.
Gerekli YUM Repo'larının Kurulması
Nginx CentOS'un base bulunmuyor, bu nedenle nginx için EPEL, base repo'da bulunan php-fpm'in daha güncel sürümü için ise remi isimli ek repoları kurmak icap ediyor.
Dolayısı ile önce bu repoları sisteme tanıtmamız gerekiyor.
(Not: Kurulumları yapmadan önce repoların güncel sürümleri var mı diye kontrol etmenizi öneririm. [1],[2])
32bit bir sistem için kurulumu aşağıdaki gibi yapıyoruz: (Sisteminiz 64bit ise i386 ibaresini x86_64 olarak değiştirmelisiniz.)
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
Bu şekilde ilgili repolar sisteme eklenmiş oluyor.
Nginx Kurulumu
Şimdi yum üzerinden nginx kurulumu yapıyoruz:
# yum install nginx
Ardından nginx'i startup'a ekleyip ve servisi başlatıyoruz:
# chkconfig nginx on # service nginx start
Ben standalone iptables kullanmadığım için bu servisi kapatıyorum. Durum sizde de bu şekildeyse aşağıdaki şekilde iptables'ı devre dışı bırakın. (iptables kullanıyorsanız da 80. porta izin vermeyi unutmayın.)
# service iptables stop && service ip6tables stop # chkconfig iptables off && chkconfig ip6tables off
Herşey sorunsuz gittiyse, nginx çalışıyor olmalı. Durumu kontrol etmek için http://ipadresi/ şeklinde bir istekte bulunduğunuzda nginx welcome sayfasını görüntülemeniz gerekir.
Php Paketlerinin Yüklenmesi
Gene yum üzerinden php paketlerini sisteme yükleyeceğiz ancak php-fpm'in remi üzerinden kurulması için bu repo'yu da devreye alarak kurulumu yapıyoruz:
# yum --enablerepo=remi install php-fpm php-mysql php-cli php-common
Kurulumun ardından, php.ini'de önemli bir düzenleme yapmak gerekiyor. Bu nedenle favori editörünüz ile /etc/php.ini dosyasını açın: (ben vi kullanıyorum)
# vi /etc/php.ini
Dosya içerisinde (;) işareti ile commet out edilmiş, ;cgi.fix_pathinfo = 1 ibaresini bulun ve uncomment edip, parametrenin değerini 0 yapın:
cgi.fix_pathinfo = 0
Nginx'i yapılandırırken, uzantısı php olan herşeyi process edilmesi için php-fpm'e ilet diyeceğiz, eğer cgi.fix_pathinfo özelliği devrede olursa ve örnek olarak http://url/falanca.jpg/filanca.php gibi bir istek gelirse ve filanca.php dosyası sistemde yoksa sistem hangi dosyanın işleneceğini tahmin etmeye çalışır ve heralde falanca.jpg diyerek işlenmesi için FastCGI'a iletir. Eğer kötü niyetli biri sisteminize içerisinde php kodları gömülü olan bir jpg yükleyip göndereceği URL'de önde kendi upload ettiği dosyanın ismini ardından da sistemde olmayan bir php dosyasını geçirirse, sistem olmayan php'yi bulamadığı için jpg dosyasının işlenmesi için FastCGI'a iletecek ve ilgili jpg dosyasında gömülü php kodları çalıştırılacaktır.
İşte böyle olası bir güvenlik açığının önüne geçmek için php'ye URL'de geçen path'i olduğu gibi değerlendirmesini, eğer dosya bulunamıyorsa tahmin etmek yerine işlemi sonlandırmasını söylemek gerekir. Bunu da cgi.fix_pathinfo özelliğini 0 yapmak sureti ile (ki default 1'dir) devre dışı bırakarak yapıyoruz.
Dosyadan kaydederek çıktıktan sonra, php-fpm'i startup'a ekliyoruz (ancak henüz start etmeyeceğiz):
# chkconfig php-fpm on
Şu anda hem nginx hem de php-fpm çalışıyor olmalı. Php ile ilgili testleri yapılandırma aşamasından sonra yapacağız.
Nginx'in Yapılandırılması
Yapılandırma kısmında ilk editleyeceğimiz dosya temel ayarların bulundugu ana yapılandırma dosyası olan /etc/nginx/nginx.conf.
Şimdi aynı dizine bu dosyanın bir yedeğini aldıktan sonra içerisini boşaltalım:
# cp -pr /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak # > /etc/nginx/nginx.conf
Ardından dosyayı editliyoruz:
# vi /etc/nginx/nginx.conf
Sonrasında da aşağodaki önergeleri dosyaya yazıyoruz:
(Not: Bazı önemli parametrelerin açıklamaları comment satırlarında yazmaktadır. Değerleri kendi ihtiyaçlarınız doğrultusunda düzenleyebilirsiniz.)
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ # Nginx'i calistiracak kullanici user nginx; # Kac adet worker calisacak. Sunucunuzdaki core sayisi kadar arttirabilirsiniz. worker_processes 1; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { # Maxclient'in belirlenmesinde kullanilan parametre. [maxclients = worker_processes * worker_connections] worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; # Log formati log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; server_tokens off; sendfile on; keepalive_timeout 15; tcp_nopush on; tcp_nodelay on; client_body_timeout 10; client_header_timeout 10; send_timeout 10; # Gonderilen veriyi gzip'le. # CPU costu vardir ancak bandwidth kullanimi ve response time duser. Cpu durumuna gore off yapilablir. gzip on; gzip_min_length 1100; gzip_types text/plain application/x-javascript text/xml text/css; gzip_vary on; # /etc/nginx/conf.d dizinindeki dosyalari yapilandirmaya dahil et. include /etc/nginx/conf.d/*.conf; } |
Editleyeceğimiz bir diğer yapılandırma dosyası ise, /etc/nginx/conf.d/ dizini altında bulunan default.conf. Bu dosya default website tanımlarının yapıldığı alandır.
Şimdi bu dosyanında yedeğini alalım ve içini boşaltalım:
# cp -pr /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak # > /etc/nginx/conf.d/default.conf
ve editleyelim:
# vi /etc/nginx/conf.d/default.conf
Sonrasında da aşağıdaki önergeleri ekleyeceğiz. Bu dosya içerisinde php dosyalarının nasıl process edileceği ile ilgili tanımlamalar da yapılmakta. Php-fpm üzerinden php çalıştırmanın iki yolu bulunuyor. Default ayarlarda php-fpm kurulduğu zaman TCP 9000. portu dinlemektedir, ve nginx yapılandırmanızda tüm php dosyalarını bu portun ucundaki fpm'e gönderirsiniz. Bu işlemi tcp üzerinden yapmak özellikle yoğun kullanılan sunucularda TCP stack üzerine gereksiz yük getireceği için bir diğer yol olan unix socket üzerinden bağlanmak daha mantıklı olabilir. Ben yapılandırmayı unix socket'e göre anlatacak olsam da aşağıdaki yapılandırmanın comment bölümlerinde önemli parametreler için comment satırları var. php-fpm'le tcp üzerinden konuşmak için gerekli ayarlar da ilgili alanda comment olarak eklenmiş durumda.
# # The default server # server { listen 80 default_server; # server_name olarak alan adi da yazilabilir; bu sekilde birakilirsa # catchall gorevi gorur. Bu sunucuyu gosteren tum alan adlari icin default vhost. server_name _; # Nginx kok dizini ve default dokumanlar. location / { root /usr/share/nginx/html; index index.php index.html index.htm; } # Bulunamayan icerikle alakali hatalari /404.html'e yonlendir. error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # 5x server error'lari /50x.html sayfasina yonlendir. error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # php dosyalarinin nasil islenecegi ile ilglii bolum: location ~ \.php$ { root /usr/share/nginx/html; # fpm'e socket uzerinden erismek icin (ki bir bu sekilde yapiyoruz): fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # Alternatif olarak php-fpm'e TCP uzerinden erismek icin (default yontem bu ama biz kullanmiyoruz.) # fastcgi_pass 127.0.0.1:9000; # NOT: Yukarıdaki parametreyi uncomment etmeden once, # 1 - Ayni dosyadaki fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; ibaresini commnet out edin. # 2 - /etc/php-fpm.d/www.conf dosyasindaki listen = /var/run/php-fpm/php-fpm.sock satırını uncomment out # etmeniz ve yerine listen = 127.0.0.1:9000 ekledikten sonra fpm'i restart etmeniz gerekir. fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # .htaccess dosyalarina erisime izin verme. location ~ /\.ht { deny all; } # favicon dosyalari icin access log'a yazma ve 204 (No Content) status kodu dondur. location ~* \.(ico)$ { access_log off; log_not_found off; try_files /favicon.ico =204; } # static contet dosyalarinin 72 saat cache'te tutulmasini soyle. Access log'a yazma. location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { access_log off; expires 72h; } } |
Son olarak da php-fpm ile ilgili ayarları yapacağız. Ancak bu dosyanın içini boşaltmayacağımız için yedeklemeye gerek yok. Doğrudan dosyayı editleyin:
# vi /etc/php-fpm.d/www.conf
Dosyadaki listen = 127.0.0.1:9000 satırını devre dışı bırakıp yerine listen = /var/run/php-fpm/php-fpm.sock ibaresini ekleyin.
;listen = 127.0.0.1:9000 listen = /var/run/php-fpm/php-fpm.sock
Aynı dosyada apache'deki StartServers, MinSpareServers, MaxSpareServers parametrelerine benzer şekilde pm.max_children, pm.start_servers, pm.min_spare_servers ve pm.max_spare_servers gibi parametreler bulunmaktadır. Bu değerler uygulamanıza ve trafiğinize bağlı olarak değişiklikler gösterdiği için isteğiniz doğrultusunda arttırıp azaltabilir ve size uygun değerleri bulabilirsiniz. Nasıl hesaplanacağı ile ilgili bilgiler comment olarak yazılıdır.
Yukarıdaki düzenlemeyi yaptıktan sonra dosyayı kaydedin ve çıkın.
Son olarak değişikliklerin devreye alınması için hem php-fpm başlatalım ve nginx'i restart edelim:
# service php-fpm start # service nginx restart
Şimdi php-fpm bir unix socketi dinliyor olmalı. Test etmek için netstat ile kontrol edebilirsiniz:
netstat -lx |grep php
Çıktıda ilgili socket'i görebilmeniz gerekir:
unix 2 [ ACC ] STREAM LISTENING 27826 /var/run/php-fpm/php-fpm.sock
Ayrıca, nginx'in default document root'u olan /usr/share/nginx/html dizinine aşağıdaki info.php dosyasını ekleyip browser üzerinden çağırabilirsiniz. (Bu dosyayı güvenlik açısından sunucuda bırakmayın ya da en azından ismini tahmin edilmesi zor bir şey yapın.)
<?php // Show all information, defaults to INFO_ALL phpinfo(); // Show just the module information. // phpinfo(8) yields identical results. phpinfo(INFO_MODULES); ?> |
Herşey sorunsuz gittiyse php bilgilerinizi görebilmeniz gerekir.
[1] http://fedoraproject.org/wiki/EPEL
[2] http://rpms.famillecollet.com/
Kaynaklar:
http://wiki.nginx.org/Main
Bu yazılar da ilginizi çekebilir:
- Lighttpd, Mysql, Php, Eaccelerator ile OpenAds Ad Server kurulumu.
- Apache Mod_Status Yapilandirmasi
- Unbound ile Güvenli Recursive DNS Kurulumu
- FreeBSD üzerine Rsyslog Kurulumu ve Yapılandırması
- VMWare Üzerine Backtrack 4 Kurulumu
Yorumlar
Trackbacks
Yorumda bulunun.
Ellerine sağlık hocam : ) profesyonel anlatım olmuş.
[Cevapla]
Güzel bir anlatım ile harika bir paylaşım olmuş. Faydalandığımı bilmenizi isterim. Teşekkür ederim
[Cevapla]
Merhaba
Bir sorum olacak,Apache kurmadan direk bu anlattığınız gibi web server olarak Nginx kurabilir miyiz ?
[Cevapla]
Evet kurabilirsiniz.
[Cevapla]
Öncelikle teşekkür ederim iyi bir anlatım olmuş.
Ben linux hostingte acamiyimde biraz. Prestashop alışveriş scripti kullanıyorum. Hosting kiraladım centos apache kullanıyor. Tabi herşeyini benim yapmam gerekiyor hostingte kurulum filan.
nginx kurulumu yaparsam sitemi baştan yüklemem mi gerekecek. sorun çıkarır mı bana ? Çok kişi girince çok yavaşlıyor site
[Cevapla]
Merhabalar,
Herşeyi yeniden kurmanız gerekmekeyecektir ancak sistemin neden yavaşladığını tam tespit etmeden nginx geçişi yapmanızı tavsiye etmem. Zira sorun web sunucusu değilse boş yere uğraşmış olursunuz.
[Cevapla]
Merhaba ben yeni nginx kurulumu yaptım ancak harfiyen yapmama rağmen bir sorun var. Ip adresim bu: http://78.135.87.172/ Something has triggered an error on your website. This is the default error page for nginx that is distributed with EPEL. It is located /usr/share/nginx/html/50x.html içerikli bir hata almaktayım. Yardımlarınızı bekliyorum.
[Cevapla]
Merhaba
Bu hatayi almamak için
vi /etc/php-fpm.d/www.conf içerisindeki, ; olan kısımları aşağıdaki gibi düzenledim.Çalıştı :)
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
[Cevapla]
merhaba centos5.10 kulaniyorum apacede kurulu hersey caliyor simdi benim problemim soyle qwebirc kurdum 9090 portla caliyor script sub domainde 80 porta nasil yonlendire bilirim alta kismen anlatmis benim kurmam gereken nedir ve nginx nasil kurmam gerekiyor altaki sitede ayarlari anlatmis bisi anlamadim bakarsaniz cok mutlu olurum..
http://wiki.nginx.org/Qwebirc
[Cevapla]
merhaba
merhaba şu hatayı alıyorum
host not found in upstream /etc/nginx/conf.d/default.conf:26
nginx: configuration file /etc/nginx/nginx.conf test failed
[Cevapla]
merhaba, ben apache üzerine nginx kurdum. daha doğrusu centos 6 ya cwp kurdum orada Apache+nginx server seçimi var onu seçtim.
şimdi /etc/nginx/conf.d dosyaları ile oynayarak web sitemizin php-fpm ile çalışmasını sağlamaya çalışıyorum.
Ama top komutu ile bakınca atutku kullanıcı ile birsürü php-cgi process i aktif gözüküyor.
Bu durumda php-fpm çalışmıyor ve sistem hala php requestlerini apache üzerinden mi çalıştırıyor demek?
conf dosyasında tüm php reqestlerini 127.0.0.1/9000 e aktarmama rağmen neden bu oluyor acaba?
[Cevapla]