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’te Hotlink Koruması Nasıl Yapılır?

Hotlink koruması, bir web sitesinin dosyalarının (örneğin, resimler, videolar, belgeler) başka web siteleri tarafından izinsiz olarak kullanılmasını engelleyen bir güvenlik önlemidir. Bu tür izinsiz kullanım, genellikle “hotlinking” veya “leeching” olarak adlandırılır. Hotlinking, bir web sitesindeki bir dosyanın doğrudan URL’sini kullanarak kendi sitesinde göstermeyi içerir, bu da kaynak siteye ekstra bant genişliği yükü getirir. Sınırsız bant genişliğiniz yoksa aşağıdaki işlemi nginx özelinde yapmanızı şiddetle öneririm.

İzin verilen refereleri belirledikten sonra yapılandırmamız aşağıdaki gibi olmalıdır. Böylece belirlediğiniz yerler dışında hiç bir yerde görselleriniz gözükmez.

location ~ .(gif|png|jpe?g|svg|webp|avif|jxl)$ {
     valid_referers none blocked ~.linkedin. ~.google. ~.bing. ~.yahoo. ~.facebook. ~.twitter. ~.x. ~.reddit. ~.pinterest. mertcangokgoz.com *.mertcangokgoz.com;
     if ($invalid_referer) {
        return 403;
    }
}
Nginx

Ayrıca daha fantastik çözümler üreterek karşı web sitesinde uyarı için bir görsel yayınlayabilirsiniz. Bu işlemden sonra NGINX web sunucusunu yeniden başlatmayı unutmayınız.

Hotlink koruması, web sitenizin kaynaklarını korumanın yanı sıra performansını ve güvenliğini artırmak için önemli bir adımdır. Bu nedenle, özellikle yüksek trafiğe sahip siteler için bu tür koruma önlemlerinin alınması önerilir.

NGINX Wordpress W3Cache Ayarları

W3Cache kullanırken normalde nginx üzerinde herhangi bir ayar yapmanıza gerek kalmaz, ancak gelişmiş yapılandırma kullanılırsa özellikle aşağıdaki gibi bir yapılandırma kullanmak zorundasınız.

Örneğin JS ve CSS sıkıştırılması, bazı alanlarda kullanılan önbellek leme yöntemlerinin iyileştirilmesi hataların giderilmesi ve sayfaların gzip ile sıkıştırılması için kullanabilirsiniz.

# BEGIN W3TC Minify cache
location ~ /wp-content/cache/minify/.*\.js$ {
    types {}
    default_type application/x-javascript;
    expires modified 31536000s;
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    add_header Vary "Accept-Encoding";
    add_header Pragma "public";
    add_header Cache-Control "public";
}
location ~ /wp-content/cache/minify/.*\.css$ {
    types {}
    default_type text/css;
    expires modified 31536000s;
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    add_header Vary "Accept-Encoding";
    add_header Pragma "public";
    add_header Cache-Control "public";
}
location ~ /wp-content/cache/minify/.*js_gzip$ {
    gzip off;
    types {}
    default_type application/x-javascript;
    expires modified 31536000s;
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    add_header Vary "Accept-Encoding";
    add_header Pragma "public";
    add_header Cache-Control "public";
    add_header Content-Encoding gzip;
}
location ~ /wp-content/cache/minify/.*css_gzip$ {
    gzip off;
    types {}
    default_type text/css;
    expires modified 31536000s;
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    add_header Vary "Accept-Encoding";
    add_header Pragma "public";
    add_header Cache-Control "public";
    add_header Content-Encoding gzip;
}
# END W3TC Minify cache
# BEGIN W3TC Minify core
set $w3tc_enc "";
if ($http_accept_encoding ~ gzip) {
    set $w3tc_enc _gzip;
}
if (-f $request_filename$w3tc_enc) {
    rewrite (.*) $1$w3tc_enc break;
}
rewrite ^/wp-content/cache/minify/ /index.php last;
# END W3TC Minify core
# BEGIN W3TC Page Cache core
set $w3tc_rewrite 1;
if ($request_method = POST) {
    set $w3tc_rewrite 0;
}
if ($query_string != "") {
    set $w3tc_rewrite 0;
}
if ($request_uri !~ \/$) {
    set $w3tc_rewrite 0;
}
if ($http_cookie ~* "(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle)") {
    set $w3tc_rewrite 0;
}
set $w3tc_preview "";
if ($http_cookie ~* "(w3tc_preview)") {
    set $w3tc_preview _preview;
}
set $w3tc_ssl "";
if ($scheme = https) {
    set $w3tc_ssl _ssl;
}
if ($http_x_forwarded_proto = 'https') {
    set $w3tc_ssl _ssl;
}
set $w3tc_enc "";
if ($http_accept_encoding ~ gzip) {
    set $w3tc_enc _gzip;
}
set $w3tc_ext "";
if (-f "$document_root/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_ssl$w3tc_preview.html$w3tc_enc") {
  set $w3tc_ext .html;
}
if (-f "$document_root/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_ssl$w3tc_preview.xml$w3tc_enc") {
    set $w3tc_ext .xml;
}
if ($w3tc_ext = "") {
  set $w3tc_rewrite 0;
}
if ($w3tc_rewrite = 1) {
    rewrite .* "/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_ssl$w3tc_preview$w3tc_ext$w3tc_enc" last;
}
# END W3TC Page Cache core
# BEGIN W3TC Page Cache cache
location ~ /wp-content/cache/page_enhanced.*html$ {
    expires modified 3600s;
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    add_header Vary "Accept-Encoding, Cookie";
    add_header Pragma "public";
    add_header Cache-Control "public";
}
location ~ /wp-content/cache/page_enhanced.*gzip$ {
    gzip off;
    types {
        text/xml xml_gzip;
    }
    default_type text/html;
    expires modified 3600s;
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    add_header Vary "Accept-Encoding, Cookie";
    add_header Pragma "public";
    add_header Cache-Control "public";
    add_header Content-Encoding gzip;
}
# END W3TC Page Cache cache
# BEGIN W3TC Browser Cache
location ~ \.(css|htc|less|js|js2|js3|js4)$ {
    expires 31536000s;
    etag on;
    if_modified_since exact;
    add_header Pragma "public";
    add_header Cache-Control "public";
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    try_files $uri $uri/ $uri.html /index.php?$args;
}
location ~ \.(html|htm|rtf|rtx|svg|txt|xsd|xsl|xml)$ {
    expires 3600s;
    etag on;
    if_modified_since exact;
    add_header Pragma "public";
    add_header Cache-Control "public";
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    try_files $uri $uri/ $uri.html /index.php?$args;
}
location ~ \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|webp|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|webm|mpp|otf|_otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|_ttf|wav|wma|wri|woff|woff2|xla|xls|xlsx|xlt|xlw|zip)$ {
    expires 31536000s;
    etag on;
    if_modified_since exact;
    add_header Pragma "public";
    add_header Cache-Control "public";
    add_header X-Powered-By "W3 Total Cache/0.9.7.3";
    add_header Link "<$scheme://$host$uri>; rel=\"canonical\"";
    if ($request_uri ~ ^[^?]*\.(ttf|ttc|otf|eot|woff|woff2|font.css)(\?|$)) {
        add_header Link "<$scheme://$host$uri>; rel=\"canonical\"";
        add_header Pragma "public";
        add_header Cache-Control "public";
        add_header X-Powered-By "W3 Total Cache/0.9.7.3";
        add_header Access-Control-Allow-Origin "*";
    }
    try_files $uri $uri/ $uri.html /index.php?$args;
}
# END W3TC Browser Cache

Ayarlar son sürüme göre düzenlenmiştir. istediğiniz şekilde düzenleme yapabilirsiniz.

NGINX ile Proxy IP Adreslerinin Erişimlerinin Engellenmesi

Proxy adresleri kullanılarak günümüzde bin bir çeşit siber ataklar yapılabiliyor, bunlardan en fazla gözlemlediğimiz botnet saldırıları, brute-force ve directory fuzzing tabii bunlardan arta kalan vakitlerinde saldırganlar google dorking denemeleri yapmayı da ihmal etmiyor. En iyi ihtimalle site crawl işlemi de yapıyorlar.

wget -qO- https://iplists.firehol.org/files/firehol_proxies.netset

Listemiz her gün belirli aralıklarla güncellenmektedir, bu sebeple listeyi mümkün olduğunca sık güncellemek sizin için faydalı olacaktır.

Aşağıdaki gibi bir cronjob ayarlamamız kullanacağımız bu liste özelinde daha doğru olur.

0 */12 * * * wget -qO- https://iplists.firehol.org/files/firehol_proxies.netset | grep -v # | grep -v -E \s[1-2]$ | cut -f 1 | sed s/^/deny /g; s/$/;/g > /etc/nginx/conf.d/proxylists-block.conf; systemctl reload nginx

Her 12 saatte bir kez olmak üzere listenin güncellenip NGINX\’e uyumlu formata gelmesi için komutumuzu ayarladık ve son olarak soft bir şekilde nginxi yeniden başlatmasını söyledik.

Bunun sonucunda web sunucumuz üzerinde aşağıdakiler engellenmiş olur.

  • SOCKS4/5 Proxy IP adresleri
  • Anonim Proxyler
  • SSL Proxyler
  • Tespit edilmiş VPN bağlantıları
  • Halka açık proxy adresleri

Fazlaca saldırı alan bir web sitesi veya sunucu önüne konumlandırılmış bir NGINX özelinde bu şekilde engelleme işlemi yapabilirsiniz. 1 milyon istek özelinde maximum %4 performans kaybı yaşatacağını unutmayınız bu sebeple geoip modülü ile birlikte kullanmanızı öneririm.

MediaWiki İçin NGINX Yapılandırması

Aşağıda yer alan Nginx kuralları /wiki/ olarak oluşturulan bir MediaWiki uygulaması üzerinde denenmiştir ve sorunsuz çalışmaktadır. Yapılandırmanızı kendinize göre değiştirmeyi ihmal etmeyiniz. Güvenlik yapılandırması yapılmamıştır.

server {
  listen                  443 ssl http2;
  listen                  [::]:443 ssl http2;
  server_name             example.com;
  set                     $base /var/www/example.com;
  root                    $base/public;

  # SSL
  ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  # security headers
  add_header X-XSS-Protection          1; mode=block always;
  add_header X-Content-Type-Options    nosniff always;
  add_header Referrer-Policy           no-referrer-when-downgrade always;
  add_header Content-Security-Policy   default-src 'self' http: https: data: blob: 'unsafe-inline'; frame-ancestors 'self'; always;
  add_header Permissions-Policy        interest-cohort=() always;
  add_header Strict-Transport-Security max-age=31536000; includeSubDomains always;

  # . files
  location ~ /\.(?!well-known) {
      deny all;
  }

    location ~ ^/w/(index|load|api|thumb|opensearch_desc|rest|img_auth)\.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    # Images
    location /w/images {
        # Separate location for images/ so .php execution won't apply
    }
    location /w/images/deleted {
        deny all;
    }
    location ~ ^/w/resources/(assets|lib|src) {
        try_files $uri 404;
        add_header Cache-Control public;
        expires 7d;
    }
    # Assets, scripts and styles from skins and extensions
    location ~ ^/w/(skins|extensions)/.+\.(css|js|gif|jpg|jpeg|png|svg|wasm)$ {
        try_files $uri 404;
        add_header Cache-Control public;
        expires 7d;
    }
    # Favicon
    location = /favicon.ico {
        alias /w/images/6/64/Favicon.ico;
        add_header Cache-Control public;
        expires 7d;
    }

    # License and credits files
    location ~ ^/w/(COPYING|CREDITS)$ {
        default_type text/plain;
    }

    # Handling for Mediawiki REST API, see [[mw:API:REST_API]]
    location /w/rest.php/ {
        try_files $uri $uri/ /w/rest.php?$query_string;
    }

    # Handling for the article path (pretty URLs)
    location /wiki/ {
        rewrite ^/wiki/(?.*)$ /w/index.php;
    }

    location = / {
        return 301 /wiki/Main_Page;
    }

  location ~ ^/(cache|includes|maintenance|languages|serialized|tests|images/deleted)/ {
    deny all;
  }
  location ~ ^/(bin|docs|extensions|includes|maintenance|mw-config|resources|serialized|tests)/ {
    internal;
  }

  # favicon.ico
  location = /favicon.ico {
      log_not_found off;
      access_log    off;
  }

  # robots.txt
  location = /robots.txt {
      log_not_found off;
      access_log    off;
  }

  # assets, media
  location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
      expires    7d;
      access_log off;
  }

  # svg, fonts
  location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
      add_header Access-Control-Allow-Origin *;
      expires    7d;
      access_log off;
  }

  # gzip
  gzip            on;
  gzip_vary       on;
  gzip_proxied    any;
  gzip_comp_level 6;
  gzip_types      text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
}

Temel yapılandırma yapılmıştır, SSL aktiftir ve temel rest api ile birlikte url yapılandırması yapılmıştır. Yapılandırmada kullanılan LocalSettings.php dosyası aşağıdaki gibidir.

$wgScriptPath = /w;
$wgArticlePath = /wiki/$1;
$wgUsePathInfo = true;

Nginx “413 Request Entity Too Large” Hatası Nasıl Çözülür?

Dosya yükleme sırasında ortaya çıkan ve oldukça can sıkan bir problemdir, web sunucusu üzerinde hangi uygulama koşuyor olsa fark etmez. Gönderilen istek boyutunun çok yüksek olduğu bilgisi karşımıza sıklıkla gelir. Bunun çözümü ise NGINX de çok basittir.

CloudFlare‘nin ücretsiz sürümü kullanılan bir web sitesinde client_max_body_size değeri 100 Megabyte geçemez. Bu sebeple örnek olarak aşağıdakini vereceğim. Siz kendi web sunucunuzda kullandığınız alt yapıya göre değişiklik yapınız.

client_max_body_size 100M;

NGINX yapılandırmaları içerisinde server veya http blockların da bu değişikliği uygulayabilirsiniz. Nginx yeniden başlattığınızda 413 error: Request Entity too large hatası ile uzun bir süre karşılaşmayacaksınız.

systemctl restart nginx

Yükleyeceğiniz dosyanın boyutu ne zaman client_max_body_size belirlediğiniz değeri geçerse o zaman bu hata tekrar karşınıza gelecek.

Reverse Proxy Arkasında CORS Ayarlama

Reverse Proxy üzerinden çalışan servisler kimi zaman tutarsız bir şekilde CORS hatası alınmasına sebep olabiliyor, api isteklerinde olmazsa olmaz OPTIONS isteği Preflighted geçersiz oluyor ve sayfalar yüklenmiyor. Tabii ki bu durum her istekte meydana gelmiyor.(bilenler bilir pek hoş olmayan bir hatadır bu.)

Normalde kullandığımız genel yapılandırmada olan bütün isteklere eklediğimiz ve oldukça memnun olduğumuz CORS yapılandırmamız.

location / {
     if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        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-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
     }
     if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
     }
}

Reverse Proxy arkasında çalışan ve zaman zaman CORS hatası aldığımız için yeniden düzenlediğimiz ve iyileştirdiğimiz CORS yapılandırmamız.

location / { 
    # Simple requests
    if ($request_method ~* "(GET|POST|DELETE|PATCH)") {
        add_header "Access-Control-Allow-Origin"  * always;
    }

    # Preflighted requests
    if ($request_method = OPTIONS ) {
        add_header "Access-Control-Allow-Origin"  * always;
        add_header "Access-Control-Allow-Methods" "GET, POST, DELETE, PATCH, OPTIONS, HEAD";
        add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass 127.0.0.1:8080;"
    proxy_read_timeout 300;
}

NGINX’de XenForo Yapılandırma

Özellikle forum sahibi bir kaç arkadaşımız geçtiğimiz günlerde bana ulaşarak abi NGINX’de XenForo nasıl yapılandırabiliriz diye sordu kendilerine anlattım. URL rotalarında sorun yaşayan herkesin derdine derman olacak şekilde gerekli olan yapılandırma dosyasını aşağıya bırakıyorum.

  • XenForo 1 ve 2 sürümü ile uyumludur.
  • SEO uyumlu rotalar için oluşturulmuştur.
  • libraries ve internal_data gibi belli başlı yerlere dışarıdan erişim kapatılmıştır.
server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name             forum.mertcangokgoz.com;
    set                     $base /var/www/forum.mertcangokgoz.com;
    root                    $base/public;

    # SSL
    ssl_certificate         /etc/letsencrypt/live/forum.mertcangokgoz.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/forum.mertcangokgoz.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/forum.mertcangokgoz.com/chain.pem;

    # security
    add_header X-Frame-Options           "SAMEORIGIN" always;
    add_header X-XSS-Protection          "1; mode=block" always;
    add_header X-Content-Type-Options    "nosniff" always;
    add_header Referrer-Policy           "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy   "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # . files
    location ~ /\.(?!well-known) {
        deny all;
    }

    # security.txt
    location /security.txt {
        return 301 /.well-known/security.txt;
    }

    location = /.well-known/security.txt {
        alias ~/security.txt;
    }

    # logging
    access_log              /var/log/nginx/forum.mertcangokgoz.com.access.log;
    error_log               /var/log/nginx/forum.mertcangokgoz.com.error.log warn;

    # index.php
    index                   index.php;

    location / {
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$uri&$args;
    }

    location ~ ^/(internal_data|library|src|install)/(.*)$ {
        internal;
    }

    location /install/data/ {
        internal;
    }

    location /install/templates/ {
        internal;
    }
 
    # handle .php
    location ~ \.php$ {
        # 404
        try_files                     $fastcgi_script_name =404;

        # default fastcgi_params
        include                       fastcgi_params;

        # fastcgi settings
        fastcgi_pass                  unix:/var/run/php/php-fpm.sock;
        fastcgi_index                 index.php;
        fastcgi_buffers               8 16k;
        fastcgi_buffer_size           32k;

        # fastcgi params
        fastcgi_param DOCUMENT_ROOT   $realpath_root;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param PHP_ADMIN_VALUE "open_basedir=$base/:/usr/lib/php/:/tmp/";
    }
}

# subdomains redirect
server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name             *.forum.mertcangokgoz.com;

    # SSL
    ssl_certificate         /etc/letsencrypt/live/forum.mertcangokgoz.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/forum.mertcangokgoz.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/forum.mertcangokgoz.com/chain.pem;
    return                  301 https://forum.mertcangokgoz.com$request_uri;
}

# HTTP redirect
server {
    listen      80;
    listen      [::]:80;
    server_name .forum.mertcangokgoz.com;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/_letsencrypt;
    }

    location / {
        return 301 https://forum.mertcangokgoz.com$request_uri;
    }
}

Yapılandırmayı kendinize göre değiştirmeyi ihmal etmeyiniz. Bu yapılandırmayı kullanabilmek için minimum NGINX 1.14.0 sürümü yüklü olmalıdır.

NGINX İçin ngx_pagespeed Kuralları

NGINX üzerinde kimi zaman googlenin kuluçka merkezinde geliştirilen ngx_pagespeed kullanmak isterseniz, uygulamayı derledikten ve kurulumu tamamladıktan sonra aşağıdaki kural setini uygulamanız siz hem en iyi performansı verecek hemde web sitenizde pagespeed kaynaklı sorunları yaşamayacaksınız.

/etc/nginx/conf.d/ içerisine aşağıdaki yapılandırmaları pagespeed.conf olarak eklemeniz yeterlidir.

pagespeed on;
pagespeed FileCachePath /var/ngx_pagespeed_cache;

location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
  add_header "" "";
}
location ~ "^/pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon$" { }

pagespeed EnableFilters collapse_whitespace;
pagespeed EnableFilters insert_dns_prefetch;
pagespeed EnableFilters prioritize_critical_css;
pagespeed EnableFilters lazyload_images;
pagespeed EnableFilters local_storage_cache;
pagespeed EnableFilters make_google_analytics_async;
pagespeed EnableFilters extend_cache;
pagespeed EnableFilters remove_comments;
pagespeed EnableFilters elide_attributes;
pagespeed EnableFilters remove_quotes;
pagespeed EnableFilters trim_urls;
pagespeed EnableFilters rewrite_images;
pagespeed EnableFilters inline_images;
pagespeed EnableFilters recompress_images;
pagespeed EnableFilters convert_gif_to_png;
pagespeed EnableFilters convert_jpeg_to_progressive;
pagespeed EnableFilters recompress_jpeg;
pagespeed EnableFilters recompress_png;
pagespeed EnableFilters recompress_webp;
pagespeed EnableFilters strip_image_color_profile;
pagespeed EnableFilters strip_image_meta_data;
pagespeed EnableFilters jpeg_subsampling;
pagespeed EnableFilters convert_png_to_jpeg;
pagespeed EnableFilters resize_images;
pagespeed EnableFilters resize_rendered_image_dimensions;
pagespeed EnableFilters convert_jpeg_to_webp;
pagespeed EnableFilters convert_to_webp_lossless;
pagespeed ImageRecompressionQuality 70;
pagespeed JpegRecompressionQuality 70;
pagespeed JpegRecompressionQualityForSmallScreens 70;

