Kategori arşivi: Nginx

Nginx web sunucusu için yapılandırma örnekleri, hata çözümleri, performans ayarları, güvenlik ipuçları ve kurulumu hakkında türkçe yazılar

Nginx’de Root ve Alias Farkı, Hangisini Kullanmalıyız ?

Uygulama sunucunuz da statik dosyalarınızı barındıracaksınız ve tüm linkleri 404 veriyorsa veya ayrı bir alan belirleyip sadece oraya yönlendirme yapmak istiyorsanız doğru yere geldiniz.

Burada ama asıl anlatacağımız nginx de tanımlama yaparken kullanılan root ve alias parametrelerinin ne işe yaradığı ve nasıl kullanılması gerektiğinden bahsedeyim sizlere bu tanımlamalar yapılırken pek çok yanlışlık yapıldığı için genelde niye çalışmıyor diyip küfürü basarsınız ama yapmayın bunu.

Şimdi size ilk olarak root tanımlamasını anlatayım. Tam yol olarak bahsetmemiz gerekiyor, konum kısmı da dahil olmak üzere ekleme yapılır.

Örnek bir çalışma yapalım /static klasörümüzü tanımlayacak olalım ve aşağıdaki gibi yazalım.

location /static/ {
    root /var/www/static/;
    autoindex off;
}

Bunun alacağı nihai yol şu şekilde olacaktır. /var/www/static/static haliyle böyle bir yol olmadığı içinde size çat diye 404 basacaktır. Bunun nedeni, konum bölümünün root da belirtilen yola eklenmesidir. Doğrusu ise şu şekilde olmalıdır.

location /static/ {
    root /var/www/;
    autoindex off;
}

alias da ise durum biraz daha farklıdır. Yalnızca konum yolunu içermeyen yolun bir parçası aliasa eklenir. Örnek verecek olursak şu şekilde kullanım yanlıştır.

Bu şekilde kullanıldığında çıktısı /var/www/ Şeklinde olacaktır.

location /static/ {
    alias /var/www/;
    autoindex off;
}

Bu durumun başlıca nedeni takma ad verecek olduğunuz alanda gerçekten bir /static yolunun konum ile eşleşmesinden geçmektedir. İstediğiniz her hangi bir yolu verebilirsiniz. Doğrusu ise şu şekilde olmalıdır.

location /static/ {
    alias /var/www/static/;
    autoindex off;
}

Bunun ise bize vereceği çıktı /var/www/static/ olarak gözükecektir. Eğer dosyalarınız varsa kolaylıkla erişebileceksiniz.

Nginx İçin Self-Signed SSL Sertifikası Oluşturma

Nginx için SSL sertifikasını ayarlamak oldukça basittir hele ki bu işlem self-signed ise ve özellikle cloudflare gibi bir aracı kullanılacak ise daha iyi olacaktır. Direk olarak cloudflare Mitm olayından etkilenmemiş olursunuz ama gene etkilenirsiniz.

Ben bahsettiğim gibi Cloudflare’yi araya alacaksam böyle bir yöntemi kullanıyorum. Diğer türlü araya Cloudflare girmeyecek ise o zaman yapacaklarımız tabi ki farklı olacak

Nginx klasörü içerisine ssl adında bir klasör oluşturuyoruz.

mkdir /etc/nginx/ssl

daha sonra veriyoruz sihirli komutu

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/mertcangokgoz.com.key -out /etc/nginx/ssl/mertcangokgoz.com.crt

RSA da kullandığımız bit uzunluğumuz çok olduğu için sisteminize göre baya sürebilir. Çok sürmesini istemiyorsanız Baba’ya Kullanılabilir Entropi Lazım makalemizdeki adımları uygulayarak işlemleri hızlandırabilirsiniz.

Bizden istediklerini güzelce dolduruyoruz.

Country Name (2 letter code) [AU]:TR
State or Province Name (full name) [Some-State]:Ankara
Locality Name (eg, city) []:Ankara
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mertcan, Inc.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:mertcangokgoz.com
Email Address []:admin@mertcangokgoz.com

Ardından SSL oluşturulma işlemine başlanılacak zaten yerini ayarladığımız içinde /etc/nginx/ssl içerisine .key ve .crt çıkacak

Forward Secrecy olayını gerçekleştirmek için dhparam.pem ihtiyacımızı karşılamalıyız.

İletme gizliliği(Forward Secrecy) kavramı basittir: Sunucudan RSA özel istemci ve sunucu arasında bir Diffie-Hellman anahtar değişimini imzalamak için kullanılır. El sıkışma ile elde edilen pre-master anahtar, şifreleme için kullanılır. Ana anahtar bir istemci ve sunucu arasında geçen bir bağlantıya özgüdür ve yalnızca sınırlı bir süre için kullanılır, ömrü kısadır daha sonrasında kullanılmaz.

İletme Gizliliği ile, bir saldırgan sunucunun özel anahtarını eline geçirirse, geçmiş iletişim şifresini çözmek saldırgan için mümkün olmayacaktır. Özel anahtar sadece pre-master anahtarı ortaya koymuyor, ki DH yi, imzalamak için kullanıyor. Pre-master anahtarlar hiçbir zaman istemci ve sunucu arasında bir saldırgan tarafından yapılan ve tespit edilemeyen MITM’leri engeller.

cd /etc/nginx/ssl/
openssl dhparam -out dhparam.pem 4096

Daha sonrasında gerekli olan düzenlemeleri şu şekilde yapıyoruz ve konfigürasyon dosyamız hazır olmuş oluyor.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name git.mertcangokgoz.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name git.mertcangokgoz.com;
    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /etc/nginx/ssl/mertcangokgoz.com.crt;
    ssl_certificate_key /etc/nginx/ssl/mertcangokgoz.com.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 4096 bits
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    # modern configuration. tweak to your needs.
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    location / {
	    try_files $uri $uri/ =404;
    }
}

Bu işlemlerden sonra nginx -t çalıştırıyoruz. Test sonucumuz aşağıdaki gibi olursa

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Tekrardan reload yapıyoruz yada yeniden başlatıyoruz. ve ayarların geçerliliğini sağlıyoruz.

nginx -s reload

veya

systemctl restart nginx

Nginx İçin Basit Kimlik Doğrulama Modülü

Web sitenizde gelen ziyaretçilerin bazı alanlara ulaşmasını istemiyorsanız. Basit ama etkili olan bu yöntemi kullanabilirsiniz. Bize gerekli olan apache için kullanılan htpasswd yi nginx içinde kullanmak

İlk önce apache2 de kullanılan utils paketini sisteme dahil edelim

apt-get install apache2-utils

kurulumu yaptıktan sonra kullanıcı oluşturmamız gerekiyor bunu isterseniz web sitelerini kullanarak isterseniz de aşağıdaki komut ile oluşturabilirsiniz.

htpasswd -c /etc/nginx/.htpasswd Mertcan

Kullanıcı için parola tanımladık ve aşağıdaki gibi işlemi tamamladık

New password:
Re-type new password:
Adding password for user Mertcan

Kullanıcımızı ve bu kullanıcıya ait gerekli parolayı oluşturma işlemimizi tamamladık. Şimdi nginx konfigürasyon dosyamızı kurcalamaya geldi sıra kullanıcılara kısıtlayacağımız yerin location bloğu içerisine aşağıdaki satırları ekliyoruz.

auth_basic "Yetkili Kullanici Girisi";
auth_basic_user_file /etc/nginx/.htpasswd;

bu işlemin hemen ardından tanımladığınız kullanıcı adı ve parola ile sisteme giriş yapabilmenin aktif olabilmesi için nginxi yeniden başlatıyoruz veya reload yapıyoruz.

nginx -s reload

Bu işlemden sonra kısıtladığınız alana tnaımladığınız kullanıcı adı ve parola ile sadece siz ve belirlediğiniz kişiler girebilir bir duruma getirdik.

Nginx için Yoast’s SEO Sitemap Ayarları

Google XML Sitemap üzerinde bulunan hatalar ve uzun süredir güncelleme almamasından dolayı yeni bir Sitemap eklentisi arıyordum Yoast’s SEO kullandığım için Sitemap özelliğini açayım dedim Apache üzerinde pek sıkıntı çıkmasa da Nginx üzerinde çok nadir 404 hatası vermektedir bunun çözümü ise aşağıdaki kodu nginx de site.conf dosyanıza eklemeniz olacaktır.

