Bu yazımızda Centos sunucu üzerinde Nginx, wordpress multisite (subdomain) ve php-fpm kurulum ve yapılandırmasını ele alacağız. Baştan söyleyim uzun bir yazı olacak ve muhtemelen kurulum sırasında biraz kafa yorcaksınız.
Bunun sebebi benim sunucu aldığım firma ile sizin hizmet aldığınız firmanın farkı, (örneğin bazıları 80 portunu kapatıyor ilk kurulumda, bazıları selinux’u açık bırakıyor vs… bunları sizin halletmeniz gerekli) yada kullandığınız işletim sisteminin farklı olması olabilir. Neyse, bu hataları sadece sizin karşılaşmadığınızı ve internettten çözümünü bulabileceğinizi aklınızın bi tarafına yazın şimdilik.
Gelelim kuruluma.
Bu kurulum genel olarak Centos 6.2 üzerinde nano editörü kullanarak anlatılmıştır.
Önce nginx repo’sunu ekliyoruz.
Bunun için /etc/yum.repos.d dizini altına nginx.repo adında bir dosya oluşturup aşağıdaki satırları yazıp kaydetmemiz gerekli.
Örn: nano /etc/yum.repos.d/nginx.repo şeklinde dosyayı açarak çıkışta kaydedebilirsiniz.
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
Şimdi remi’i dahil edelim.
[root@centos62 ~]# rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi [root@centos62 ~]# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm Retrieving http://rpms.famillecollet.com/enterprise/remi-release-6.rpm Preparing... ########################################### [100%] 1:remi-release ########################################### [100%]
Komutlarıyla repoyu dahil ettikten sonra /etc/yum.repos.d dizini altına remi.repo adında bir dosya oluşturup aşağıdaki satırları içine yazıp kaydediyoruz.
[remi] name=Les RPM de remi pour Enterprise Linux $releasever - $basearch mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi failovermethod=priority
Şimdi gelelim nginx,php-fpm ve wordpress için gerekli diğer yan bileşenleri kurmaya. Komut satırına aşağıdaki satırın yazıp devam edin.
yum install nginx php php-fpm php-cli php-mysql php-pdo php-pear php-gd php-devel
Kurulumu onaylamak için sizden cevap isterse Y tuşana basıp enterlayın.
PHP-FPM Yapılandırması
İşe önce php-fpm yapılandırmasından başlayalım. Bunun için /etc/php-fpm.d/www.conf dosyasını açalım.
nano /etc/php-fpm.d/www.conf
listen = 127.0.0.1:9000
olan satırı
listen = /tmp/php5-fpm.sock
olarak değiştirelim. Bunu yapmamızdaki amaç php-fpm unix socket kullandıpı için TCP overhead olayından kurtulmamızı sağlar.
Neyse daha pek çok parametre ile yapılandırma dosyanıza çeki düzen verebilirsiniz. Yeni başlayanlar ve uğraşmak istemeyenler için örnek www.conf dosyasını buradan indirebilir bu dosyayı kullanabilirsiniz.
Yapılandırma dosyasını indir.
Ardından /etc/php.ini dosyasını açalım ve cgi.fix_pathinfo değerini 0 olarak değiştirelim.
Şimdi sırası ile aşağıdaki komutları uygulayarak php-fpm servisinin çalışmasını ve açılışlarda da otomatik çalışmasını sağlıyoruz.
service php-fpm start chkconfig --levels 235 php-fpm on
NGINX Yapılandırması
Şimdi gelelim nginx yapılandırmasına
Nginx ayar dosyası /etc/nginx/nginx.conf ‘u açıp aşağıdaki içindeki satırları aşağıdakilerle değiştirelim.
user nginx; worker_processes 2; #warn error_log /var/log/nginx/error.log debug; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; 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; sendfile on; #tcp_nopush on; client_max_body_size 13m; keepalive_timeout 65; index index.php index.html index.htm; gzip on; gzip_types text/css application/x-javascript text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon; #Upstream to backend - PHP upstream php { server unix:/tmp/php-fpm.sock; # server 127.0.0.1:9000; } include /etc/nginx/conf.d/*.conf; }
Yada winscp gibi bir programla bu işleri yapıyorsanız örnek nginx.conf dosyasını indirip mevcut dosyanın üzerine yazdırabilirsiniz. Tabiki uzantısı txt olmamalıdır 🙂
Şimdi sıra geldi nginx fast-cgi ayarına. Bunun için /etc/nginx/fastcgi_params dosyasını açıp. İçindeki satırları sildikten sonra, aşağıdaki satırları yapıştırın.
fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
Yada örnek dosyayı indirip txt uzantısını kaldırarak mevcut dosyanın üzerine yazdırın.
Ardından aşağıdaki komutlarla nginx’i başlatalım ve açılışlarda otomatik olarak açılmasını sağlayalım.
service nginx start chkconfig --levels 235 nginx on
WordPress Yapılandırması
Şimdi sıra geldi wordpress sitemize göre nginx’e ayar vermeye. Daha önce apache yada litespeed kullananlar vhosts kavramını ve .htaccess dosyasını unutun. Bunları nginx’te server block’lar arasında tanımlamamız gerekli.
Öncelikle birden çok wordpress sitesinde kullanabileceğinizi varsayarak wordpress için ortak ayar dosyaları oluşturalım.
nginx conf.d dosyası altına global isminde bir dizin oluşturup wordpress.conf adında bir dosya oluşturun ve aşağıdaki satırları kaydedip çıkın. Yada wordpress.conf ‘u indirip kullanın.
nano /etc/nginx/conf.d/global/wordpress.conf
# WordPress multisite rules! # Designed to be included in any server {} block. # This order might seem weird - this is attempted to match last if rules below fail. # http://wiki.nginx.org/HttpCoreModule location / { try_files $uri $uri/ /index.php?$args; } # Add trailing slash to */wp-admin requests. rewrite /wp-admin$ $scheme://$host$uri/ permanent; # Directives to send expires headers and turn off 404 error logging. location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 24h; log_not_found off; } # Pass all .php files onto a php-fpm/php-fcgi server. location ~ \.php$ { # Zero-day exploit defense. # http://forum.nginx.org/read.php?2,88845,page=3 # Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi. # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine. And then cross your fingers that you won't get hacked. try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass php; } rewrite ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last; if (!-e $request_filename) { rewrite ^(.+)$ /index.php?q=$1 last; }
Şimdi de yine global dizini altında isteğe bağlı olarak kullanabileceğimiz bir kısıtlama dosyası oluşturacağız.
nano /etc/nginx/conf.d/global/restrictions.conf ile global dizini altında restrictions.conf dosyası oluşturup aşağıdaki satırları kaydedin. Yada örnek dosyayı indirin.
# Global restrictions configuration file. # Designed to be included in any server {} block.</p> location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac). location ~ /\. { deny all; access_log off; log_not_found off; }
Şimdi sıra geldi son adım olan bitirici hamleyi yapmaya 🙂 WordPress sitemizin yapılandırma dosyasını oluşturalım.
/etc/nginx/conf.d dizini altına uzantısı conf olacak şekilde bir dosya oluşturun. Genelde siteadi.conf tarzı bir yaklaşım kullanılır.
nano /etc/nginx/conf.d/wpnotlari.conf
artından aşağıdaki satırları ekleyip kaydedilim.
server { #dinleyeceğiniz port. domain mapping için statik ip kullanıyorsanız onu yazmalısınız. listen 192.168.1.1:80; #sunucu adınız server_name *.wpnotlari.com; #sitenizin root klasörü buraya root /www/wpnotlari; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } include conf.d/global/restrictions.conf; include conf.d/global/wordpress.conf; }
bu şekilde wordpress sitemizide yapılandırmış olduk.
Şimdi aşağıdaki komutlarla tüm servislere bir restart atalım, kendilerine gelsin 🙂
service nginx reload service nginx restart service php-fpm restart
Geçtiğimiz günlerde buna benzer bir yapılandırma ile lettoblog’u nginx’e geçirdik. Şu anda fena görünmüyor, ancak apc kurmak ve opcode cache yapmakta bir diğer önemli nokta. Zaten bu yazı yeterince uzun olduğundan nasip olursa APC kurulumunu başka bir yazıda anlatmak istiyorum.
Bir kez daha tekrarlamakta fayda var; bu kurulum wordpress multisite subdomain şeklinde kullananlar için örnektir. Subdirectory yada single wordpress kullanıcıları baştaki adımları takip ettikten sonra wordpress ayarlarını kendi kurulumlarına göre düzeltmek zorundadır.
Eklemek istediğiniz bilgi varsa yorum olarak yazabilirsiniz. Elimden geldiğince soruları cevaplayama çalışıyorum ancak, lütfen sorunuzun cevabını internette aramadan bende bu çalışmadı şeklinde destek talebinde bulunmayın.
Tavsiyeler;
- Bu kurulumu yapabilmeniz için az çok konsol kullanmaya aşina olmanız gerekmektedir. Bu konuda hiç tecrübeniz yoksa herhangi bir ftp istemcisi ile (filezilla, winscp…) 22 portundan root girişi yaparak örnek verdiğimiz konfigurasyon dosyalarını kullanarak işlem yapabilirsiniz.
- Versiyon olarak farklı bir işletim sistemi sürümü kullanıyorsanız, işletim sistemini güncelleyebilir yada kullandığınız repoları ona göre ayarlayabilirsiniz.
- Private ip içinde çalışacaksanız 192.168.x.x hosts dosyanızı ve network ayarının doğru yapıldığından emin olunuz.
- Varsayılan olarak apache kurulu ve çalışıyorsa nginx ile port çakışmasına uğrayacağından “service httpd stop” komutu ile apache’yi durdurun.
- Text editör olarak nano kullanmak istiyor ama hata ile karşılaşıyorsanız “yum install nano” komutu ile kurulumu gerçekleştirebilirsiniz. Vi kullananlar zaten bilirlerki nano da yapabileceklerini aynı şekilde vi ilede yapabilirsiniz.
- 80 portunun açık olduğundan emin olunuz.Eğer kapalıysa iptables’ten açabilirsiniz.
Faydalanılan kaynaklar;
1) http://ysfkc.com/php/nginx-load-balancer-ve-nginx-php-fpm-web-sunucu-kurulumu
2) http://www.ehowstuff.com/how-to-install-remi-yum-repository-on-centos-6-2-x86-and-x86_64/11/
3) http://www.timstephenson.me.uk/technology/get-started-with-wordpress-in-15-minutes
Bekir Cem der ki
Merhabalar.
Tüm ayarları yaptım ancak bir değişiklik olmadı.
Digital Ocean üzerinde Centos 6.5 64 Bit + Webuzo Panel + Nginx + Pagespeed Modülü yapılandırmalı bir VPS kullanıyorum. Sanırım network ayarı ile ilgili kısımda hata yapıyorum.
Mustafa Uysal der ki
Merhaba,
Yazi centos 6.2 uzerinde, pagespeed modulu kullanilmadan anlatilmistir. Yazi sonundaki tavsiyeleri bi’ kontol edin isterseniz.
Bekir Cem der ki
“[emerg] no port in upstream “php” in /usr/local/apps/nginx/etc/conf.d/global/wordpress.conf:33
nginx: configuration file /usr/local/apps/nginx/etc/nginx.conf test failed
”
Service nginx restart komutu verdiğimde bu hatayı alıyorum.
Mustafa Uysal der ki
nginx.conf’a seklinde upstream tanimlayin. Tabii fpm’in socket uzerinde calismasi icin gerekli ayarlamalarida yapin 😉
upstream php {
server unix:/var/run/php5-fpm.sock;
}