Skip to content

Instantly share code, notes, and snippets.

@roktas
Created September 12, 2010 05:18
Show Gist options
  • Save roktas/575865 to your computer and use it in GitHub Desktop.
Save roktas/575865 to your computer and use it in GitHub Desktop.
# kanonik kök dizin
root /srv/www/$host/site;
# öntanımlı indeksler
index index.html index.htm index.php;
# flv dosyalarında flv modülü etkin
location ~ \.flv$ {
flv;
}
# logları kirleten bazı botları reddet
if ($http_user_agent ~* (Baiduspider|Morfeus\ strikes)) {
return 444;
}
# nokta dosyalar daima gizli olmalı
location ~ /\. {
deny all;
}
# logları kirleten script-kiddie istekleri
location ~* /(phpmyadmin|php-my-admin)/ {
deny all;
}
# sahte refererları reddet
if ($http_referer ~* (babes|click|diamond|forsale|girl|jewelry|love|nudit|organic|poker|porn|poweroversoftware|sex|teen|video|webcam|zippo)) {
return 444;
}
# bakım kipi - kök dizinde .503 dosyası varsa sistem bakımda
if ( -f $document_root/.503) {
return 503;
}
# robot dosyası yoksa logları kirletme
location = /robots.txt {
log_not_found off;
}
# debian paket deposu sunuyorsak loglar kirlenmesin
location ~ /debian/.*(/i18n/Translation-|\.diff/Index).*$ {
log_not_found off;
}
# standart www yönlendirmesi
if ($host ~* www\.(.*)) {
set $x_host_without_www $1;
rewrite ^(.*)$ http://$x_host_without_www$1 permanent;
}
# özel 404 sayfası daima /40x/ dizininde
error_page 404 @40x;
location @40x {
rewrite ^(.*)$ /40x/index.html break;
}
# sistem bakımda sayfası daima /50x/ dizininde
error_page 500 502 503 504 @50x;
location @50x {
rewrite ^(.*)$ /50x/index.html break;
}
# statik dosyalarda zaman aşımını uzat
#location ~* \.(js|css|jpe?g|gif|png|svg|swf|pdf|docx?|odf|ppt|tar\.gz|zip|rar)$ {
# expires 31d;
# break;
#}
# bunun yerine
# tüm dosyalar için öntanımlı zaman aşımı değeri
location / {
expires 30d;
}
# php hangi dosyalarda etkin?
location ~ \.(php|phtml)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
@roktas
Copy link
Author

roktas commented Sep 14, 2010

