{"id":31431,"date":"2025-10-09T22:41:23","date_gmt":"2025-10-09T19:41:23","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31431"},"modified":"2025-10-09T22:41:23","modified_gmt":"2025-10-09T19:41:23","slug":"saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/","title":{"rendered":"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#8217;leri Olu\u015fturma"},"content":{"rendered":"<p><body><\/p>\n<h2>SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#8217;leri Olu\u015fturma<\/h2>\n<p>SaltStack, modern altyap\u0131 y\u00f6netiminde otomasyon, konfig\u00fcrasyon y\u00f6netimi, uzaktan y\u00fcr\u00fctme ve orkestrasyon yetenekleriyle \u00f6ne \u00e7\u0131kan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k sistemlerde, sunucular\u0131n tutarl\u0131 bir \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131 ve y\u00f6netilmesi hayati \u00f6nem ta\u015f\u0131r. Nginx gibi pop\u00fcler bir web sunucusunun da\u011f\u0131t\u0131m\u0131, konfig\u00fcrasyonu ve bak\u0131m\u0131, SaltStack kullan\u0131larak tamamen otomatikle\u015ftirilebilir ve \u00f6l\u00e7eklenebilir hale getirilebilir. Bu makale, SaltStack&#8217;in temel prensiplerinden ba\u015flayarak, Nginx web sunucular\u0131n\u0131 y\u00f6netmek i\u00e7in nas\u0131l Salt State&#8217;leri olu\u015fturulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m detayland\u0131racakt\u0131r.<\/p>\n<h3>Giri\u015f: SaltStack ve Otomasyonun \u00d6nemi<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dinamik IT ortamlar\u0131nda, manuel i\u015flemler hem zaman al\u0131c\u0131 hem de hataya a\u00e7\u0131k riskler ta\u015f\u0131r. Bir veya iki sunucuyu elle yap\u0131land\u0131rmak m\u00fcmk\u00fcn olsa da, y\u00fczlerce hatta binlerce sunucuyu y\u00f6netmek s\u00f6z konusu oldu\u011funda otomasyon vazge\u00e7ilmezdir. SaltStack, bu ihtiyac\u0131 kar\u015f\u0131lamak \u00fczere tasarlanm\u0131\u015f, Python tabanl\u0131 a\u00e7\u0131k kaynakl\u0131 bir konfig\u00fcrasyon y\u00f6netimi ve orkestrasyon arac\u0131d\u0131r. Deklaratif bir dil kullanarak sistemlerin istenen durumunu tan\u0131mlaman\u0131za olanak tan\u0131r, b\u00f6ylece &#8220;nas\u0131l&#8221; de\u011fil, &#8220;ne&#8221; olmas\u0131 gerekti\u011fini belirtirsiniz.<\/p>\n<p>Nginx, y\u00fcksek performansl\u0131, hafif ve esnek bir web sunucusu, ters proxy ve y\u00fck dengeleyici olarak yayg\u0131n \u015fekilde kullan\u0131lmaktad\u0131r. Nginx&#8217;in her bir sunucuya kurulumu, ana konfig\u00fcrasyonunun yap\u0131lmas\u0131, sanal host&#8217;lar\u0131n tan\u0131mlanmas\u0131, SSL sertifikalar\u0131n\u0131n entegrasyonu gibi ad\u0131mlar, SaltStack State&#8217;leri (durum dosyalar\u0131) arac\u0131l\u0131\u011f\u0131yla otomatikle\u015ftirilebilir. Bu, sadece zamandan tasarruf sa\u011flamakla kalmaz, ayn\u0131 zamanda t\u00fcm Nginx sunucular\u0131n\u0131z\u0131n tutarl\u0131, g\u00fcvenli ve g\u00fcncel olmas\u0131n\u0131 garanti eder. Bu makalenin amac\u0131, SaltStack kullanarak Nginx altyap\u0131n\u0131z\u0131 nas\u0131l otomatikle\u015ftirece\u011finize dair kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h3>SaltStack Temelleri: Mimariden State&#8217;lere<\/h3>\n<p>SaltStack&#8217;i Nginx y\u00f6netimi i\u00e7in etkin bir \u015fekilde kullanabilmek i\u00e7in, \u00f6ncelikle temel bile\u015fenlerini ve \u00e7al\u0131\u015fma prensiplerini anlamak gereklidir.<\/p>\n<h4>Master ve Minion Mimarisi<\/h4>\n<p>SaltStack, genellikle bir &#8220;Master&#8221; ve birden fazla &#8220;Minion&#8221;dan olu\u015fan bir istemci-sunucu mimarisi \u00fczerinde \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong>Salt Master:<\/strong> Merkezi kontrol sunucusudur. T\u00fcm konfig\u00fcrasyon dosyalar\u0131n\u0131 (Salt States, Pillar verileri), mod\u00fclleri ve SaltStack&#8217;in ana mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131r\u0131r. Minion&#8217;lara komutlar\u0131 g\u00f6nderir ve onlar\u0131n raporlar\u0131n\u0131 al\u0131r.<br \/>\n*   <strong>Salt Minion:<\/strong> Y\u00f6netilen sunuculard\u0131r. Master&#8217;dan gelen komutlar\u0131 dinler, State&#8217;leri uygular ve sonu\u00e7lar\u0131 Master&#8217;a geri g\u00f6nderir. Her Minion, Master&#8217;a bir anahtar (key) ile kimli\u011fini do\u011frular.<\/p>\n<p>Master ve Minion&#8217;lar aras\u0131ndaki ileti\u015fim, ZeroMQ mesajla\u015fma k\u00fct\u00fcphanesi \u00fczerinden g\u00fcvenli ve h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015fir.<\/p>\n<h4>Salt States (SLS Dosyalar\u0131)<\/h4>\n<p>Salt States, SaltStack&#8217;in kalbidir. Y\u00f6netilen sistemlerin istenen durumunu (Desired State) tan\u0131mlayan deklaratif dosyalard\u0131r. Genellikle YAML format\u0131nda yaz\u0131l\u0131rlar ve &#8220;id&#8221; (benzersiz tan\u0131mlay\u0131c\u0131), &#8220;state module&#8221; (\u00f6rne\u011fin <code>pkg<\/code>, <code>file<\/code>, <code>service<\/code>), &#8220;function&#8221; (\u00f6rne\u011fin <code>installed<\/code>, <code>managed<\/code>, <code>running<\/code>) ve arg\u00fcmanlardan olu\u015furlar.<\/p>\n<p>\u00d6rnek bir Nginx kurulum State&#8217;i:<\/p>\n<pre><code class=\"language-yaml\">nginx_package:\n  pkg.installed:\n    - name: nginx\n\nnginx_service:\n  service.running:\n    - name: nginx\n    - enable: True\n    - require:\n        - pkg: nginx_package<\/code><\/pre>\n<p>Bu \u00f6rnekte:<br \/>\n*   <code>nginx_package<\/code> ve <code>nginx_service<\/code> benzersiz ID&#8217;lerdir.<br \/>\n*   <code>pkg.installed<\/code> ve <code>service.running<\/code> State mod\u00fcllerinin fonksiyonlar\u0131d\u0131r.<br \/>\n*   <code>name: nginx<\/code> gibi ifadeler fonksiyonlara ge\u00e7irilen arg\u00fcmanlard\u0131r.<br \/>\n*   <code>require<\/code> ifadesi, ba\u011f\u0131ml\u0131l\u0131klar\u0131 tan\u0131mlar; <code>nginx_service<\/code>&#8216;in \u00e7al\u0131\u015fabilmesi i\u00e7in <code>nginx_package<\/code>&#8216;\u0131n kurulu olmas\u0131 gerekti\u011fini belirtir.<\/p>\n<h4>Pillar<\/h4>\n<p>Pillar, hassas verileri (\u015fifreler, API anahtarlar\u0131, SSL sertifika yollar\u0131) veya Minion&#8217;a \u00f6zel konfig\u00fcrasyon verilerini g\u00fcvenli bir \u015fekilde depolamak ve Minion&#8217;lara da\u011f\u0131tmak i\u00e7in kullan\u0131l\u0131r. Pillar verileri, Master \u00fczerinde \u015fifrelenir ve sadece ilgili Minion taraf\u0131ndan eri\u015filebilir. Jinja \u015fablonlama motoru ile State dosyalar\u0131nda kullan\u0131labilirler.<\/p>\n<h4>Grains<\/h4>\n<p>Grains, Minion&#8217;lar hakk\u0131ndaki statik bilgileri (i\u015fletim sistemi, IP adresi, CPU say\u0131s\u0131, bellek) i\u00e7eren verilerdir. Salt Master, her Minion&#8217;dan bu bilgileri toplar ve hedefleme (targeting) i\u00e7in kullanabilir. \u00d6rne\u011fin, sadece Ubuntu i\u015fletim sistemine sahip Minion&#8217;lara belirli bir State&#8217;i uygulamak i\u00e7in Grains kullan\u0131labilir.<\/p>\n<h4>Top File (top.sls)<\/h4>\n<p><code>top.sls<\/code> dosyas\u0131, hangi State&#8217;lerin hangi Minion&#8217;lara uygulanaca\u011f\u0131n\u0131 tan\u0131mlar. Genellikle <code>salt\/top.sls<\/code> yolunda bulunur ve ortam baz\u0131nda (\u00f6rne\u011fin <code>base<\/code>, <code>dev<\/code>, <code>prod<\/code>) veya Minion gruplar\u0131na g\u00f6re State atamas\u0131 yapar.<\/p>\n<p>\u00d6rnek <code>top.sls<\/code>:<\/p>\n<pre><code class=\"language-yaml\">base:\n  '*':\n    - common\n  'os:Ubuntu':\n    - match: grain\n    - nginx\n  'minion1.example.com':\n    - webserver_specific_config<\/code><\/pre>\n<p>Bu \u00f6rnekte:<br \/>\n*   <code>base<\/code> ortam\u0131ndaki t\u00fcm Minion&#8217;lara <code>common<\/code> State&#8217;i uygulan\u0131r.<br \/>\n*   Ubuntu i\u015fletim sistemine sahip Minion&#8217;lara <code>nginx<\/code> State&#8217;i uygulan\u0131r.<br \/>\n*   <code>minion1.example.com<\/code> adl\u0131 Minion&#8217;a <code>webserver_specific_config<\/code> State&#8217;i uygulan\u0131r.<\/p>\n<h4>Salt Dosya Sistemi (File Root)<\/h4>\n<p>Salt Master \u00fczerinde, State dosyalar\u0131, Pillar dosyalar\u0131, Jinja \u015fablonlar\u0131 ve di\u011fer statik dosyalar\u0131n bulundu\u011fu dizinlere &#8220;file root&#8221; denir. Genellikle <code>\/srv\/salt<\/code> ve <code>\/srv\/pillar<\/code> dizinleri kullan\u0131l\u0131r. Bu dizinler, <code>master<\/code> konfig\u00fcrasyon dosyas\u0131nda belirtilir.<\/p>\n<h3>Nginx Web Sunucusu Y\u00f6netimi i\u00e7in SaltStack&#8217;i Neden Kullanmal\u0131y\u0131z?<\/h3>\n<p>Nginx y\u00f6netimi i\u00e7in SaltStack kullanman\u0131n bir\u00e7ok avantaj\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Tutarl\u0131l\u0131k (Consistency):<\/strong> T\u00fcm Nginx sunucular\u0131n\u0131z\u0131n ayn\u0131 konfig\u00fcrasyonlara, g\u00fcvenlik ayarlar\u0131na ve versiyonlara sahip olmas\u0131n\u0131 sa\u011flar. Manuel hatalar\u0131 ortadan kald\u0131r\u0131r.<br \/>\n*   <strong>Otomasyon (Automation):<\/strong> Yeni bir Nginx sunucusunu dakikalar i\u00e7inde kurup yap\u0131land\u0131rabilir, mevcut sunucularda konfig\u00fcrasyon de\u011fi\u015fikliklerini tek bir komutla uygulayabilirsiniz.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik (Scalability):<\/strong> Onlarca veya y\u00fczlerce Nginx sunucusunu ayn\u0131 anda y\u00f6netmek, SaltStack ile kolayla\u015f\u0131r. Yeni sunucular\u0131 altyap\u0131ya eklemek basit bir i\u015flemdir.<br \/>\n*   <strong>Hata Azaltma (Error Reduction):<\/strong> Otomatikle\u015ftirilmi\u015f i\u015flemler, insan kaynakl\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7er.<br \/>\n*   <strong>Versiyon Kontrol\u00fc ile Entegrasyon:<\/strong> Salt State dosyalar\u0131, Git gibi versiyon kontrol sistemlerinde saklanabilir. Bu, konfig\u00fcrasyon de\u011fi\u015fikliklerinin izlenebilirli\u011fini art\u0131r\u0131r, geri alma i\u015flemlerini kolayla\u015ft\u0131r\u0131r ve i\u015fbirli\u011fini te\u015fvik eder.<br \/>\n*   <strong>H\u0131zl\u0131 Da\u011f\u0131t\u0131m:<\/strong> Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda h\u0131zl\u0131 ve g\u00fcvenilir da\u011f\u0131t\u0131mlar yap\u0131lmas\u0131na olanak tan\u0131r.<br \/>\n*   <strong>Esneklik:<\/strong> Jinja \u015fablonlama motoru ve Pillar kullan\u0131m\u0131 sayesinde, sunucuya veya ortama \u00f6zel konfig\u00fcrasyonlar kolayca y\u00f6netilebilir.<\/p>\n<h3>Nginx State&#8217;leri Olu\u015fturmaya Ba\u015flama<\/h3>\n<p>Nginx State&#8217;leri olu\u015ftururken, mod\u00fcler ve d\u00fczenli bir dosya yap\u0131s\u0131 kullanmak \u00f6nemlidir. Bu, State&#8217;lerinizi daha y\u00f6netilebilir ve okunabilir hale getirir.<\/p>\n<h4>Dosya Yap\u0131s\u0131<\/h4>\n<p>Tipik bir Salt <code>file_roots<\/code> (\u00f6rne\u011fin <code>\/srv\/salt<\/code>) alt\u0131nda a\u015fa\u011f\u0131daki gibi bir yap\u0131 olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-\">\/srv\/salt\/\n\u251c\u2500\u2500 top.sls\n\u251c\u2500\u2500 common\/\n\u2502   \u2514\u2500\u2500 init.sls\n\u2514\u2500\u2500 nginx\/\n    \u251c\u2500\u2500 init.sls             # Nginx paketi kurulumu ve servisin y\u00f6netimi\n    \u251c\u2500\u2500 config.sls           # Ana nginx.conf dosyas\u0131n\u0131n y\u00f6netimi\n    \u251c\u2500\u2500 sites.sls            # Sanal host konfig\u00fcrasyonlar\u0131n\u0131n y\u00f6netimi\n    \u2514\u2500\u2500 sites\/\n        \u251c\u2500\u2500 site_template.conf.jinja # Dinamik sanal hostlar i\u00e7in \u015fablon\n        \u2514\u2500\u2500 default.conf.jinja       # Varsay\u0131lan sanal host<\/code><\/pre>\n<p>Ve Pillar i\u00e7in:<\/p>\n<pre><code class=\"language-\">\/srv\/pillar\/\n\u251c\u2500\u2500 top.sls\n\u2514\u2500\u2500 nginx.sls                # Nginx'e \u00f6zel Pillar verileri<\/code><\/pre>\n<h4><code>nginx\/init.sls<\/code> &#8211; Nginx Kurulumu ve Servis Y\u00f6netimi<\/h4>\n<p>Bu dosya, Nginx paketini kurmaktan ve servisin \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 sa\u011flamaktan sorumlu olacakt\u0131r.<\/p>\n<pre><code class=\"language-yaml\"># \/srv\/salt\/nginx\/init.sls\n\n<h2>Nginx paketinin sistemde y\u00fckl\u00fc olmas\u0131n\u0131 sa\u011flar.<\/h2>\n<h2>\u0130\u015fletim sistemine g\u00f6re 'nginx' veya 'nginx-full' gibi farkl\u0131 paket isimleri olabilir.<\/h2>\n<h2>SaltStack, Minion'\u0131n i\u015fletim sistemine g\u00f6re do\u011fru paket y\u00f6neticisini otomatik olarak kullan\u0131r (apt, yum, pacman vb.).<\/h2>\nnginx_package:\n  pkg.installed:\n    - name: nginx\n    # E\u011fer farkl\u0131 bir i\u015fletim sisteminde farkl\u0131 bir paket ad\u0131 gerekiyorsa,\n    # 'pkgs' kullanarak bir liste verebilir veya 'name' ile varsay\u0131lan\u0131 belirleyebilirsiniz.\n    # - pkgs:\n    #     - nginx  # Debian\/Ubuntu\n    #     - nginx  # CentOS\/RHEL\n\n<h2>Nginx servisinin \u00e7al\u0131\u015f\u0131r durumda ve sistem ba\u015flang\u0131c\u0131nda etkin olmas\u0131n\u0131 sa\u011flar.<\/h2>\nnginx_service:\n  service.running:\n    - name: nginx\n    - enable: True # Servisin sistem ba\u015flang\u0131c\u0131nda otomatik olarak ba\u015flamas\u0131n\u0131 sa\u011flar\n    # 'watch' ifadesi, belirli bir dosya veya pakette de\u011fi\u015fiklik oldu\u011funda servisi yeniden ba\u015flat\u0131r.\n    # Bu sayede, Nginx konfig\u00fcrasyonu de\u011fi\u015fti\u011finde servis otomatik olarak g\u00fcncellenir.\n    - watch:\n        - pkg: nginx_package # Nginx paketi yeniden y\u00fcklendi\u011finde\/g\u00fcncellendi\u011finde\n        - file: \/etc\/nginx\/nginx.conf # Ana konfig\u00fcrasyon dosyas\u0131 de\u011fi\u015fti\u011finde\n        - file: \/etc\/nginx\/sites-enabled\/* # Sanal host konfig\u00fcrasyonlar\u0131 de\u011fi\u015fti\u011finde\n    - require:\n        - pkg: nginx_package # Nginx servisi ba\u015flamadan \u00f6nce paketin kurulu olmas\u0131n\u0131 zorunlu k\u0131lar<\/code><\/pre>\n<p><code>watch<\/code> ifadesi, SaltStack&#8217;in reaktivite yetene\u011finin \u00f6nemli bir par\u00e7as\u0131d\u0131r. Belirtilen ba\u011f\u0131ml\u0131l\u0131klardan herhangi biri de\u011fi\u015fti\u011finde, <code>nginx_service<\/code> State&#8217;i yeniden \u00e7al\u0131\u015f\u0131r ve Nginx servisini yeniden ba\u015flat\u0131r veya yeniden y\u00fckler (<code>service.reload<\/code>).<\/p>\n<h4><code>nginx\/config.sls<\/code> &#8211; Ana Nginx Konfig\u00fcrasyonu<\/h4>\n<p>Bu dosya, <code>\/etc\/nginx\/nginx.conf<\/code> gibi ana Nginx konfig\u00fcrasyon dosyas\u0131n\u0131 y\u00f6netecek. Jinja \u015fablonlama kullanarak Pillar&#8217;dan veya Grains&#8217;ten dinamik de\u011ferler \u00e7ekebiliriz.<\/p>\n<pre><code class=\"language-yaml\"># \/srv\/salt\/nginx\/config.sls\n\n<h2>Ana Nginx konfig\u00fcrasyon dosyas\u0131n\u0131n y\u00f6netimi<\/h2>\n\/etc\/nginx\/nginx.conf:\n  file.managed:\n    - source: salt:\/\/nginx\/nginx.conf.jinja # Master \u00fczerindeki \u015fablon dosyas\u0131n\u0131n yolu\n    - template: jinja # Jinja \u015fablon motorunu kullan\n    # Bu dosyan\u0131n olu\u015fturulmas\u0131\/g\u00fcncellenmesi i\u00e7in Nginx paketinin kurulu olmas\u0131 gerekir.\n    - require:\n        - pkg: nginx_package # nginx\/init.sls dosyas\u0131ndaki ID\n    # Bu dosya de\u011fi\u015fti\u011finde, nginx_service'i yeniden ba\u015flatmak i\u00e7in bir sinyal g\u00f6nderir.\n    # 'watch_in' ifadesi, bu State'in bir ba\u015fka State'i tetiklemesini sa\u011flar.\n    # Bu durumda, nginx\/init.sls dosyas\u0131ndaki 'nginx_service' State'ini tetikler.\n    - watch_in:\n        - service: nginx_service<\/code><\/pre>\n<p>\u015eimdi de <code>nginx.conf.jinja<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fine bakal\u0131m (<code>\/srv\/salt\/nginx\/nginx.conf.jinja<\/code>):<\/p>\n<pre><code class=\"language-jinja\"># \/srv\/salt\/nginx\/nginx.conf.jinja\n\nuser www-data;\nworker_processes auto;\npid \/run\/nginx.pid;\ninclude \/etc\/nginx\/modules-enabled\/*.conf;\n\nevents {\n    worker_connections 768;\n    # multi_accept on;\n}\n\nhttp {\n    sendfile on;\n    tcp_nopush on;\n    types_hash_max_size 2048;\n\n    include \/etc\/nginx\/mime.types;\n    default_type application\/octet-stream;\n\n    # Pillar'dan log yollar\u0131n\u0131 \u00e7ekebiliriz\n    access_log {{ pillar.get('nginx:log_dir', '\/var\/log\/nginx') }}\/access.log;\n    error_log {{ pillar.get('nginx:log_dir', '\/var\/log\/nginx') }}\/error.log;\n\n    gzip on;\n    gzip_vary on;\n    gzip_proxied any;\n    gzip_comp_level 6;\n    gzip_buffers 16 8k;\n    gzip_http_version 1.1;\n    gzip_types text\/plain text\/css application\/json application\/javascript text\/xml application\/xml application\/xml+rss text\/javascript;\n\n    include \/etc\/nginx\/conf.d\/*.conf;\n    include \/etc\/nginx\/sites-enabled\/*; # Sanal host konfig\u00fcrasyonlar\u0131n\u0131 dahil et\n}<\/code><\/pre>\n<p>Bu Jinja \u015fablonunda, <code>{{ pillar.get('nginx:log_dir', '\/var\/log\/nginx') }}<\/code> ifadesi ile Pillar&#8217;dan <code>nginx:log_dir<\/code> de\u011ferini \u00e7ekiyoruz. E\u011fer bu de\u011fer Pillar&#8217;da tan\u0131ml\u0131 de\u011filse, varsay\u0131lan olarak <code>\/var\/log\/nginx<\/code> kullan\u0131l\u0131r. Bu, konfig\u00fcrasyonunuzu dinamik ve esnek hale getirir.<\/p>\n<h4><code>nginx\/sites.sls<\/code> &#8211; Sanal Host Konfig\u00fcrasyonlar\u0131<\/h4>\n<p>Bu State, Nginx sanal host konfig\u00fcrasyon dosyalar\u0131n\u0131 <code>\/etc\/nginx\/sites-available\/<\/code> dizinine yerle\u015ftirecek ve ard\u0131ndan <code>\/etc\/nginx\/sites-enabled\/<\/code> dizinine sembolik linkler olu\u015fturacakt\u0131r. Dinamik sanal hostlar i\u00e7in Pillar verilerini ve bir Jinja \u015fablonunu kullanaca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle, sanal hostlar i\u00e7in genel bir \u015fablon olu\u015ftural\u0131m: <code>\/srv\/salt\/nginx\/sites\/site_template.conf.jinja<\/code><\/p>\n<pre><code class=\"language-jinja\"># \/srv\/salt\/nginx\/sites\/site_template.conf.jinja\n\nserver {\n    listen {{ port }};\n    listen [::]:{{ port }};\n\n    server_name {{ domain }} {% if www_redirect %}www.{{ domain }}{% endif %};\n\n    root {{ root_path }}\/public_html;\n    index index.html index.htm index.php; # \u0130htiyaca g\u00f6re d\u00fczenlenebilir\n\n    location \/ {\n        try_files $uri $uri\/ =404;\n    }\n\n    {% if ssl_enabled %}\n    listen {{ pillar.nginx.ssl.port | default(443) }} ssl;\n    listen [::]:{{ pillar.nginx.ssl.port | default(443) }} ssl;\n\n    ssl_certificate {{ ssl_cert }};\n    ssl_certificate_key {{ ssl_key }};\n    # SSL HSTS (HTTP Strict Transport Security)\n    add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\";\n    # SSL G\u00fcvenlik ayarlar\u0131\n    ssl_session_cache shared:SSL:10m;\n    ssl_session_timeout 10m;\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_ciphers \"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384\";\n    ssl_prefer_server_ciphers on;\n    {% endif %}\n\n    # PHP-FPM entegrasyonu (iste\u011fe ba\u011fl\u0131)\n    {% if php_enabled %}\n    location ~ \\.php$ {\n        include snippets\/fastcgi-php.conf;\n        fastcgi_pass unix:\/run\/php\/php{{ php_version }}-fpm.sock;\n    }\n    {% endif %}\n\n    # Hata sayfalar\u0131 (iste\u011fe ba\u011fl\u0131)\n    error_page 404 \/404.html;\n    location = \/404.html {\n        internal;\n    }\n    error_page 500 502 503 504 \/50x.html;\n    location = \/50x.html {\n        internal;\n    }\n}<\/code><\/pre>\n<p>Bu \u015fablon, <code>context<\/code> arac\u0131l\u0131\u011f\u0131yla ge\u00e7irilen de\u011fi\u015fkenleri (<code>domain<\/code>, <code>root_path<\/code>, <code>port<\/code>, <code>ssl_enabled<\/code>, vb.) kullanarak dinamik konfig\u00fcrasyonlar olu\u015fturur.<\/p>\n<p>\u015eimdi <code>nginx\/sites.sls<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-yaml\"># \/srv\/salt\/nginx\/sites.sls\n\n<h2>Ana Nginx konfig\u00fcrasyonunun \u00f6nceden uygulanmas\u0131n\u0131 sa\u011flar.<\/h2>\ninclude:\n  - nginx.config\n\n<h2>Pillar'daki 'nginx:sites' verilerini kullanarak her bir site i\u00e7in konfig\u00fcrasyon olu\u015fturur.<\/h2>\n{% for site_name, site_config in pillar.get('nginx:sites', {}).items() %}\n  {% set domain = site_config.domain %}\n  {% set root_path = site_config.root_path %}\n  {% set port = site_config.get('port', 80) %}\n  {% set ssl_enabled = site_config.get('ssl_enabled', False) %}\n  {% set ssl_cert = site_config.get('ssl_cert', '') %}\n  {% set ssl_key = site_config.get('ssl_key', '') %}\n  {% set php_enabled = site_config.get('php_enabled', False) %}\n  {% set php_version = site_config.get('php_version', '7.4') %}\n  {% set www_redirect = site_config.get('www_redirect', True) %}\n\n  # Sanal host konfig\u00fcrasyon dosyas\u0131n\u0131 sites-available dizinine kopyalar\n  \/etc\/nginx\/sites-available\/{{ domain }}.conf:\n    file.managed:\n      - source: salt:\/\/nginx\/sites\/site_template.conf.jinja\n      - template: jinja\n      - context:\n          domain: {{ domain }}\n          root_path: {{ root_path }}\n          port: {{ port }}\n          ssl_enabled: {{ ssl_enabled }}\n          ssl_cert: {{ ssl_cert }}\n          ssl_key: {{ ssl_key }}\n          php_enabled: {{ php_enabled }}\n          php_version: {{ php_version }}\n          www_redirect: {{ www_redirect }}\n      - require:\n          - file: \/etc\/nginx\/nginx.conf # Ana konfig\u00fcrasyonun varl\u0131\u011f\u0131n\u0131 garanti eder\n      - watch_in:\n          - service: nginx_service # Konfig\u00fcrasyon de\u011fi\u015fti\u011finde servisi yeniden ba\u015flat\u0131r\n\n  # Sanal host konfig\u00fcrasyonuna sites-enabled dizininde sembolik link olu\u015fturur\n  \/etc\/nginx\/sites-enabled\/{{ domain }}.conf:\n    file.symlink:\n      - target: \/etc\/nginx\/sites-available\/{{ domain }}.conf\n      - require:\n          - file: \/etc\/nginx\/sites-available\/{{ domain }}.conf # Hedef dosyan\u0131n varl\u0131\u011f\u0131n\u0131 garanti eder\n      - watch_in:\n          - service: nginx_service # Sembolik link de\u011fi\u015fti\u011finde servisi yeniden ba\u015flat\u0131r\n\n  # Web sitesi k\u00f6k dizinini olu\u015ftur\n  \/var\/www\/{{ domain }}\/public_html:\n    file.directory:\n      - user: www-data\n      - group: www-data\n      - mode: 755\n      - recurse: True\n      - makedirs: True\n{% endfor %}<\/code><\/pre>\n<p>Bu State, Pillar&#8217;daki <code>nginx:sites<\/code> anahtar\u0131 alt\u0131ndaki her site i\u00e7in bir d\u00f6ng\u00fc ba\u015flat\u0131r. Her d\u00f6ng\u00fcde, <code>site_template.conf.jinja<\/code> \u015fablonunu kullanarak bir konfig\u00fcrasyon dosyas\u0131 olu\u015fturur, bunu <code>\/etc\/nginx\/sites-available\/<\/code> alt\u0131na yerle\u015ftirir ve ard\u0131ndan <code>\/etc\/nginx\/sites-enabled\/<\/code> alt\u0131na bir sembolik link olu\u015fturur. Ayr\u0131ca, her site i\u00e7in web k\u00f6k dizinini de otomatik olarak olu\u015fturur.<\/p>\n<h4>Pillar Kullan\u0131m\u0131: <code>nginx.sls<\/code><\/h4>\n<p>Pillar dosyas\u0131, Nginx konfig\u00fcrasyonunda kullan\u0131lacak dinamik verileri i\u00e7erir. <code>\/srv\/pillar\/nginx.sls<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-yaml\"># \/srv\/pillar\/nginx.sls\n\nnginx:\n  log_dir: \/var\/log\/nginx\n  ssl:\n    port: 443\n  sites:\n    example_com:\n      domain: example.com\n      root_path: \/var\/www\/example.com\n      port: 80\n      ssl_enabled: True\n      ssl_cert: \/etc\/ssl\/certs\/example.com.crt\n      ssl_key: \/etc\/ssl\/private\/example.com.key\n      php_enabled: True\n      php_version: \"7.4\"\n      www_redirect: True # example.com'u www.example.com'a y\u00f6nlendir\n    anothersite_net:\n      domain: anothersite.net\n      root_path: \/var\/www\/anothersite.net\n      port: 8080 # Bu site i\u00e7in \u00f6zel bir port\n      ssl_enabled: False\n      php_enabled: False\n      www_redirect: False # www y\u00f6nlendirmesi yapma\n    static_site:\n      domain: static.example.org\n      root_path: \/var\/www\/static.example.org\n      port: 80\n      ssl_enabled: False\n      php_enabled: False\n      www_redirect: True<\/code><\/pre>\n<p>Bu Pillar dosyas\u0131, Nginx&#8217;in genel log dizini, SSL portu ve her bir sanal host i\u00e7in \u00f6zel konfig\u00fcrasyonlar\u0131 tan\u0131mlar. Bu veriler, Salt State&#8217;leri taraf\u0131ndan okunarak Nginx konfig\u00fcrasyon dosyalar\u0131 dinamik olarak olu\u015fturulur.<\/p>\n<p>Pillar verilerini Minion&#8217;lara atamak i\u00e7in <code>\/srv\/pillar\/top.sls<\/code> dosyas\u0131n\u0131 kullanmal\u0131y\u0131z:<\/p>\n<pre><code class=\"language-yaml\"># \/srv\/pillar\/top.sls\n\nbase:\n  '*':\n    - nginx # T\u00fcm Minion'lara nginx Pillar verilerini atar<\/code><\/pre>\n<h3>Top File ile State&#8217;leri Uygulama<\/h3>\n<p>T\u00fcm bu State&#8217;leri Minion&#8217;lara atamak i\u00e7in ana <code>top.sls<\/code> dosyas\u0131n\u0131 (<code>\/srv\/salt\/top.sls<\/code>) d\u00fczenlememiz gerekir:<\/p>\n<pre><code class=\"language-yaml\"># \/srv\/salt\/top.sls\n\nbase:\n  '*': # T\u00fcm Minion'lara uygulanacak State'ler\n    - nginx # nginx\/init.sls, nginx\/config.sls ve nginx\/sites.sls'i otomatik olarak i\u00e7erir<\/code><\/pre>\n<p>SaltStack, bir dizin ad\u0131 verildi\u011finde (\u00f6rne\u011fin <code>nginx<\/code>), o dizin i\u00e7indeki <code>init.sls<\/code> dosyas\u0131n\u0131 ve di\u011fer t\u00fcm <code>.sls<\/code> dosyalar\u0131n\u0131 (varsa) otomatik olarak y\u00fckler. Bu durumda, <code>nginx<\/code> State&#8217;i, <code>nginx\/init.sls<\/code>, <code>nginx\/config.sls<\/code> ve <code>nginx\/sites.sls<\/code> dosyalar\u0131n\u0131 i\u00e7erecektir.<\/p>\n<h3>Salt State&#8217;leri Uygulama ve Test Etme<\/h3>\n<p>Salt Master&#8217;dan State&#8217;leri Minion&#8217;lara uygulamak i\u00e7in \u00e7e\u015fitli komutlar kullanabilirsiniz:<\/p>\n<p>*   <strong>T\u00fcm Minion&#8217;larda t\u00fcm State&#8217;leri uygulamak (Highstate):<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo salt '*' state.apply\n    # veya k\u0131saca\n    sudo salt '*' state.highstate<\/code><\/pre>\n<p>*   <strong>Belirli bir Minion&#8217;da t\u00fcm State&#8217;leri uygulamak:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo salt 'minion_id' state.apply<\/code><\/pre>\n<p>*   <strong>Belirli bir State&#8217;i t\u00fcm Minion&#8217;larda uygulamak:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo salt '*' state.apply nginx<\/code><\/pre>\n<p>*   <strong>Belirli bir Minion&#8217;da belirli bir State&#8217;i uygulamak:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo salt 'minion_id' state.apply nginx.config<\/code><\/pre>\n<p>*   <strong>Sadece de\u011fi\u015fiklikleri g\u00f6rmek i\u00e7in (dry run):<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo salt '*' state.apply test=True<\/code><\/pre>\n<p>Bu komutlar\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, Minion&#8217;lar Master&#8217;dan State dosyalar\u0131n\u0131 \u00e7ekecek, Pillar verilerini alacak ve belirtilen durumlar\u0131 uygulamaya \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<p><strong>Test Etme Ad\u0131mlar\u0131:<\/strong><br \/>\n1.  <strong>Nginx servisinin durumunu kontrol edin:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo systemctl status nginx<\/code><\/pre>\n<p>    Servisin <code>active (running)<\/code> oldu\u011funu ve herhangi bir hata olmad\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n.<br \/>\n2.  <strong>Nginx konfig\u00fcrasyonunun do\u011frulu\u011funu kontrol edin:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo nginx -t<\/code><\/pre>\n<p>    Bu komut, Nginx konfig\u00fcrasyon dosyalar\u0131n\u0131zda s\u00f6zdizimi hatas\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Hata yoksa <code>syntax is ok<\/code> ve <code>test is successful<\/code> mesajlar\u0131n\u0131 g\u00f6rmelisiniz.<br \/>\n3.  <strong>Web sitelerine eri\u015fimi test edin:<\/strong> Taray\u0131c\u0131n\u0131zdan veya <code>curl<\/code> komutuyla yap\u0131land\u0131rd\u0131\u011f\u0131n\u0131z domainlere eri\u015fmeye \u00e7al\u0131\u015f\u0131n.<\/p>\n<pre><code class=\"language-bash\">curl http:\/\/example.com\n    curl https:\/\/example.com<\/code><\/pre>\n<p>    \u0130stenen i\u00e7eri\u011fin geldi\u011finden emin olun.<br \/>\n4.  <strong>Loglar\u0131 kontrol edin:<\/strong><\/p>\n<pre><code class=\"language-bash\">tail -f \/var\/log\/nginx\/access.log\n    tail -f \/var\/log\/nginx\/error.log<\/code><\/pre>\n<p>    Eri\u015fim ve hata loglar\u0131nda beklenmedik girdiler olup olmad\u0131\u011f\u0131n\u0131 kontrol edin.<\/p>\n<h3>Geli\u015fmi\u015f Konfig\u00fcrasyonlar ve En \u0130yi Uygulamalar<\/h3>\n<p>SaltStack ve Nginx entegrasyonunu daha da geli\u015ftirmek i\u00e7in baz\u0131 ileri d\u00fczey teknikler ve en iyi uygulamalar mevcuttur:<\/p>\n<p>*   <strong>Custom Mod\u00fcller ve Execution Mod\u00fcller:<\/strong> SaltStack&#8217;in varsay\u0131lan mod\u00fclleri ihtiyac\u0131n\u0131z\u0131 kar\u015f\u0131lamad\u0131\u011f\u0131nda, kendi Python mod\u00fcllerinizi yazarak SaltStack&#8217;in yeteneklerini geni\u015fletebilirsiniz. \u00d6rne\u011fin, Nginx mod\u00fcllerini y\u00fcklemek veya \u00f6zel bir Nginx konfig\u00fcrasyonunu do\u011frulamak i\u00e7in \u00f6zel bir mod\u00fcl yazabilirsiniz.<br \/>\n*   <strong>Salt Reactor:<\/strong> Salt Reactor, Salt Master&#8217;\u0131n Minion&#8217;lardan veya di\u011fer kaynaklardan gelen olaylara tepki vermesini sa\u011flayan bir sistemdir. \u00d6rne\u011fin, yeni bir SSL sertifikas\u0131 da\u011f\u0131t\u0131ld\u0131\u011f\u0131nda Nginx servisinin otomatik olarak yeniden y\u00fcklenmesini sa\u011flamak i\u00e7in bir Reactor kural\u0131 olu\u015fturabilirsiniz.<br \/>\n*   <strong>Orchestration:<\/strong> Salt Orchestration, birden fazla sunucu \u00fczerinde karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir web uygulamas\u0131n\u0131n da\u011f\u0131t\u0131m\u0131nda \u00f6nce veritaban\u0131 sunucusunu, ard\u0131ndan uygulama sunucusunu ve son olarak Nginx proxy&#8217;sini yap\u0131land\u0131rmak gibi s\u0131ral\u0131 i\u015flemler i\u00e7in Orchestration State&#8217;leri yazabilirsiniz.<br \/>\n*   <strong>GitFS:<\/strong> Salt State dosyalar\u0131n\u0131 ve Pillar verilerini do\u011frudan bir Git deposundan \u00e7ekmek i\u00e7in GitFS kullanabilirsiniz. Bu, konfig\u00fcrasyonlar\u0131n\u0131z\u0131 versiyon kontrol\u00fc alt\u0131nda tutman\u0131n ve i\u015fbirli\u011fini sa\u011flaman\u0131n en iyi yoludur.<br \/>\n*   <strong>Idempotency:<\/strong> Salt State&#8217;leri do\u011fas\u0131 gere\u011fi idempotent olmal\u0131d\u0131r. Yani, bir State&#8217;i birden fazla kez \u00e7al\u0131\u015ft\u0131rmak, sistemi her seferinde ayn\u0131 istenen duruma getirmeli ve ilk \u00e7al\u0131\u015ft\u0131rmadan sonra herhangi bir de\u011fi\u015fiklik yapmamal\u0131d\u0131r. Bu, g\u00fcvenilir otomasyon i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> Pillar&#8217;\u0131 hassas veriler i\u00e7in kullanmak ve Salt Master ile Minion&#8217;lar aras\u0131ndaki ileti\u015fimi \u015fifrelemek \u00f6nemlidir. Ayr\u0131ca, SaltStack&#8217;in rol tabanl\u0131 eri\u015fim kontrol\u00fc (RBAC) \u00f6zelliklerini kullanarak kimin hangi komutlar\u0131 \u00e7al\u0131\u015ft\u0131rabilece\u011fini veya hangi State&#8217;leri uygulayabilece\u011fini k\u0131s\u0131tlayabilirsiniz.<br \/>\n*   <strong>Test:<\/strong> Salt States i\u00e7in test stratejileri geli\u015ftirmek, da\u011f\u0131t\u0131mlar\u0131n\u0131z\u0131n g\u00fcvenilirli\u011fini art\u0131r\u0131r. Salt-testing veya Molecule gibi ara\u00e7larla State&#8217;lerinizi test edebilir, de\u011fi\u015fikliklerin beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olabilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>SaltStack, Nginx web sunucular\u0131n\u0131n kurulumundan karma\u015f\u0131k konfig\u00fcrasyonlar\u0131na kadar t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc otomatikle\u015ftirme konusunda e\u015fsiz yetenekler sunar. Bu makalede ele al\u0131nan ad\u0131mlar ve \u00f6rnekler, Nginx altyap\u0131n\u0131z\u0131 SaltStack ile y\u00f6netmeye ba\u015flamak i\u00e7in sa\u011flam bir temel sa\u011flamaktad\u0131r. Salt States&#8217;in deklaratif yap\u0131s\u0131, Pillar&#8217;\u0131n esnekli\u011fi ve Jinja \u015fablonlaman\u0131n g\u00fcc\u00fc sayesinde, y\u00fcksek d\u00fczeyde \u00f6zelle\u015ftirilebilir, \u00f6l\u00e7eklenebilir ve tutarl\u0131 Nginx da\u011f\u0131t\u0131mlar\u0131 olu\u015fturabilirsiniz.<\/p>\n<p>Otomasyon, sadece i\u015f y\u00fck\u00fcn\u00fc azaltmakla kalmaz, ayn\u0131 zamanda sistemlerinizin g\u00fcvenli\u011fini, performans\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131r\u0131r. SaltStack&#8217;i Nginx y\u00f6netimi s\u00fcre\u00e7lerinize entegre ederek, altyap\u0131n\u0131z \u00fczerinde tam kontrol sa\u011flayabilir, hata oranlar\u0131n\u0131 d\u00fc\u015f\u00fcrebilir ve operasyonel verimlili\u011finizi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirsiniz. SaltStack&#8217;in sundu\u011fu geni\u015f mod\u00fcl yelpazesi ve geni\u015fletilebilirlik yetenekleri sayesinde, Nginx&#8217;in \u00f6tesinde t\u00fcm sunucu altyap\u0131n\u0131z\u0131 merkezi ve otomatik bir \u015fekilde y\u00f6netme potansiyeline sahip olursunuz. Bu sayede, IT ekipleri daha stratejik g\u00f6revlere odaklanabilir ve i\u015f de\u011ferini art\u0131ran yenilik\u00e7i projelere zaman ay\u0131rabilir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#8217;leri Olu\u015fturma\nSaltStack, modern altyap\u0131 y\u00f6netiminde otomasyon, konfig\u00fcrasyon y\u00f6ne","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1504],"tags":[],"class_list":{"0":"post-31431","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-nginx","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#039;leri Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#039;leri Olu\u015fturma\" \/>\n<meta property=\"og:description\" content=\"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#039;leri Olu\u015fturma SaltStack, modern altyap\u0131 y\u00f6netiminde otomasyon, konfig\u00fcrasyon y\u00f6ne\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-09T19:41:23+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#8217;leri Olu\u015fturma\",\"datePublished\":\"2025-10-09T19:41:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/\"},\"wordCount\":2119,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Nginx\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/\",\"name\":\"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State'leri Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-09T19:41:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#8217;leri Olu\u015fturma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State'leri Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/","og_locale":"tr_TR","og_type":"article","og_title":"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State'leri Olu\u015fturma","og_description":"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State'leri Olu\u015fturma SaltStack, modern altyap\u0131 y\u00f6netiminde otomasyon, konfig\u00fcrasyon y\u00f6ne","og_url":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-09T19:41:23+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#8217;leri Olu\u015fturma","datePublished":"2025-10-09T19:41:23+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/"},"wordCount":2119,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Nginx"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/","url":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/","name":"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State'leri Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-09T19:41:23+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/saltstack-altyapisi-nginx-web-sunuculari-icin-salt-stateleri-olusturma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SaltStack Altyap\u0131s\u0131: Nginx Web Sunucular\u0131 i\u00e7in Salt State&#8217;leri Olu\u015fturma"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31431"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31431\/revisions"}],"predecessor-version":[{"id":31432,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31431\/revisions\/31432"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}