#Yoast SEO Sitemaps
location ~ ([^/]*)sitemap(.*).x(m|s)l$ {
  ## this rewrites sitemap.xml to /sitemap_index.xml
  rewrite ^/sitemap.xml$ /sitemap_index.xml permanent;
  ## this makes the XML sitemaps work
  rewrite ^/([a-z]+)?-?sitemap.xsl$ /index.php?xsl=$1 last;
  rewrite ^/sitemap_index.xml$ /index.php?sitemap=1 last;
  rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php? 
  sitemap=$1&sitemap_n=$2 last;
  ## The following lines are optional for the premium extensions
  ## News SEO
  rewrite ^/news-sitemap.xml$ /index.php?sitemap=wpseo_news last;
  ## Local SEO
  rewrite ^/locations.kml$ /index.php?sitemap=wpseo_local_kml last;
  rewrite ^/geo-sitemap.xml$ /index.php?sitemap=wpseo_local last;
  ## Video SEO
  rewrite ^/video-sitemap.xsl$ /index.php?xsl=video last;
}

Sadece sitemap özelliğini kullanacaksanız ve herhangi ek bir wordpress eklentisi kullanmayacaksanız direk olarak aşağıdaki kodlar işinizi görecektir. Yukarıdaki kodları eklemenize gerek yoktur.

# Rewrites for Yoast SEO XML Sitemap
rewrite ^/sitemap_index.xml$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;

bu şekilde XML sitemap kolay bir şekilde nginx tarafından hatasız olarak gösterilecek kimi zaman aldığınız 404 hatasından kurtulacaksınız…

Nginx ve Apache Üzerinde XSS Engelleme

XSS yani normal adıyla “Cross Site Scripting” çok eski bir açık. Ancak günümüzde önlemi alınmadığı taktirde bu açığa oldukça fazla denk gelmemiz mümkün.

Yazılan uygulamada önlem alınmamasından kaynaklandığını söylemiştik saldırgan kendi hazırladığı kod ile siteniz üzerinde bir takım yönlendirmelerde bulunabilir veya kod çalıştırıp ziyaretçilerinize istediğini gösterebilir.

Apache ve Nginx üzerinde ise gelen bu saldırıları bir nebzede olsun durdurabilmek ve sonuç alınabilmesini engellemek mümkündür. Tabi bazı XSS kodlarına karşı savunmasız olacaktır.

Apache için .htaccess dosyanızın en altına aşağıdaki kodu ekleyiniz