doğru değil (ve bu sırayla sıkıntı da çıkarabilir, break'ten dolayı, bir denemek lazım). orası copy/paste'den kalma. zaten bunu kullanmaya gerek yok, ayrıca hallettik. düzeltilmiş versiyondaki location / { expires 31d; } default ayarı yeterli oluyor (@türker'den gelen bilgi).

@hmert
Copy link

hmert commented Dec 8, 2010

nginx configürasyonunuzu tam bilmemekle beraber host tarafındaki www yönlendirmesi maliyetli bir şey gibi geldi. Zira eğer cümlecikleri hep kötüdür, http://wiki.nginx.org/IfIsEvil

server {
        listen   80;
        server_name  www.$x_host_without_www;
        rewrite   ^  http://$x_host_without_www$request_uri? permanent;
}
server {
        listen   80;
        server_name  $x_host_without_www;
}

@roktas
Copy link
Author

roktas commented Dec 8, 2010

doğru, if'ten mümkün mertebe kaçınıyoruz. bu eski bir konfigürasyon. halihazırda www yönlendirmeleri DNS'te hallediliyor. önerdiğiniz yapıda sanıyorum x_host_without_www'yi (o değişleni if içinde biz set ediyorduk) hardcoded girilecek bir değer olarak düşündünüz. bu mümkün ama her yapılandırma için tekrar etmek gerekiyor. burada görülen if snippeti bir tür copy-paste-ready kod, doğrudan yapıştırmak veya dışarıdan include etmek yeterli.

@hmert
Copy link

hmert commented Dec 8, 2010

aynen, nginx'te vhost olarak yapılandırmasını otomatize etmişsiniz anladığım kadarıyla, bunu nasıl yaptığınızı sorabilir miyim? Normalde include * edilerek server eklenebiliyor.

@roktas
Copy link
Author

roktas commented Dec 8, 2010

bu kodu nginx yapılandırma köküne örneğin base.conf gibi bir isimle (debian ve türevi dağıtımlarda /etc/nginx/base.conf) aldıktan sonra include etmeniz yeterli olmalı. şöyle:

    server {
            listen 80;
            server_name .<ALANADI>; # alan adının başında "." var, bu şekilde wilcard alan adlarını da yönetebilirsiniz
            include base.conf;
            # varsa özel ayarlar
    }
    server {
            listen 443;
            server_name .<ALANADI>;
            include base.conf;
            # ssl stanza
            # varsa özel ayarlar
    }

@hmert
Copy link

hmert commented Dec 8, 2010

Anladım siz de benimkiyle benzer bir yöntem yapmışsınız. Fakat burda alan adına özel olarak log kaydı, fastcgi gibi şeyler eklendiğinde if cümlecikleri iyi olmuyor. Bir bash script ile bu işi otomatize ettim. Ama bu işi kendilğinden yaptırmak şimdilik çok fazla gelir galiba.

http{
 # genel ayarlarınız
 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-available/*;
}

alanadına özel olarak tanımlanmış dosya: ALANADI

server {

      listen   80;
      server_name ALANADI www.ALANADI;

      access_log /var/www/ALANADI/log/access.log;
      error_log /var/www/ALANADI/log/error.log;

      server_name_in_redirect off;


      location / {

            root   /var/www/ALANADI/public/;
            index index.php index.html index.htm;

      }

      location ~* ^.+\.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
      {
            root /var/www/ALANADI/public/;
            expires 30d;
            break;
      }




      #location ~ \.php$ {
      location ~ wp\-.*\.php|wp\-admin|\.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  /var/www/ALANADI/public/$fastcgi_script_name;
        fastcgi_param CONTENT-LENGTH $content_length;
      }
      include drop;
}

@roktas
Copy link
Author

roktas commented Dec 8, 2010

Öncelikle bu yapılandırmanın çok sayıda ince ayar gerektirebilecek high profile veya özel amaçlı sunucular için değil de, genel amaçlı sunucular için uygun olduğunu söyleyeyim. Bu varsayım altında pek çok durumda ve directive'de ALANADI'nı açık halde vermenize gerek yok. Burada bir kaç imkan var:

  • konvansiyon oluşturmalı ve yapılandırmada bu konvansyion varsayımlarını izlemelisiniz
  • $host değişkenini kullanabilirsiniz: root /var/www/ALANADI/public/ yerine /var/www/$host/public gibi.
  • rölatif değişkenlerden yararlanabilirsiniz: fastcgi_param SCRIPT_FILENAME $request_filename gibi.

Bahsettiğiniz gibi shell veya bir başka sistemle şablonlama yoluyla yapılandırma üretmek de mümkün. Ama bu tür yöntemlerde üretilmiş yapılandırmaları daha sonra güncelleme ihtiyacı ortaya çıktığında sıkıntı olabiliyor. Basit sunucular için ortak ayarların basitçe include edilmesi yöntemini bu nedenle tercih ediyorum. Fakat bana soracak olursanız yönettiğiniz sunucu sayısı çok fazlaysa tüm bu otomasyon işlemleri için puppet gibi modern ve güçlü bir yapılandırma framework'ünü kullanmak en doğrusu.

@roktas
Copy link
Author

roktas commented Dec 8, 2010

Örneğin yukarıda verdiğiniz yapılandırmada sadece server_name kısmında ALANADI gerekiyor. Diğer ayarların hiçbirinde ALANADI kullanmanıza gerek yok. Nginx'in pek çok özelliği var. Fakat bu özellikler ayrıntılı şekilde dokümante edilmediğinden bazen bunları keşfetmek zor oluyor.

@hmert
Copy link

hmert commented Dec 9, 2010

Benim şuanki konfigürasyonumda server_name tek başına yeterli olmayacaktır. Çünkü burdaki girdiğim pathler harici bir yere erişmesini istemiyorum kodun misal fastcgi_param SCRIPT_FILENAME $request_filename ile başka bir dizindeki bir dosyaya erişmesi mümkün sanki?
Nginx'in çok güzel özellikleri var. Ama dediğiniz gibi keşfetmek için çok araştırmak ve denemeler yapmak zorunda kalıyoruz. Bilgilerimizi paylaşalım :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment