Ana Sayfa » *nix » Php5 (PHP-FPM) + MySQL destekli Nginx Kurulumu

Php5 (PHP-FPM) + MySQL destekli Nginx Kurulumu


BerbatKötüİdare EderGüzelHarika (Toplam 6 oy. 5 puan üzerinden ortalama 5,00 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...

nginxAmazon 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ü kullanmak mantıklı bir seçim olabilir. özellikle static content serve etmek konusunda oldukça başarılı ve reverse proxy olarak da yaygın olarak kullanılıyor. Ayrıca, konusunda da -fpm üzerinden epey iyi iş çıkarıyor.

Sonuç olarak kaynaksızlıktan kırılan zavallı bir sunucunuz varsa kullanmayı deneyebilirsiniz. Aşağıda centos 6.4 üzerinde ve mysql destekli bir 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 -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 ’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

Kategoriler: *nix,apache |

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


  1. Gökhan ABANOZ | (Aralık 12th, 2013 9:57 pm)

    Ellerine sağlık hocam : ) profesyonel anlatım olmuş.

    [Cevapla]

  2. Hüseyin Özkan | (Şubat 19th, 2014 3:04 pm)

    Güzel bir anlatım ile harika bir paylaşım olmuş. Faydalandığımı bilmenizi isterim. Teşekkür ederim

    [Cevapla]

  3. Levent | (Mayıs 23rd, 2014 4:58 pm)

    Merhaba

    Bir sorum olacak,Apache kurmadan direk bu anlattığınız gibi web server olarak Nginx kurabilir miyiz ?

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Evet kurabilirsiniz.

    [Cevapla]

  4. Erkan Öz | (Haziran 9th, 2014 9:14 am)

    Ö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]

    Cagri Ersen tarafından yanıtlandı.

    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]

  5. Berkay | (Kasım 20th, 2014 10:07 am)

    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]

    Levent tarafından yanıtlandı.

    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]

  6. umut | (Aralık 30th, 2014 2:11 am)

    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]

  7. sercan | (Mart 26th, 2016 4:03 pm)

    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]

  8. Savaş çalışkan | (Mart 30th, 2016 6:53 pm)

    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]

Trackbacks

Yorumda bulunun.