RewriteCond %{REQUEST_URI} base64_encode.*(.*) [OR]
RewriteCond %{REQUEST_URI} (lt;|<).*script.*(gt;|>) [NC,OR]
RewriteCond %{REQUEST_URI} (lt;|<).*iframe.*(gt;|>) [NC,OR]
RewriteCond %{REQUEST_URI} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
RewriteCond %{REQUEST_URI} _REQUEST(=|[|%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ 404.html [F,L]

Nginx için site.conf dosyanızın altına aşağıdaki kodu ekleyiniz.

    set $block_xss 0;
    if ($query_string ~ "base64_(en|de)code(.*)") {
    	set $block_xss 1;
    }
    if ($request_uri ~ "base64_(en|de)code(.*)") {
    	set $block_xss 1;
    }
    if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
    	set $block_xss 1;
    }
    if ($request_uri ~ "(<|%3C).*script.*(>|%3E)") {
    	set $block_xss 1;
    }
    if ($query_string ~ "(<|%3C).*iframe.*(>|%3E)") {
    	set $block_xss 1;
    }
    if ($request_uri ~ "(<|%3C).*iframe.*(>|%3E)") {
    	set $block_xss 1;
    }
    if ($query_string ~ "GLOBALS(=|[|%[0-9A-Z]{0,2})") {
            set $block_xss 1;
    }
    if ($query_string ~ "_REQUEST(=|[|%[0-9A-Z]{0,2})") {
            set $block_xss 1;
    }
    if ($block_xss = 1) {
    	return 403;
    }

Tüm XSS kodlarını engellemeyeceğini unutmayın gelen saldırıya göre varyasyonları değiştirmeniz ve(veya) ekleme yapmanız gerekmektedir.

Tek İP Adresine Birden Çok SSL Kurulumu

Herhangi bir web sitesinde SSL aktif etmek için özel bir ip adresi gerekiyor.Hem sunucu sahipleri hemse hosting firmalar özel ip tahsisi konusunda sıkıntılıdırlar. Bu noktada devreye SNI(Server Name Indication) devreye giriyor.

SSL ile şifrelenmiş veri kullanıcının tarayıcısında açılıyor. Aradaki bağlantı tamamen şifreli olduğu için iletişim sırasında header yerine ip adresine bakılması gerekiyor bu yüzdende SSL kullanımında özel ip gerekiyordu SNI desteği aslına bakarsanız bu zorunluluğu ortadan kaldırdı.

Özel İP zorunluluğu olmadan tek ip üzerinde birden çok site barındırabilir ve daha sonra bu sitelere SSL kurulumu gerçekleştirebilirsiniz. Ancak bilmenizde yarar var SNI özelliğini eski tarayıcılar desteklemiyor.

Ayrıca SNI kullanılan tarayıcı dışında TLS desteklemeyen mail server yapılarında sıkıntılara yol açabileceğinden dikkatli olunuz.

Peki bu SNI kurulumu nasıl gerçekleşir?

İlk olarak yapmanız gereken şey sisteminize nginx kurmak herhangi extra bir pakete gerek yok sade bir şekilde kurulumu yapabilirsiniz.

sudo apt-get install nginx

kurulum tamamlandıktan sonra Nginx sürümünüzün SNI destekleyip desteklemediğini sürüm bilgisi öğrenmek için verdiğiniz komut ile rahatlıkla görebilirsiniz.

snidesteginginx

Gördüğünüz gibi “TLS SNI supported enabled” yazısı ile karşılaştık yani nginx bu sürümünde SNI desteği aktif olarak geliyor. Şimdi biz bu desteği gördüğümüz için kurulum evresine geçebiliriz. Standart bir Nginx site nasıl kuruluyorsa o şekilde kurulum olacak tek farkı SSL sertifika komutlarına gereken sertifikaları gireceğiz ve aktif edeceğiz.

2 site için kurulumu göstereceğim daha fazla sitedede kullanabilirsiniz hiç fark etmiyor sadece SSL sertifikası ihtiyacınız olacaktır.

mertcangokgoz.com için

mkdir -p /etc/nginx/ssl/mertcangokgoz.com

mertcangokgoz.org için

mkdir -p /etc/nginx/ssl/mertcangokgoz.org

Şimdi 2 site içinde issue edilebilsin diye key ve bunun sonrasında csr oluşturmamız gerekecek.

cd /etc/nginx/ssl/mertcangokgoz.com

klasörü içerisine giriş yapıyoruz.Aşağıdaki komutlar ile SSL kurulumuna başlıyoruz.

openssl ecparam -out www_mertcangokgoz_com.pkey -name prime256v1 -genkey &amp;&amp; openssl req -new -key www_mertcangokgoz_com.pkey -nodes -out www_mertcangokgoz_com.csr -subj "/C=TR/ST=TR/L=Ankara/O=Mertcan/OU=Mertcan/CN=www.mertcangokgoz.com"

.org uzantısı içinde aynı aşamayı yapacağız bunun için ise

cd /etc/nginx/ssl/mertcangokgoz.org

klasör içerisine giriş yaptık ve ssl için kurulum parametrelerini giriyoruz.

openssl ecparam -out www_mertcangokgoz_org.pkey -name prime256v1 -genkey &amp;&amp; openssl req -new -key www_mertcangokgoz_org.pkey -nodes -out www_mertcangokgoz_org.csr -subj "/C=TR/ST=TR/L=Ankara/O=Mertcan/OU=Mertcan/CN=www.mertcangokgoz.org"

Şimdi gereken dosyalar ile anahtarınızı onaylayabileceğiniz bir firma buluyorsunuz SSLS sitesini bu iş için kullanabilirsiniz oldukça uygun fiyatlarda SSL sertifikaları bulunuyor. Oluşturduğunuz .key ve .csr olacak 2 şey adet bunlardan .csr olanını firmaya gönderiyorsunuz ve firma size 3 adet dosya gönderiyor yaklaşık onaylanması 1-5 dk sürebilir.

Gönderilen bu dosyalar içerisinden gereken işlemi yapalım, Size verilen ve domain adınızı içeren sonu .crt olan sertifika ile CA sertifikasını birleştiriyoruz.

cat siteadresi.com.crt CA.crt >> chainbundle.crt

Şimdi birleştirdiğimiz crt dosyasını domainin klasörüne atıyorsunuz ve şu şekilde ilk domaini tanımlıyorsunuz. Tanımlama yaptıktan sonra aynı klasör içerisinde .key uzantılı bir private keyiniz olacak bu keyin ismini de ssl_certificate_key satırına gireceğiz

    server {

    listen 443;

    ssl on;
    ssl_certificate /etc/nginx/ssl/chainbundle.crt;
    ssl_certificate_key /etc/nginx/ssl/siteadi.com.key;
    .
    .
    .
    .
    }

Bir sonraki domain içinde aynı aşamaları izliyorsunuz.

cat siteadresi.org.crt CA.crt >> chainbundle.crt

birleştirilmiş olan crt dosyasını tekrardan tanımlanacak domainin klasörüne atıyorsunuz ve şu şekilde ikinci domain’i tanımlıyorsunuz. Tanımlama yaptıktan sonra aynı klasör içerisinde .key uzantılı bir private keyiniz olacak bu keyin isminide ssl_certificate_key satırına gireceğiz ilk domain adresinde yaptığımız gibi

    server {

    listen 443;

    ssl on;
    ssl_certificate /etc/nginx/ssl/chainbundle.crt;
    ssl_certificate_key /etc/nginx/ssl/siteadi.org.key;
    .
    .
    .
    .
    }

işlemler bu şekilde tamamlanıyor.Şimdi yapacağınız şey nginx yeniden başlatmak

service nginx restart

Başarılı bir şekilde yeniden başlattığınızda aynı ip üzerinde iki farklı site içinde SSL kullanmış olacaksınız.

Nginx Üzerinde HTTP/2 Yapılandırılması

Uzun süredir http/2 biye bize SPDY bir şey yutturmuştu geliştiriciler şimdi ise bunu bir kenara bırakıp ciddi ciddi http/2 ye geçmeye başladık nginx kullanan web site sahipleri hemen güncellemelerini ve ayarlamalarını yaptı lakin bizim ülkemizde bunu hemen görmenin imkanı pek yok gibi duruyor.

Öncelikle 22 Eylül tarihinde duyurulan bir güncelleme ile Nginx 1.9.5 sürümü geldi bu sürüm ilede geliştiriciler HTTP/2 protokolüne şrank diye geçtiler. Nginx ayarlamalarınızı yaparken öyle uç noktalarda bir işlem gerekmiyor sadece derlerken yeni parametreleri eklemeniz gerekiyor.

Yapılması gerekenler sırasıyla

wget http://nginx.org/download/nginx-1.9.5.tar.gz
tar -zxvf nginx-1.9.5.tar.gz

ardından dizin içerisine giriş yapıyoruz ve parametrelerimizi sırasıyla giriyoruz.

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-file-aio --with-ipv6 --with-http_v2_module

ufak bir işlemden sonra aşağıdaki parametreleri veriniz.

make && make install

bu komutları verdikten sonra kurulum tamamlanmış oluyor ama servisi başlatmadan önce yapmanız gereken birşey var spdy kalıntılarından kurtulmak bunları şu şekilde yapabilirsiniz.Sistemde tanımladığınız domine ait olan ayar dosyasını buluruz.

Dosya: /etc/nginx/sites-available/mertcangokgoz.com

nano mertcangokgoz.com

içerisinde 443 portunu kullanan servislerin sonunda bilindiği gibi spdy bulunuyor çünkü önceden spdy kullanıyorduk bu kısımları kaldırıyoruz ve yerine http2 yazıyoruz.

server {
	listen 443 ssl http2;
        listen [::]:443 ipv6only=on ssl http2;
        server_name mertcangokgoz.com;
	error_page 404 /404.html;
   	error_page 500 502 503 504 /50x.html;
}

Aynı dosya içerisinde birde “spdy_headers_comp 0;” şu şekilde bir satır bulunacak bunu da dosya içerisinden kaldırıyorsunuz.Servisi yeniden başlattıktan sonra İşlemimiz böylelikle tamamlanmış oluyor artık HTTP/2 protokolüne geçiş yaptınız.

Test etmek için bu web sitesinden faydalanabilirsiniz. (Sitesinde CloudFlare aktif olan arkadaşlar analizlerde Http/2 kullandıklarını henüz göremeyecekler çünkü cloudflare hala SPDY kullanmaktadır.)

Prestashop için Nginx Ayarları

Prestashop açık kaynak kodlu ve ücretsiz bir E-Ticaret tabanlı içerik yönetim sistemidir.Bu sistem Apache alt yapısında sorunsuz çalışmakta ama iş Nginx gelince ayarlamaları biraz zorlaşıyor lakin Nginx de sistem daha stabil çalışıyor.Yüklü miktarda yapılan isteklerde şişme yapmıyor haliyle de performansı yüksek.İlk olarak sitenizin adı ile bir config dosyası oluşturarak işe başlayabilirsiniz.

Dosya : /etc/nginx/sites-available/siteadi.conf

İçerisine belli başlı komutları giriyoruz.

server {
    # IPv4.
    listen 80;
    listen 443 ssl http2;

    # IPv6.
    # listen [::]:80;
    # listen [::]:443 ssl http2;

    # [EDIT] Your domain name(s) go here.
    server_name example.com www.example.com;

    # [EDIT] Path to your domain Nginx logs.
    # more details: https://docs.nginx.com/nginx/admin-guide/monitoring/logging/#setting-up-the-access-log
    access_log /var/log/nginx/example.com-access.log combined;
    # more details: https://nginx.org/en/docs/ngx_core_module.html?#error_log
    error_log /var/log/nginx/example.com-error.log info;

    # [EDIT] Path to your SSL certificates (take a look at Certbot https://certbot.eff.org).
    ssl_certificate /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/privkey.pem;

    # [EDIT] Path to your PrestaShop directory.
    root /path/to/prestashop;

    index index.php;

    # This should match the `post_max_size` and/or `upload_max_filesize` settings
    # in your php.ini.
    client_max_body_size 16M;

    # Redirect 404 errors to PrestaShop.
    error_page 404 /index.php?controller=404;

    # HSTS (Force clients to interact with your website using HTTPS only).
    # For enhanced security, register your site here: https://hstspreload.org/.
    # WARNING: Don't use this if your site is not fully on HTTPS!
    # add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" preload; always;

    # XSS Protection
    # add_header X-XSS-Protection "1; mode=block";

    # Clickjacking
    # add_header X-Frame-Options "SAMEORIGIN";

    # X-Content Type Options
    # add_header X-Content-Type-Options nosniff;

    # Secure Cookie
    # add_header Set-Cookie "Path=/; HttpOnly; Secure";


    # [EDIT] If you are using multiple languages.
    # rewrite ^/fr$ /fr/ redirect;
    # rewrite ^/fr/(.*) /$1;
    # Watch out: if you encounter issues with a quick view or shopping cart, you might want to use a different rule:
    # rewrite '^/((?!js|qq)[a-z]{2})/(.*)' /index.php?isolang=$1&$args last;
    # see: https://github.com/PrestaShop/PrestaShop/issues/14921#issuecomment-948932833

    # Images.
    rewrite ^/(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$1$2.jpg last;
    rewrite ^/(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$1$2$3.jpg last;
    rewrite ^/(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$1$2$3$4.jpg last;
    rewrite ^/(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5.jpg last;
    rewrite ^/(\d)(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6.jpg last;
    rewrite ^/(\d)(\d)(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7.jpg last;
    rewrite ^/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8.jpg last;
    rewrite ^/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9.jpg last;
    rewrite ^/c/([\w.-]+)/.+\.jpg$ /img/c/$1.jpg last;

    # AlphaImageLoader for IE and FancyBox.
    rewrite ^images_ie/?([^/]+)\.(gif|jpe?g|png)$ js/jquery/plugins/fancybox/images/$1.$2 last;

    # Web service API.
    rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;

    # Installation sandbox.
    rewrite ^(/install(?:-dev)?/sandbox)/.* /$1/test.php last;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # [EDIT] Replace 'admin-dev' in this block with the name of your admin directory.
    location /admin-dev/ {
        try_files $uri $uri/ /admin-dev/index.php$is_args$args;
    }


    # .htaccess, .DS_Store, .htpasswd, etc.
    location ~ /\. {
        deny all;
    }

    # Source code directories.
    location ~ ^/(app|bin|cache|classes|config|controllers|docs|localization|override|src|tests|tools|translations|var|vendor)/ {
        deny all;
    }

    # vendor in modules directory.
    location ~ ^/modules/.*/vendor/ {
        deny all;
    }

    # Prevent exposing other sensitive files.
    location ~ \.(log|tpl|twig|sass|yml)$ {
        deny all;
    }

    # Prevent injection of PHP files.
    location /img {
        location ~ \.php$ { deny all; }
    }

    location /upload {
        location ~ \.php$ { deny all; }
    }

    location ~ [^/]\.php(/|$) {
        # Split $uri to $fastcgi_script_name and $fastcgi_path_info.
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;

        # Ensure that the requested PHP script exists before passing it
        # to the PHP-FPM.
        try_files $fastcgi_script_name =404;

        # Environment variables for PHP.
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;

        fastcgi_index index.php;

        fastcgi_keep_conn on;
        fastcgi_read_timeout 30s;
        fastcgi_send_timeout 30s;

        # Uncomment these in case of long loading or 502/504 errors.
        # fastcgi_buffer_size 256k;
        # fastcgi_buffers 256 16k;
        # fastcgi_busy_buffers_size 256k;

        # [EDIT] Connection to PHP-FPM unix domain socket.
        fastcgi_pass unix:/var/run/php/php-fpm.sock;
    }
}
Nginx

Bu kullandıklarınız da sorun çıkarsa aşağıdakilerinide kullanabilirsiniz.Sürüm farklılığından doğan URL sorunları olabiliyor.

rewrite ^/([a-z0-9]+)-([a-z0-9]+)(-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*).jpg$ /img/p/$1-$2$3.jpg last;
rewrite ^/([0-9]+)-([0-9]+)/([_a-zA-Z0-9-]*).jpg$ /img/p/$1-$2.jpg last;
rewrite ^/([0-9]+)(-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*).jpg$ /img/c/$1$2.jpg last;
rewrite "^/lang-([a-z]{2})/([a-zA-Z0-9-]*)/([0-9]+)-([a-zA-Z0-9-]*).html(.*)$" /product.php?id_product=$3&isolang=$1$5 last;
rewrite "^/lang-([a-z]{2})/([0-9]+)-([a-zA-Z0-9-]*).html(.*)$" /product.php?id_product=$2&isolang=$1$4 last;
rewrite "^/lang-([a-z]{2})/([0-9]+)-([a-zA-Z0-9-]*)(.*)$" /category.php?id_category=$2&isolang=$1 last;
rewrite ^/([a-zA-Z0-9-]*)/([0-9]+)-([a-zA-Z0-9-]*).html(.*)$ /product.php?id_product=$2$4 last;
rewrite ^/([0-9]+)-([a-zA-Z0-9-]*).html(.*)$ /product.php?id_product=$1$3 last;
rewrite ^/([0-9]+)-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$1 last;
rewrite ^/content/([0-9]+)-([a-zA-Z0-9-]*)(.*)$ /cms.php?id_cms=$1 last;
rewrite ^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$ /supplier.php?id_supplier=$1$3 last;
rewrite ^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$ /manufacturer.php?id_manufacturer=$1$3 last;
rewrite "^/lang-([a-z]{2})/(.*)$" /$2?isolang=$1 last;
Nginx

Yaptığınız bu işlemlerden sonra servisi yeniden başlatmayı unutmayınız.

systemctl restart nginx
ShellScript

Nginx SSL Yönlendirme

SSL Aktif ettiğim zaman apache kullanıyordum.Sonradan baktım apacheden bir yol olmayacak geçtim nginx e bu seferde http yönlendirmesinin kolay olmadığını söylediler dedim nasıl kolay olmaz hemen yaptım ayarlamaları yönlendirdim http trafiğini https e böylelikle güvenlik üst seviyelere yükselmiş oldu kullanıcılar http girseler bile otomatik olarak https trafiğine yönlenecekler bu yüzden içimiz rahat

Dosya : /etc/nginx/nginx.conf satırının en üstüne yeni bir server bloğu açıp aşağıdakileri yazıyoruz

server {
server_name mertcangokgoz.com;
rewrite ^/(.*) https://mertcangokgoz.com/$1 permanent;
}

Ardından nginx restart etmemiz gerekiyor.

service nginx restart

Nginx’de Cors Ayarları Nasıl Yapılır

Cors belkide internet ortamında en fazla aradığım şeylerden bir tanesi olabilir.Yaklaşık 2 hafta aramışımdır en iyi ayarı bulana kadar deneme yanılma derken çalışan versiyonu sonunda karşınıza çıkartıyorum.

CDN kullanmaya başladığınızda Cors eğer aktif değilse web fontlar gözükmez yada uzaktan çekilen resimler hata verir işte CORS bunun önüne geçiyor ve hepsine izin veriyor Apache sistemlerde oldukça basit olsada Nginx de yapılan her isteğe ayrı ayrı davranmamız gerekiyor. Güvenlik bakımından da oldukça faydalı yapmanız gereken

Dosya : /etc/nginx/global/cors.conf

adında bir dosya oluşturmak ve sonrasında aşağıdaki satırları içerisine eklemek

location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
}

Eklediğimiz bu satırlar sayesinde Nginx artık CDN de sıkıntı çıkartmayacak ve web fontlarınız düzgün bir şekilde çalışacak Peki Apache kullanıyorsak ne yapacağız alışılmışın aksine aslında standart belirlenen CORS apache de çalışmaz. .htaccess içerisine aşağıdaki kural setini tanımlamanız gerekmektedir.

<FilesMatch ".(ttf|ttc|otf|eot|woff)$">
<IfModule mod_headers>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>

İşlem tamamdır artık CDN de ve APİ uygulamalarınızda sıkıntı yaşamayacaksınız.

Nginx’de Spam Referrer Trafiği Yasaklama

Nginx Web Server kullanmaya başladığınız zaman yasaklamış olduğunuz tüm Spam trafikler bir anda tekrar sitenize gelmedi başladı değil mi ? gerçekten de böyle sıkıcı bir durum hakim Nginx de Allahtan bunu kolaylıkla yasaklayabiliyoruz. Üstelik öyle fazlasıyla uğraştırmıyor ancak etki etmesi biraz zaman alacak yaklaşık 24 saat kadar.Tabi bu işlemleri yaptıktan sonra Nginx yeniden başlatmayı unutmayınız.

Ekleyeceğiniz yer sitenizin kod blockları ancak orada kalabalık yaptırmayalım ayrı bir dosya şeklinde kayıt edin şöyle ki

Dosya : /etc/nginx/global/referer-blocker.conf

##
# Referrer Blocker Modified Mertcan Gokgoz
##
if ($http_referer ~* "(buttons-for-website.com|darodar.com|econom.co|ilovevitaly.co|kambasoft.com|lumb.co|7makemoneyonline.com|ranksonic.info|savetubevideo.info|see-your-website-here.com|semalt.com|priceg.com|srecorder.com|descargar-musica-gratis.net|54.186.60.77|lomb.co)") {
return 403;
}
if ($http_referer ~* "(medispainstitute|sq01|alienpayday|artobox|axisalternativementalhealthsharebutton.net|torontoplumbinggroup.com|tasteidea.com|paparazzistudios.com.au|76brighton.co.uk|powitania.pl|ilovevitaly.ru|ilovevitaly.com|blackhatworth.com|hulfingtonpost.com)") {
return 403;
}
if ($http_referer ~* "(cenoval.ru|bestwebsitesawards.com|sitevaluation.org|howtostopreferralspam.eu|100dollars-seo.com|event-tracking.com|get-free-traffic-now.com|guardlink.org|dailyrank.net)") {
return 403;
}

Bu kodları ekledikten sonra kayıt edip çıkın metriklerde her yeni gördüğünüz site için yukarıdaki gibi ekleme yapmanız yeterli buralardan gelen trafik otomatik olarka 403 yönlendirilecek ve sitenize uğramayacaklar.

Kodların kabul olması için server blockları içerisine aşağıdaki kodu eklemeyi unutmayınız.

include /etc/nginx/global/*;

Eklendikten sonraki görünümü ise

server {
[...]
include /etc/nginx/global/*;
}

Başarılı bir şekilde spam trafiklerden kurtulmuş oldunuz unutmamanız gereken bir noktada var bu yöntem hepsini yok etmeyecektir sadece belirli trafik kaynaklarını engelleyecektir.Adı sanı bilinmeyen spam yöntemlerini ise CloudFlare kullanarak engelleyebilirsiniz.

Nginx Statik Dosyalar’da Browser Cache İşlemi

Sitenizi Nginx alt yapısına taşıdıysanız apacheden kalma browser cache özelliklerinin hiç birini kullanamazsınız ancak nginx bunu yapmak için size bir kolaylık sunar aslında hemen sitenizin ayar dosyasına ulaşın genelde yolu /etc/nginx/sites-aveilable gibi bir şey, buradan komutlar ile dosyayı açın ve server blockları içerisine aşağıdaki komutları yapıştırıp kayıt edin

    location ~* .(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso)$ {
gzip_static off;
#add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
access_log off;
expires 30d;
break;
}
location ~* .(js)$ {
#add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
access_log off;
expires 30d;
break;
}
location ~* .(css)$ {
#add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
access_log off;
expires 30d;
break;
}
location ~* .(html|htm|txt)$ {
#add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
access_log off;
expires 1d;
break;
}
location ~* .(eot|svg|ttf|woff)$ {
#add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
access_log off;
expires 30d;
break;
}

Sonrasında Nginx servisini yeniden başlattığınızda artık statik dosyalarınız tarayıcı tarafından ön bellek yapacak ve gerek pagespeed gerekse gtmatrix gibi sitelerde hata almayacaksınız.