Merhaba,
Başlangıç itibariyle birkaç uyarım ve dipnotum olacak. Öncelikle bu anlatım panel olmayan bir sunucuda gerçekleştirilmiştir. (cPanel, Vesta vs. paneller varsa buna uygun Admin panellerini yükleyip geçebilirsiniz.)
İkinci olarak, anlatımda CentOS 6.8 baz alarak anlatacağım. CentOS 7 için base repo yollarını paylaşacağım. Kendi sisteminize göre yazdığım komutları uyarlayıp çalıştırın. Configuration bölümü aynı. Üçüncü olarak, syslogs.org’dan Çağrı Abi’ye teşekkürler. Anlatımda onun config içeriklerinden faydalanacağım.
Dipnot: Bu yapılandırma içeriğini kendi yapınıza ve sunucu kapasitesine göre muhakkak düzenleyin. Bu anlatım herkese açık olduğundan güvenlik açığı teşkil edebilir.
Kurulumlardan önce her şeyin başı update..
1 |
yum -y update |
Nginx, CentOS’un base repo’da bulunmuyor. O nedenle yolu öncelikle göstermek gerekiyor.
1 |
rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm |
Eğer işletim sisteminiz CentOS 7 ise aşağıdaki yolu kullanın.
1 |
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm |
Şimdi Nginx yüklemesini yapabilirsiniz.
1 |
yum install nginx |
Yükleme tamamlandıktan sonra aşağıdaki gibi bir sayfayla karşılaşmalısınız.
Sonraki adımdaysa sistem açılışında Nginx otomatik başlatmalı ve şu an için Nginx restartlamalısınız. CentOS 6.8 kullanıyorsanız aşağıdakini kullanın.
1 2 |
service nginx restart chkconfig nginx on |
CentOS 7 kullanıyorsanız aşağıdakini kullanın.
1 2 |
systemctl restart nginx systemctl enable nginx |
Kurulum böylelikle bitti. Şimdi tarayıcıya sitenizin IP adresini yazdığınızda sayfanızın gelmesi lazım. Eğer ki iptables üzerinde 80. ve 443. portu açmadıysanız sayfanız gelmeyecek ve php-fpm kurulu değilse .php dosyalarınız çalışmayacaktır. Yapılandırma ayarlarına geçmeden önce aşağıdaki iki kuralı iptables ekleyip, 80. ve 443. portları açın.
CentOS 6.8 kullanıyorsanız aşağıdakini kullanın.
1 2 3 4 |
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT iptables -I INPUT 2 -p tcp --dport 443 -j ACCEPT service iptables save service iptables restart |
CentOS 7 kullanıyorsanız aşağıdakini kullanın.
1 2 3 |
firewall-cmd --permanent --zone=public --add-port=80/tcp firewall-cmd --permanent --zone=public --add-port=443/tcp firewall-cmd --reload |
Bu işlemi yaptıktan sonra efsanevi nginx default sayfasıyla karşılaşmanız gerekiyor. (bkz: http://linux.istanbul)
Şimdi geriye php/mysql yüklemek ve nginx config düzenlemek kaldı.
Default olarak php 5.3 sürümü yükleniyor (yum install php dediğinizde) ama ben 5.6 sürümünün de kurulumunu göstereceğim. Aşağıdaki base repo yolunu gösterin. (CentOS 6.x sürümüyse)
1 2 |
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm |
1 |
yum install php56w-fpm php56w-mysql php56w-cli php56w-common php56w-opcache |
Sonra yukarıdaki php install satırını kopyalayın. Tek seferde tüm paketleri indirecektir. CentOS 7 kullanıyorsanız da aşağıdaki base repoyu kullanabilirsiniz.
1 2 |
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm |
Sonra aynı install komutunu kullanmalısınız. Böylelikle php 5.6 sürümü yüklenmiş olacaktır.
Bu kurulum tamamlandıktan sonra php.ini’ye girip düzenleme yapmalısınız. /etc altında bulunan php.ini’yi bir metin editörüyle açıp, cgi.fix_pathinfo=1 içeriğini bulup, başındaki noktalı virgülü kaldırıp satırı aktifleştirin.
Sonra satırın değerini 0 (sıfır) yaparak düzenleyin.
Bunu ne için yaptığımızdan bahsedeyim. Nginx yapılandırmasını yaparken, uzantısı php olan her şeyi process etmesi için php-fpm’e iletmesini belirteceğiz. Eğer cgi.fix_pathinfo devrede olursa ve client sitenize girdiğinde https://exevolium.com/falanca.jpg/filanca.php gibi bir istek gönderirse ve filanca.php sistemde yoksa, Nginx hangi dosyanın işleneceğini tahmin etmeye çalışır ve herhalde falanca.jpg diyerek işlenmesi için FastCGI’a gönderir. İşte kötü niyetli birisi sistemde php 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.
Şimdi dosyayı kaydederek çıktıktan sonra php-fpm sistem açılışına eklemelisiniz.
1 2 3 4 5 |
chkconfig php-fpm on CentOS 7 için aşağıdakini kullan. systemctl enable php-fpm |
Şu an sistemde hem Nginx hem de php-fpm çalışır hale geldi.
Nginx Yapılandırması
Yapılandırma kısmında ilk editleyeceğiniz dosya temel ayarların bulunduğu 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şaltın:
1 2 |
cp -pr /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak > /etc/nginx/nginx.conf |
Ardından dosyayı editleyin:
1 |
vi /etc/nginx/nginx.conf |
Sonrasında da aşağıdaki önergeleri dosyaya yazın:
(Not: Bazı önemli parametrelerin açıklamaları comment satırlarında yazmaktadır. Değerleri kendi ihtiyaçlarınız doğrultusunda düzenleyebilirsiniz.)
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 40 41 42 43 44 45 46 47 48 49 50 |
# 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ğiniz 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ın da yedeğini alarak içeriğini boşaltın:
1 2 |
cp -pr /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak > /etc/nginx/conf.d/default.conf |
Ve şimdi dosyayı editleyin:
1 |
vi /etc/nginx/conf.d/default.conf |
Sonrasında da aşağıdaki önergeleri eklemelisiniz. Bu dosya içerisinde php dosyalarının nasıl process edileceği ile ilgili tanımlamalar 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ız da 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. Bu yapılandırmayı unix socket’e göre anlatacak olsam bile aşağıdaki yapılandırmanın comment bölümlerinde önemli parametreler için yorum satırları var. php-fpm’le tcp üzerinden konuşmak için gerekli ayarlar ilgili alanda comment olarak eklenmiş durumdadır.
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# # 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ı yapmalısınız. Ancak bu dosyanın içini boşaltılmasına gerek yoktur. Doğrudan dosyayı editleyin:
1 |
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.
1 2 |
;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 da aşağıdaki düzenlemeyi yapmalısınız. Bu işlem sonunda tüm konfigürasyon bitiyor ve sağlıklı şekilde Nginx kurulumunu tamamlamış olacaksınız. Lütfen /etc/php-fpm.d/www.conf yolunu metin editörüyle açın.
1 |
vi /etc/php-fpm.d/www.conf |
www.conf içine girdiğinizde orada aşağıdaki satırları bulun ve düzenleyin.
1 2 3 |
;listen.owner = nobody ;listen.group = nobody ;listen.mode = 0660 |
Öncelikle başındaki ; kaldırın ve nobody yazan yere nginx yazın. Bu nginx kullanıcısıdır. Siz kurulumu yaparken sistem nginx kullanıcısını otomatik açtı. Bu düzenlemeyi yapmazsanız yetkilendirmeden dolayı php dosyalarını açmaya çalıştığınızda Error sayfasıyla karşılaşacaktınız. Bunu da yaptıktan sonra, değişikliklerin devreye alınması için hem php-fpm başlatın ve nginx’i restart edin:
1 2 |
service php-fpm start service nginx restart |
Şimdi php-fpm bir unix socketi dinliyor olmalı. Test etmek için netstat ile kontrol edebilirsiniz:
1 |
netstat -lx |grep php |
1 |
unix 2 [ ACC ] STREAM LISTENING 27826 /var/run/php-fpm/php-fpm.sock |
Yukarıdaki gibi bir çıktı almanız gerekiyor.
Eğer tüm bunlar sorunsuzsa artık /usr/share/nginx/html altına site dosyalarınızı atarak sitenizi yayına alabilirsiniz. Kolaylık sağlaması için güncel php sürümüyle kurulumu anlattım. Sonrasında MySQL ve phpmyadmin yükleyerek yapılandırmayı devam ettirebilirsiniz. Bu iki kurulumu da daha önce anlatmıştım.
Buradan o konuya geçebilirsiniz.