NGINX Güvenlik Yapılandırması Nasıl Yapılır?

NGINX üzerinde yapılandırmanızı yaptığınızda ek güvenlik önlemleri almanız oldukça faydalı özellikle Wordpress, Joomla vb sitelerde uygulayabilirsiniz. Uygulama sunucusu kuracak arkadaşlarımız içinde bu yapılandırma dosyamız oldukça idealdir.

.git, .DS_Store vb gibi başında nokta olup gizli kalması gereken dosyaları ve yürütülebilir dosyaların erişime engellenmesi, sürüm bilgisi veya sunucu üzerinde koşan uygulamanın bilgilerinin bulunduğu dosyaların erişimlerinin engellenmesi, uzantıya göre erişimin kapatılması, yedeklere erişimin kapatılması

NGINX Yapılandırma dosyamız aşağıdaki gibidir, bunu security.conf adı altında /etc/nginx/conf.d/ içerisine atıp istediğiniz bir vhostunuzda kullanabilirsiniz.

location /.git { deny all; }
location /.htaccess { deny all; }
location /.htpasswd { deny all; }
location /.user.ini { deny all; }
location ~ ^/\. { deny all; }
location ~ ~$ { deny all; }
location ~* /uploads/.*\.php$ { deny all; }
location ~* /files/.*\.php$ { deny all; }

location ~*  "/(^$|readme|license|example|README|LEGALNOTICE|INSTALLATION|CHANGELOG)\.(txt|html|md)" {
    deny all;
}

location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf|gz|zip|bz2|7z|pem|asc|conf|dump)$" {
    deny all;
}

location ~* "/(=|\$&|_mm|(wp-)?config\.|cgi-|etc/passwd|muieblack)" {
    deny all;
}

location ~* "(base64_encode)(.*)(\()" {
    deny all;
}

location ~* "(eval\()" {
    deny all;
}

location ~* "(127\.0\.0\.1)" {
    deny all;
}

location ~* "([a-z0-9]{2000})" {
    deny all;
}

location ~* "(javascript\:)(.*)(\;)" {
    deny all;
}

location ~* "(GLOBALS|REQUEST)(=|\[|%)" {
    deny all;
}

location ~* "(<|%3C).*script.*(>|%3)" {
    deny all;
}

location ~ "(\\|\.\.\.|\.\./|~|`|<|>|\|)" {
    deny all;
}

location ~* "(boot\.ini|etc/passwd|self/environ)" {
    deny all;
}

location ~* "(thumbs?(_editor|open)?|tim(thumb)?)\.php" {
    deny all;
}

location ~* "(\'|\")(.*)(drop|insert|md5|select|union)" {
    deny all;
}

location ~* "(https?|ftp|php):/" {
    deny all;
}

location ~* "(=\\\'|=\\%27|/\\\'/?)\." {
    deny all;
}

location ~ "(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\")" {
    deny all;
}

location ~ "(~|`|<|>|:|;|%|\\|\s|\{|\}|\[|\]|\|)" {
    deny all;
}

NGINX’de Access Log ve Error Log Nasıl Kapatılır?

Bugün sizlere NGINX üzerinde access logların ve error logların nasıl kapatılabileceğini göstereceğim, disk alanınızda yer kalmadıysa veya log tutmak istemiyorsanız bu işlemi gerçekleştirebilirsiniz. Bazı zamanlarda müşterilerimiz disk I/O çok kullandığı gerekçesiyle kapattırmak istiyor, bu gibi durumlar içinde kullanılabilir ancak önermiyorum.

Aşağıda yer alanları her bir vhost dosyanıza tek tek uygulayınız, ayrıca isterseniz http { } blockları içerisinde ekleyebilir genel günlükleme işlemlerini durdurabilirsiniz. Ancak önerim vhostlar içine tanımlamanız olacaktır.

access_log           off;
error_log            off;

Ardından ayarların geçerli olması için lütfen NGINX’ı yeniden başlatınız.