<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Görkem Rıdvan ARIK</title>
	<atom:link href="https://gorkemarik.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://gorkemarik.com/</link>
	<description>Yazılım Geliştirme &#38; Mühendislik</description>
	<lastBuildDate>Sat, 07 Dec 2024 16:49:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://gorkemarik.com/wp-content/uploads/2024/09/unnamed.jpg</url>
	<title>Görkem Rıdvan ARIK</title>
	<link>https://gorkemarik.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Recursive (Özyinelemeli) Fonksiyon Analizi #1 Iteration Method (Tekrarlama Yöntemi)</title>
		<link>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/</link>
					<comments>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/#respond</comments>
		
		<dc:creator><![CDATA[Görkem Rıdvan ARIK]]></dc:creator>
		<pubDate>Tue, 17 Sep 2024 16:04:56 +0000</pubDate>
				<category><![CDATA[Algoritma Analizi]]></category>
		<category><![CDATA[Analiz]]></category>
		<category><![CDATA[Recursive Fonksiyonlar]]></category>
		<category><![CDATA[algoritma analizi]]></category>
		<category><![CDATA[iteration method]]></category>
		<category><![CDATA[recursive fonksiyon analizi]]></category>
		<category><![CDATA[tekrarlama yöntemi]]></category>
		<guid isPermaLink="false">https://gorkemarik.com/?p=289</guid>

					<description><![CDATA[<p>Iteration metodu, bir recursive denklemi çözmek için kullanılan tekniklerden biridir. T(n) denklemini ardışık adımlarla açarak, fonksiyonun kapalı formunu (closed form) elde etmeye çalışır. Bu yöntemin 5 temel adımdan oluşur.</p>
<p><a href="https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/">Recursive (Özyinelemeli) Fonksiyon Analizi #1 Iteration Method (Tekrarlama Yöntemi)</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><strong>Giriş</strong></h4>



<p>Öz yinelemeli fonksiyonlar kendi içerisinde tekrar tekrar kendisini çağıran fonksiyonlardır. Tam da bu yüzden bu algoritmaların analizini yapmak standart fonksiyonlara göre daha zahmetlidir.</p>



<p>Algoritma analizi kapsamında recursive olmayan fonksiyonların analizi standart yöntemlerle kolay bir şekilde gerçekleştirilebilirken recursive fonksiyonlarda işler biraz karışabiliyor. Bu fonksiyonların analizini gerçekleştirmek için birkaç yöntem bulunmaktadır. Bu yazıda bir özyinelemeli algoritmanın analiz analiz yöntemlerinden bahsederek <strong>Iteration Methodu</strong> ile <strong>Hanoi Kuleleri</strong> algoritmasının analizini gerçekleştireceğiz.</p>



<p>Temel olarak 2 adım ile bu fonksiyonların analizi gerçekleştirilebilir:</p>



<ol class="wp-block-list">
<li><a href="/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/">Algoritmanın zamana bağlı denkleminin <strong><em>T(n)</em></strong> elde edilmesi.</a></li>



<li>Elde edilen denklemin <strong><em>Substitution, Iterasyon, Recursion</em></strong> <strong><em>Tree</em></strong> veya <strong><em>Master </em></strong>yöntemleriyle çözülmesi.</li>
</ol>



<p>Birinci adım için daha önce yazmış olduğum <strong><em><a href="/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/">Recursive (Özyinelemeli) Fonksiyonlarda Zaman Denklemini Bulma</a></em></strong> yazımı okuyabilirsiniz.</p>



<p>Bu yazıda ikinci adım olan <strong><em>T(n)</em></strong>&#8216;i bilinen bir algoritmanın <strong><em> Iteration</em></strong> teoremini kullanarak analizini gerçekleştireceğiz.</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><strong>Iteration (İterasyon-Yineleme) Metodu</strong></h4>



<p>Iteration metodu, bir recursive denklemi çözmek için kullanılan tekniklerden biridir. T(n) denklemini ardışık adımlarla açarak, fonksiyonun kapalı formunu (closed form) elde etmeye çalışır. Bu yöntemin temel adımları şu şekilde sıralanabilir:</p>



<ol class="wp-block-list">
<li><a href="#denklemin-bulunmasi">T(n) denkleminin bulunması</a></li>



<li><a href="#denklemin-acilmasi">Bulunan T(n)&#8217;in tekrar tekrar açılması</a></li>



<li><a href="#genelleme-yapilmasi">Genelleme yapılması, genel bir ifade bulunması</a></li>



<li><a href="#durdurma-kosulu">Durdurma koşulunun hesaplanması</a></li>



<li><a href="#kapali-form">Kapalı formun elde edilmesi</a></li>
</ol>



<p>Şimdi bu adımları Hanoi Kuleleri algoritması üzerinde sırayla gerçekleştireceğiz. Analize geçmeden önce kısaca Hanoi Kuleleri algoritmasına değinebiliriz.</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><strong>Hanoi Kuleleri Algoritması</strong></h4>



<p>Kısaca bir çubuk üzerindeki blokları diğer çubuğa en altta en büyük en üstte ise en küçük blok olacak şekilde taşınmasını hedefleyen algoritmadır ve aşağıdaki görsel ile anlatılabilir. Yalnız bu işlemi gerçekleştirmek için 2 kural bulunuyor. <strong>Her hamlede yalnızca 1 blok hareket ettirilebilir</strong> ve <strong>hiçbir hamlede küçük bir bloğun üstünde büyük bir blok olamaz.</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="617" height="130" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-5.png" alt="" class="wp-image-413" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-5.png 617w, https://gorkemarik.com/wp-content/uploads/2024/09/image-5-300x63.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></figure>
</div>


<p></p>



<p class="has-text-align-left">Bu algoritmayı koda dökecek olursak aşağıdaki gibi bir recursive fonksiyon yazabiliriz. Blokları A çubuğundan C çubuğuna taşımak istiyoruz.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">package main

func main() {
	hanoi(3, "A", "C", "B")
}

func hanoi(n int, from, to, aux string) {
	if n &gt;= 1 {
		hanoi(n-1, from, aux, to)
		move(from, to)
		hanoi(n-1, aux, to, from)
	}
}

func move(from, to string) {
	println("Move disk from", from, "to", to)
}</pre></div>



<p>Şimdi analiz adımlarına geçebiliriz.</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="denklemin-bulunmasi"><strong><a href="#denklemin-bulunmasi">1) T(n) denkleminin bulunması</a></strong></h4>



<p>Recursive fonksiyon çağırımlarının ikisi de n-1 kez çalışacaktır. Dolayısıyla ikisine de <em>T(n-1)</em> diyebiliriz. ortadaki move fonksiyonu ise herhangi bir recursive çağırım yapmadığı için <em>O(1)</em> diyebiliriz. Oluşan ifadeleri topladığımızda T(n) denklemini <strong><em>T(n)=2T(n-1)+1</em></strong> şeklinde elde ederiz.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="462" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-6-1024x462.png" alt="" class="wp-image-418" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-6-1024x462.png 1024w, https://gorkemarik.com/wp-content/uploads/2024/09/image-6-300x135.png 300w, https://gorkemarik.com/wp-content/uploads/2024/09/image-6-768x346.png 768w, https://gorkemarik.com/wp-content/uploads/2024/09/image-6.png 1178w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="denklemin-acilmasi"><strong><a href="#denklemin-acilmasi">2) Bulunan T(n)&#8217;in Tekrar Tekrar Açılması</a></strong></h4>



<p>Denklemimizde O(1) yerine sabit olarak c yazabiliriz. Ardından n yerine birkaç kez fonksiyonun kendi değerini yazarak tekrar tekrar açtığımızda aşağıdaki gibi <strong><em>8T(n-3)+7c</em> </strong>ifadesini elde edeceğiz.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="608" height="248" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-9.png" alt="" class="wp-image-425" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-9.png 608w, https://gorkemarik.com/wp-content/uploads/2024/09/image-9-300x122.png 300w" sizes="(max-width: 608px) 100vw, 608px" /></figure>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="genelleme-yapilmasi"><strong><a href="#genelleme-yapilmasi">3) Genelleme yapılması, genel bir ifade bulunması</a></strong></h4>



<p>Elde ettiğimiz <strong>T(n)=<em>8T(n-3)+7c</em></strong> ifadesini biraz düzenleyelim. 8 yerine <strong><em>2^3</em></strong> ve 7 yerine <strong><em>2^3 &#8211; 1</em></strong> yazabiliriz. İfademizin son hali şöyle olur:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="347" height="50" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-12.png" alt="" class="wp-image-433" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-12.png 347w, https://gorkemarik.com/wp-content/uploads/2024/09/image-12-300x43.png 300w" sizes="auto, (max-width: 347px) 100vw, 347px" /></figure>
</div>


<p>Fark edildiği üzere bu ifadede 3 sayısı ortak bir hale geldi. 3 yerine <strong><em>k</em></strong> yazalım. Şu ifadeyi elde ederiz:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="417" height="56" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-13.png" alt="" class="wp-image-434" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-13.png 417w, https://gorkemarik.com/wp-content/uploads/2024/09/image-13-300x40.png 300w" sizes="auto, (max-width: 417px) 100vw, 417px" /></figure>
</div>


<p>Böylelikle ifadeyi genelleştirerek değişkenli bir hale dönüştürdük. Sonraki adıma geçebiliriz.</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="durdurma-kosulu"><strong><a href="#durdurma-kosulu">4) Durdurma koşulunun hesaplanması</a></strong></h4>



<p>Durdurma koşulunun hesaplanması adımı ifadede T içerisini sıfıra eşitlemekten geçer. Yani <strong><em>n-k = 0</em></strong> ifadesini çözmemiz gerekir. Sonuç olarak <strong><em>n=k</em></strong> elde ederiz. Durdurma koşulumuzu <strong><em>n</em> </strong>olarak elde ettik. </p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="kapali-form"><strong><a href="#kapali-form">5) Kapalı formun elde edilmesi</a></strong></h4>



<p>Son adımda ise bir önceki adıma bulduğumuz durdurma koşulunu denklemde k yerine yazmamız gerekiyor. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="489" height="170" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-14.png" alt="" class="wp-image-438" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-14.png 489w, https://gorkemarik.com/wp-content/uploads/2024/09/image-14-300x104.png 300w" sizes="auto, (max-width: 489px) 100vw, 489px" /></figure>
</div>


<p>Eğer T(0)=0 ise;</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="164" height="36" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-15.png" alt="" class="wp-image-439"/></figure>
</div>


<p>Sabitler asimptotik büyüme hızını etkilemeyeceğinden dolayı yaptığımız analiz sonucu algoritmanın çalışma süresi <strong><em>O(2^n) </em></strong>elde edilir.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="221" height="97" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-16.png" alt="" class="wp-image-440"/></figure>
</div><p><a href="https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/">Recursive (Özyinelemeli) Fonksiyon Analizi #1 Iteration Method (Tekrarlama Yöntemi)</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Recursive (Özyinelemeli) Fonksiyonlarda Zaman Denklemini Bulma</title>
		<link>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/</link>
					<comments>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/#respond</comments>
		
		<dc:creator><![CDATA[Görkem Rıdvan ARIK]]></dc:creator>
		<pubDate>Thu, 11 Apr 2024 20:26:54 +0000</pubDate>
				<category><![CDATA[Algoritma Analizi]]></category>
		<category><![CDATA[Recursive Fonksiyonlar]]></category>
		<category><![CDATA[Zaman Denklemi]]></category>
		<category><![CDATA[algoritma analizi]]></category>
		<category><![CDATA[binary search analizi]]></category>
		<category><![CDATA[binary search zaman denklemi]]></category>
		<category><![CDATA[recursive binary search]]></category>
		<category><![CDATA[recursive fonksiyon zaman denklemi]]></category>
		<category><![CDATA[zaman denklemi]]></category>
		<guid isPermaLink="false">https://gorkemarik.com/?p=294</guid>

					<description><![CDATA[<p>Recursive fonksiyonların analizini gerçekleştirebilmek için öncelikle fonksiyonun zamana bağlı denkleminin yazılması gerekmektedir. Bu makalede zamana bağlı denklemlerin nasıl yazılabileceği ele alınmıştır</p>
<p><a href="https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/">Recursive (Özyinelemeli) Fonksiyonlarda Zaman Denklemini Bulma</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>Recursive (özyinelemeli) algoritmaların analizini gerçekleştirme yöntemleri olan iteration, substition, master ve recurrence yöntemlerini kullanabilmek için öncellikle fonksiyonun zaman denkleminin <strong><em>T(n)</em></strong> cinsinden elde edilmesi gerekmektedir. </p>



<p>Oldukça basit bir işlem olmakla birlikte ana gereksinim analiz edilmek istenen algoritmanın çalışma mantığının kavranmasıdır. Bu makalede Binary Search algoritmasının öz yinelemeli fonksiyonu üzerinden örnekler ile <strong><em>T(n)</em></strong> denklemini elde edeceğiz.</p>



<h4 class="wp-block-heading"><strong>İzlenecek Yol</strong></h4>



<p>Örneklere geçmeden önce teorik olarak izleyeceğimiz adımlardan bahsetmek gerekirse fonksiyonumuzu satır satır okuyacağız ve çalışma mantığını anlayacağız. Daha sonra sabitler, döngüler ve kendini çağırmalar için denklem değişkenlerini yerine koyacağız.</p>



<h4 class="wp-block-heading"><strong>Binary Search Algoritmasının Zaman Denklemini Elde Etme</strong></h4>



<p></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" src="https://notes.joeyh.dev/cs126/img/binsearch.png" alt=""/><figcaption class="wp-element-caption"><a href="https://notes.joeyh.dev/cs126/recursion.html" target="_blank" rel="noreferrer noopener nofollow">Görsel Kaynağı</a></figcaption></figure>
</div>


<p></p>



<p>Binary search algoritması bilindiği üzere sıralı elemanlardan oluşan sayı kümesinde bir arama işlemi gerçekleştirir. Önce kümenin tam ortasındaki elemana bakar ve aranan eleman o ise geri döndürülür. Aranan eleman ortadaki elemandan büyükse kümenin ortasından sonuna kadar olan kısmında aynı işlem tekrarlanır. Aranan eleman küçük ise de kümenin başlangıcından ortadaki elemana kadar olan kısım alınarak tekrarlanır. </p>



<p></p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">int binarySearch(int arr[], int left, int right, int x)
{
    if (right &gt;= left) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == x)
            return mid;
        if (arr[mid] &gt; x)
            return binarySearch(arr, left, mid - 1, x);
        return binarySearch(arr, mid + 1, right, x);
    }
    return -1;
}</pre></div>



<p></p>



<p>Algoritmayı anladıktan sonra koda geçecek olursak ilk önce bir if kontrolü yapılıyor. Bu sabite O(1) diyebiliriz. Bu if içerisinde ise bir değişken ataması yapılarak başka bir if kontrolü yapılmış. Bu iki satır da sabit oldukları için kendilerine O(1) diyebiliriz. </p>



<p>Sabit kısımların ardından asıl önemli kısım olan recursive kısım gelmektedir. <strong><em>if (arr[mid] > x)</em></strong> kontrolünün şartı sağlanırsa yani dizinin ortasındaki eleman aranan sayıdan büyükse fonksiyon kendisini çağırıyor ve parametre olarak dizinin ilk elemanından orta elemanına kadar olan kısım veriliyor. Yani artık eleman sayısı yarıya inmiş durumda. </p>



<p>Bu if şartı sağlanmıyor ise dizinin ortasındaki eleman aranan sayıdan küçük veya eşit demektir. Böylelikle kümenin ortasından sonuna kadar olan kısım parametre olarak verilerek aynı işlemler tekrarlanıyor. </p>



<p>İki recursive çağırım da şarta bağlı olduğundan aslında yalnızca bir kez recursive çağırım yapılıyor. Ayrıca iki çağırımda da eleman sayısı yarıya iniyor. Dolayı koddaki işaretlenmiş recursive kısmına <strong><em>T(n/2)</em></strong> diyebiliriz.</p>



<p>En sonda ise elemanın bulunmama durumunda -1 sayısı döndürülüyor. Buna da O(1) diyebiliriz.</p>



<p>Bu adımların ardından zaman denklemimizi aslında yazdık. Toparlayacak olursak toplamda 4 kez O(1) sonucuna ve 1 kere T(n/2) sonucuna ulaştık. Buna göre T(n) denklemimiz:</p>



<p><strong><em>T(n) = T(n/2) + 4O(1)</em></strong></p>



<p>Elde ederiz. O(1)&#8217;ler sabit olduğu için direkt <strong><em>c</em></strong> dersek denklemin son hali:</p>



<p><strong><em>T(n) = T(n/2) + c</em></strong></p>



<p>Elde etmiş oluruz. </p>



<h4 class="wp-block-heading"><strong>Sonuç</strong></h4>



<p>Bu yazıda Binary Search algoritmasının recurisve fonksiyonu için zaman fonksiyonunu yazdık. Özet olarak algoritmanın çalışma prensibini tespit ettikten sonra recursive çağırımların kaç kez çalıştığını saptamak denklemi yazmanın büyük bir kısmını oluşturmaktadır. Sabitler de eklenerek denklem kolayca elde edilmektedir. </p>



<p>Sonraki yazılarda bu elde ettiğimiz denklemi çeşitli yöntemler kullanarak çözerek algoritma analizini gerçekleştireceğiz.</p>
<p><a href="https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/">Recursive (Özyinelemeli) Fonksiyonlarda Zaman Denklemini Bulma</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Go 1.21 Yenilikleri</title>
		<link>https://gorkemarik.com/programlama-dilleri/go/1-21-0/go-1-21-yenilikleri/</link>
					<comments>https://gorkemarik.com/programlama-dilleri/go/1-21-0/go-1-21-yenilikleri/#respond</comments>
		
		<dc:creator><![CDATA[Görkem Rıdvan ARIK]]></dc:creator>
		<pubDate>Tue, 05 Sep 2023 20:57:08 +0000</pubDate>
				<category><![CDATA[1.21.0]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[go]]></category>
		<category><![CDATA[go 1.21 yenilikleri]]></category>
		<category><![CDATA[go 1.21.0]]></category>
		<category><![CDATA[go-surum-yenilikleri]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[golang 1.21.0]]></category>
		<guid isPermaLink="false">https://gorkemarik.com/?p=170</guid>

					<description><![CDATA[<p>Merhaba, bu yazıda Go programlama diline Ağustos ayında gelen 1.21 sürümündeki yenilik ve güncellemeleri örnek kullanımlarla birlikte değineceğim.</p>
<p><a href="https://gorkemarik.com/programlama-dilleri/go/1-21-0/go-1-21-yenilikleri/">Go 1.21 Yenilikleri</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Merhaba, bu yazıda Go programlama diline Ağustos ayında gelen 1.21 sürümündeki yenilik ve güncellemeleri örnek kullanımlarla birlikte değineceğim.</p>



<h3 class="wp-block-heading" id="dil-degisiklikleri"><a href="#dil-degisiklikleri">Dil Değişiklikleri</a></h3>



<p>Go 1.21 sürümü ile <strong><em>min</em></strong>, <strong><em>max </em></strong>ve <strong><em>clear</em></strong> olmak üzere 3 yeni yerleşik (built-in) fonksiyon eklendi. İsimlerinden de anlaşılacağı üzere <strong><em>min</em></strong> fonksiyonu kendisine parametre olarak verilen değerler arasından en küçük olanı döndürürken <strong><em>max </em></strong>fonksiyonu kendisine verilen parametreler arasından en büyük değeri döndürmektedir. <strong><em>clear</em></strong> fonksiyonu ise parametre olarak <em>map</em>, <em>slice </em>ve <em>type parameter</em> alarak bunların tüm öğelerini siler veya sıfırlar. Bu fonksiyonlara birer örnek verecek olursak;</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">x := min(1, -5, 3, 2, 0)
fmt.Println(x)
// Output: -5

y := max(1, -5, 3, 2, 0)
fmt.Println(y)
// Output: 3

cities := map[string]int{
 "Adana":  1,
 "Ankara": 6,
 "Istanbul": 34,
}
fmt.Println(cities)
clear(cities)
fmt.Println(cities)
// Output: 
// map[Adana:1 Ankara:6 Istanbul:34]
// map[]</pre></div>



<h3 class="wp-block-heading" id="go-komutu-flag-guncellemeleri"><a href="#go-komutu-flag-guncellemeleri">Go Komutu ve Flag Güncellemeleri</a></h3>



<ul class="wp-block-list">
<li>-pgo derleme flag&#8217;i varsayılan olarak -pgo=auto olarak ayarlandı. </li>



<li>Komut satırında yalnızca tek bir ana paketi belirtme kısıtlaması kaldırıldı. </li>



<li>Ana paketin dizininde default.pgo adında bir dosya bulunuyorsa bu dosya otomatik olarak optimizasyonu etkinleştirmek için kullanılacak.</li>



<li><code>go test</code> komutu için <strong>-fullpath</strong> parametresi eklendi. Bu sayede log mesajlarında tam yolun yazdırılma opsiyonu eklendi.</li>
</ul>



<h3 class="wp-block-heading" id="derleyici"><a href="#derleyici">Derleyici</a></h3>



<ul class="wp-block-list">
<li>Go 1.20 sürümünde önizleme olarak eklenen profile-guide optimization (PGO) 1.21.0 sürümü ile birlikte genel kullanıma hazır hale getirildi. Bununla birlikte temsili bir Go programında PGO etkinleştirilirse %2 ile %7 arasında iyileşme görülebileceği belirtiliyor. PGO hakkında daha detaylı bilgi için <a href="https://go.dev/doc/pgo" target="_blank" rel="noreferrer noopener">bağlantıdan</a> dokümanlara ulaşabilirsiniz.</li>



<li>Ayrıca Go 1.21.0 sürümü ile derleyicinin kendisini PGO ile oluşturması sayesinde build alma hızının %6&#8217;ya kadar arttığı belirtiliyor.</li>
</ul>



<h3 class="wp-block-heading" id="yeni-kutuphane-paketleri"><a href="#yeni-kutuphane-paketleri">Yeni Kütüphane Paketleri</a></h3>



<h4 class="wp-block-heading" id="log-slog-paketi"><a href="#log-slog-paketi">log/slog Paketi</a></h4>



<p>Yeni paketin popüler log analiz araçları ve servisler ile entegre desteği olmasıyla beraber Go&#8217;da loglama işlemleri için kullanılan 3. parti kütüphanelerin kullanımı azalacak gibi görünüyor. Yapısal loglama (<strong>structured logging</strong>) anahtar/değer çiftleri ile gerçekleştirildiğinden dolayı büyük miktardaki log kayıtlarının hızlı ve doğru bir şekilde işlenmesi sağlanıyor.</p>



<p>Paket için ufak bir örnek yapacak olursak aşağıdaki kullanılan Info fonksiyonunun imzası <em><strong>slog.Info(msg string, args &#8230;any)</strong> </em>şeklindedir. Görüldüğü üzere ilk parametre log mesajıdır. diğer parametreler ise anahtar-değer çiftlerini temsil eder. </p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">package main

import "log/slog"

func main() {
	slog.Info("Yetkisiz erişim", "Ad", "John", "Soyad", "Doe")
}
// Output: 
// 2023/09/05 21:07:14 INFO Yetkisiz erişim Ad=John Soyad=Doe</pre></div>



<p>Ayrıca çıktı formatında daha çok hakimiyet için <strong><em>slog.New(h handler) *Logger</em></strong> imzalı bir fonksiyon da bulunuyor. Bu fonksiyon ile ihtiyaç duyulan handler belirtilerek logger örneği oluşturulabiliyor. Örneğin alttaki örnekte <a href="https://pkg.go.dev/log/slog@master#JSONHandler" target="_blank" rel="noreferrer noopener">JSONHandler</a> kullanarak bir logger örneği bulunuyor.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">package main

import (
	"log/slog"
	"os"
)

func main() {
	logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
	logger.Info("Yetkisiz erişim", "Ad", "John", "Soyad", "Doe")
}

// Output:
// {"time":"2023-09-05T21:10:29.2848066+03:00","level":"INFO","msg":"Yetkisiz erişim","Ad":"John","Soyad":"Doe"}</pre></div>



<p>Örnekler ve slog paketi hakkında detaylı bilgi için <strong><a href="https://pkg.go.dev/log/slog@master" target="_blank" rel="noreferrer noopener">dokümanları</a> </strong>inceleyebilirsiniz.</p>



<h4 class="wp-block-heading" id="testing-slogtest-paketi"><a href="#testing-slogtest-paketi">testing/slogtest Paketi</a></h4>



<p>Bu paketin slog.Handler implementasyonlarını doğrulamaya yardımcı olabilmesi amacıyla eklendiği belirtiliyor. Paketin içerisinde <strong><em>func TestHandler(h slog.Handler, results func() []map[string]any) error</em></strong> imzasına sahip bir fonksiyon bulunuyor. Bu fonksiyon kullanıldığı takdirde yanlış giden bir durum olduğunda oluşan hataların her birini error.Join ile birleştirerek döndürülür. </p>



<p>Yalnızca TestHandler fonksiyonu bulunan bu paket için detayları ve örnekleri incelemek isterseniz <a href="https://pkg.go.dev/testing/slogtest@master" target="_blank" rel="noreferrer noopener"><strong>paket </strong></a><strong><a href="https://pkg.go.dev/testing/slogtest@master" target="_blank" rel="noreferrer noopener">dokümanlarını</a> </strong>inceleyebilirsiniz.</p>



<h4 class="wp-block-heading" id="slices-paketi"><a href="#slices-paketi">slices&nbsp;Paketi</a></h4>



<p>Adından da anlaşılacağı üzere yeni slices paketi slice yapısı için birçok yeni fonksiyon içermektedir. Bu fonksiyonlardan başlıcalarından birkaç tane örnek vereceğim.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">package main

import (
	"fmt"
	"slices"
)

func main() {
	numbers := []int{0, 42, -10, 8}

	// Min: Parametre olarak verilen slice içerisindeki
	// en küçük elemanı döndürür.
	fmt.Println(slices.Min(numbers))
	//Output: -10

	// Max: Parametre olarak verilen slice içerisindeki
	// en büyük elemanı döndürür.
	fmt.Println(slices.Max(numbers))
	// Output: 42

	// Insert: İlk parametrede verilen slice içerisine
	// ikinci parametrede verilen index değerine 3. ve
	// diğer parametrelerdeki sayıları sırası ile ekler.
	fmt.Println(slices.Insert(numbers, 1, 1, 2))
	// Output: [0 1 2 42 -10 8]

	// Index: 2. parametrede verilen değer ilk parametrede verilen
	// slice içinde bulunuyorsa index'i döndürür.
	// Bulunmuyorsa -1 değerini döndürür.
	fmt.Println(slices.Index(numbers, -5))
	// Output: -1

	// Sort: Parametre olarak verilen slice'ı küçükten büyüğe sıralar
	slices.Sort(numbers)
	fmt.Println(numbers)
	// Output: [-10 0 8 42]

	// Reverse: Parametre olarak verilen slice'ı tersine çevirir
	slices.Reverse(numbers)
	fmt.Println(numbers)
	// Output: [42 8 0 -10]

	// Delete: İlk parametrede verilen slice içerisinden
	// [1:3] elemanlarını siler. (1 dahil, 3 dahil değil)
	fmt.Println(slices.Delete(numbers, 1, 3))
	// Output: [42 -10]
}</pre></div>



<p>slices paketindeki diğer örnekleri, fonksiyonları ve detayları incelemek için lütfen <strong><a href="https://pkg.go.dev/slices@master" target="_blank" rel="noreferrer noopener">dokümanları</a> </strong>inceleyin. </p>



<h4 class="wp-block-heading" id="maps-paketi"><a href="#maps-paketi">maps Paketi</a></h4>



<p>Bu paket de adından anlaşılacağı üzere map yapısı üzerinde birtakım operasyonlar olan <strong><em>Clone, Copy, DeleteFunc, Equal ve EqualFunc</em> </strong>fonksiyonlarını içerir. Birkaç kullanım örneği vermek gerekirse:</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">package main

import (
	"fmt"
	"maps"
)

func main() {
	m := map[string]int{
		"one":   1,
		"two":   2,
		"three": 3,
		"four":  4,
	}

	// Clone: Parametre olarak verilen map'in bir kopyasını döndürür.
	fmt.Println(maps.Clone(m))
	// Output: map[four:4 one:1 three:3 two:2]

	// Copy: 2. parametrede verilen map'in anahtar/değer eşlerini
	// 1. parametrede verilen map'e eşitler. Kopyalanan map içerisinde
	// çakışma varsa yeni değerler eski değerlerin üzerine yazılır.
	copied := map[string]int{}
	maps.Copy(copied, m)
	fmt.Println(copied)
	// Output: map[four:4 one:1 three:3 two:2]

	// Equal: Parametre olarak verilen 2 map'in değerlerinin aynı
	// olup olmadığını karşılaştırır.
	fmt.Println(maps.Equal(m, map[string]int{"İstanbul": 34}))
	// Output: false

	// DeleteFunc: map için silme kurallarını belirleyeceğimiz
	// fonksiyonlar tanımlamamızı sağlar. Dokümanda verilen örnekte
	// tek değerleri silmek için aşağıdaki şekilde fonksiyon yazılabilir.
	maps.DeleteFunc(m, func(k string, v int) bool {
		return v%2 != 0
	})
	fmt.Println(m)
	// Output: map[four:4 two:2]
}</pre></div>



<h4 class="wp-block-heading" id="cmp-paketi"><a href="#cmp-paketi">cmp Paketi</a></h4>



<p>Bu paket Ordered (sıralı) değerler arasında karşılaştırma yapılabilmesini sağlayan <strong><em>Ordered</em></strong> type&#8217;ı ile <em><strong>Compare, Less</strong></em> fonksiyonlarını içerir. Dokümanlara göre <em>Ordered </em>type&#8217;ı &lt;, &lt;=, &gt;= ve &gt; operatörlerini destekleyen tipleri içeren türdür. </p>



<p><em>Compare</em> fonksiyonu ilk parametre ikinciden azsa -1, eşitse 0 ve fazlaysa 1 değerlerini döndürür.</p>



<p><em>Less</em> fonksiyonu ilk parametre ikinci parametreden azsa <em><strong>true</strong></em> değerini döndürür.</p>



<p>Birer örnek vermek gerekirse:</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">package main

import (
	"cmp"
	"fmt"
)

func main() {
	fmt.Print(cmp.Compare(1, 2))
	fmt.Print(cmp.Compare(1, 1))
	fmt.Print(cmp.Compare(2, 1))
	// Output:-101
}</pre></div>



<h3 class="wp-block-heading" id="web-assembly"><a href="#web-assembly">Web Assembly</a></h3>



<p>Ayrıca Go 1.21.0 sürümü ile WebAssembly ortamında Go dilini daha işlevsel ve esnek kullanmak için ilk adımlar atıldı. Dokümana göre özellikle asenkron olaylarda sık sık bloke olan uygulamalarda etkileşim daha verimli hale gelerek WebAssembly ortamında çalışan uygulamalar için performans artabilir.</p>



<p>Eklenen deneysel port ile (GOOS=wasip1, GOARCH=wasm) WebAssembly ortamında WASI (WebAssembly System Interface) kullanılabilir.</p>
<p><a href="https://gorkemarik.com/programlama-dilleri/go/1-21-0/go-1-21-yenilikleri/">Go 1.21 Yenilikleri</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://gorkemarik.com/programlama-dilleri/go/1-21-0/go-1-21-yenilikleri/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>NGINX Nedir ve Nasıl Kullanılır?</title>
		<link>https://gorkemarik.com/web-sunuculari/nginx-nedir-ve-nasil-kullanilir/</link>
					<comments>https://gorkemarik.com/web-sunuculari/nginx-nedir-ve-nasil-kullanilir/#comments</comments>
		
		<dc:creator><![CDATA[Görkem Rıdvan ARIK]]></dc:creator>
		<pubDate>Mon, 17 Jul 2023 18:35:47 +0000</pubDate>
				<category><![CDATA[NGINX]]></category>
		<category><![CDATA[Web Sunucuları]]></category>
		<category><![CDATA[http-server]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[nginx-docker]]></category>
		<category><![CDATA[nginx-kurulum]]></category>
		<category><![CDATA[nginx-nedir]]></category>
		<category><![CDATA[nginx-ubuntu]]></category>
		<category><![CDATA[reverse-proxy]]></category>
		<category><![CDATA[web-server]]></category>
		<category><![CDATA[web-sunucusu]]></category>
		<guid isPermaLink="false">https://gorkemarik.com/?p=79</guid>

					<description><![CDATA[<p>NGINX Nedir? Özellikleri ve faydaları nelerdir? Neden ihtiyaç duyarız? Ubuntu'ya NGINX nasıl kurulur? Docker ile NGINX nasıl kurulur?</p>
<p><a href="https://gorkemarik.com/web-sunuculari/nginx-nedir-ve-nasil-kullanilir/">NGINX Nedir ve Nasıl Kullanılır?</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Merhaba, bu makalede NGINX hakkında bilgi vererek neden ihtiyaç duyduğumuzdan ve ne zaman kullanmamız gerektiğinden bahsedeceğim. Ayrıca sunucu ve Docker olarak 2 farklı ortama kurulumuna ve kullanımına da yer veriyor olacağım.</p>



<h4 class="wp-block-heading">İçindekiler</h4>



<ul class="wp-block-list">
<li><a href="#web-sunucusu-nedir"><strong>1) Web Sunucusu Nedir?</strong></a></li>



<li><strong><a href="#nginx-nedir">2) NGINX Nedir?</a></strong></li>



<li><strong><a href="#neden-nginx-kullaniriz">3) Neden NGINX&#8217;e İhtiyaç Duyarız?</a></strong></li>



<li><strong><a href="#nginx-nasil-kurulur">4) NGINX Nasıl Kurulur?</a></strong></li>



<li><strong><a href="#ubuntu-nginx-kurulumu">4.1) Ubuntu&#8217;ya NGINX Kurulumu</a></strong></li>



<li><strong><a href="#docker-nginx-kurulumu">4.2) Docker Compose ile NGINX Kurulumu</a></strong></li>



<li><strong><a href="#temel-nginx-konfigurasyonlari">5) Temel NGINX Konfigürasyonları</a></strong></li>
</ul>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p></p>



<h3 class="wp-block-heading" id="web-sunucusu-nedir"><a href="#web-sunucusu-nedir"><strong>1) Web Sunucusu Nedir?</strong></a></h3>



<p>NGINX&#8217;in tanımına geçmeden önce web sunucusu kavramının anlaşılması gerekiyor. Örnek üzerinden bakacak olursak tarayıcıdan bir siteye erişmek istediğimizde <strong>istemci</strong> rolünü oynarız. İstemci olarak bir içeriği görüntüleyeceğimiz zaman arka planda web sunucusuna bir <strong>HTTP isteğinde</strong> bulunmuş oluruz. HTTP sunucusu isteği kabul eder (her şey yolunda ise) ve istenilen içeriği <strong>HTTP Yanıtı</strong> olarak geri döner. Temel olarak web sunucu ve istemci arasındaki senaryo bu şekilde olmakla beraber makale konusu NGINX olduğundan dolayı web sunucuları hakkında daha fazla detaya girmeyeceğim. </p>
</div></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="705" height="254" src="https://gorkemarik.com/wp-content/uploads/2023/07/Adsiz-2023-05-11-2135.png" alt="" class="wp-image-356" srcset="https://gorkemarik.com/wp-content/uploads/2023/07/Adsiz-2023-05-11-2135.png 705w, https://gorkemarik.com/wp-content/uploads/2023/07/Adsiz-2023-05-11-2135-300x108.png 300w" sizes="auto, (max-width: 705px) 100vw, 705px" /></figure>
</div>


<h3 class="wp-block-heading" id="nginx-nedir"><strong><a href="#nginx-nedir">2) NGINX Nedir?</a></strong></h3>



<p>NGINX, bir <strong>HTTP sunucusu</strong> olmakla beraber <strong>ters vekil sunucusu (reverse proxy server)</strong>, <strong>HTTP önbelleği</strong>, <strong>yük dengeleyici (load balancer)</strong> ve daha birçok amaç için kullanılabilmektedir. <strong>Igor Sysoev</strong> tarafından <strong>2002 </strong>yılında açık kaynak olarak yazılmıştır ve açık kaynak versiyonunun yanı sıra ek özelliklere sahip olan ücretli versiyonu da bulunmaktadır. Günümüzde en çok kullanılan web sunucuları arasında ilk sıralarda yer almaktadır.</p>



<p>Ağır yük altında yüksek performans, düşük bellek kullanımı ve yüksek eş zamanlı çalışma kabiliyetlerine sahiptir. Linux, Unix, Windows ve Mac OS gibi ortamlarda çalışabilmektedir. Ayrıca <strong>Docker </strong>gibi sanallaştırma teknolojileri ile birlikte de kullanabilirsiniz. </p>



<h3 class="wp-block-heading has-black-color has-text-color" id="neden-nginx-kullaniriz"><strong><a href="#neden-nginx-kullaniriz">3) Neden NGINX&#8217;e İhtiyaç Duyarız?</a></strong></h3>



<p>NGINX&#8217;e alternatif olarak Apache ve IIS gibi farklı birçok web sunucusu bulunmaktadır. Bunlar arasında seçim yaparken ihtiyaçlarınız doğrultusunda karar vererek seçim yapmanız en doğrusu olmakla beraber<strong> yüksek performans, yük dengelemesi, ters proxy, düşük kaynak tüketimi ve esneklik-güvenlik</strong> gibi avantajlarından dolayı NGINX sizin için uygun seçenek olabilir.</p>



<h3 class="wp-block-heading" id="nginx-nasil-kurulur"><strong><a href="#nginx-nasil-kurulur">4) NGINX Nasıl Kurulur?</a></strong></h3>



<p>İhtiyaçlarınız doğrultusunda yukarıda bahsedilen herhangi bir ortamı seçebilirsiniz. Bu anlatımda NGINX&#8217;in <strong>Linux/Ubuntu 22.04</strong> ve <strong>Docker</strong> <strong>Compose</strong> olmak üzere 2 farklı ortama kurulumu anlatılacaktır.</p>



<h4 class="wp-block-heading" id="ubuntu-nginx-kurulumu"><strong><a href="#ubuntu-nginx-kurulumu">4.1) Ubuntu&#8217;ya NGINX Kurulumu</a></strong></h4>



<p>Öncelikle aşağıdaki Linux komutu ile Ubuntu kütüphane bilgisini güncelleyin.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt-get update</pre></div>



<p>Sonra NGINX kurmak için aşağıdaki komutu çalıştırın.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt-get install nginx</pre></div>



<p>Bu komutu çalıştırdıktan sonra size paket bilgilerini sunarak onay isteyecektir. &#8220;Y&#8221; yazıp enter ile ilerleyebilirsiniz.</p>



<p>Komut tamamlandıktan sonra kurulumu doğrulamak için aşağıdaki komutu çalıştırabilirsiniz.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">nginx -v</pre></div>



<p>Aşağıdaki şekilde versiyon bilgisini görebiliyorsanız kurulum başarılı bir şekilde gerçekleşmiş anlamına gelmektedir. </p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">nginx version: nginx/1.18.0 (Ubuntu)</pre></div>



<p>Tarayıcınızda sunucunuzun ip adresini girdiğinizde veya yerel kurulum gerçekleştiriyorsanız <em>locahost</em> adresine gittiğinizde aşağıdaki nginx karşılama ekranını görebilirsiniz.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="543" height="223" src="https://gorkemarik.com/wp-content/uploads/2023/07/Screenshot-2023-07-16-164515-edited-e1689539749758.png" alt="" class="wp-image-358" srcset="https://gorkemarik.com/wp-content/uploads/2023/07/Screenshot-2023-07-16-164515-edited-e1689539749758.png 543w, https://gorkemarik.com/wp-content/uploads/2023/07/Screenshot-2023-07-16-164515-edited-e1689539749758-300x123.png 300w" sizes="auto, (max-width: 543px) 100vw, 543px" /></figure>
</div>


<h4 class="wp-block-heading" id="docker-nginx-kurulumu"><strong><a href="#docker-nginx-kurulumu">4.2) Docker Compose ile NGINX Kurulumu</a></strong></h4>



<p>Sunucunuzda Docker&#8217;ın yüklü olduğunu varsayarak direkt Docker Compose dosyasının hazırlanma ve ayağa kaldırma konularını anlatıyor olacağım. </p>



<p>İlk adım olarak istediğiniz dizinde docker-compose.yml adında bir dosya oluşturun.</p>



<p>Oluşturmuş olduğunuz dosyayı düzenlemek için açın ve içine aşağıdaki konfigürasyonu ekleyin.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">version: '3.8'
services:
  nginx:
    container_name: webserver
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./logs:/var/log/nginx</pre></div>



<p>Bu yml dosyası ile 80 portunu ana makinamızdaki 80 portu ile port mapping gerçekleştirerek iliştirdik. Ayrıca nginx konfigürasyonunu gerçekleştireceğimiz conf.d klasörünü docker-compose.yml dosyamızın bulunduğu konuma; log&#8217;ları kaydedeceğimiz klasörü de yine aynı konuma volume mapping işlemi ile iliştirdik.</p>



<p>Aşağıdaki Docker komutunu çalıştırınca tıpkı Ubuntu kurulumundaki gibi sunucu ip adresinize veya localhost adresinize tarayıcıdan eriştiğinizde NGINX varsayılan karşılama sayfasını göreceksiniz.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">docker compose up</pre></div>



<h3 class="wp-block-heading" id="temel-nginx-konfigurasyonlari"><strong><a href="#temel-nginx-konfigurasyonlari">5) Temel NGINX Konfigürasyonları</a></strong></h3>



<p>Bu örnekte temel olarak Docker container&#8217;da 8081 portunda çalışan bir uygulama olduğunu varsayarak adrese gelen istekleri bu uygulamaya yönlendiriyor olacağım.</p>



<p>Ubuntu sunucu için <em>/etc/nginx/conf.d</em> konumuna; Docker&#8217;a kurduysanız <em>./conf.d</em> konumuna <em>nginx.conf</em> adında bir dosya oluşturun. Ardından dosyayı düzenleyerek aşağıdaki şekile getirin. </p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">server {
	listen 80;
	server_name localhost; #alan adı
	
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	location / {
          proxy_set_header Client-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $host;
	  proxy_pass http://127.01.0.1:8081;
	}
}</pre></div>



<p>Bu konfigürasyon dosyasında <em><strong>listen 80;</strong></em> satırı ile 80 portunu dinliyoruz. <strong><em>server_name</em> </strong>değerine alan adını yazmalısınız (Örn: <em><strong>my_domain</strong>.com</em>). <strong><em>access_log</em> </strong>ve <strong><em>error_log</em> </strong>kısımları ile log dosyalarının konumlarını belirttik. <strong><em>acces_log</em> </strong>istekte bulunanların kullanıcı aracısı metni (user agent) ile beraber sunucunun döndüğü yanıt gibi bilgileri tutarken <strong><em>error_log</em> </strong>gelen isteklerde oluşan hataları tutar. </p>



<p><strong><em>location</em> </strong>bloğu içerisinde <strong><em>proxy_pass</em> </strong>ile <em><strong>my_domain</strong>.com</em> adresine gelen istekleri Docker container&#8217;ındaki 8081 portunda çalışan uygulamaya yönlendiriyoruz. Böylece kullanıcı tarayıcıdan <em><strong>my_domain.</strong></em><strong><em>com</em> </strong>adresine istekte bulunduğunda sunucuda çalışan Docker container&#8217;ına yönlendirme yapılacaktır.</p>



<p>Örneğin burada <em><strong>location /api {&#8230;</strong></em> şeklinde bir yol izleseydik <em><strong>my_domain.com/api</strong></em> adresine gelen istekleri Docker container&#8217;ına yönlendirmiş olacaktık.</p>



<p>İşlemleri gerçekleştirdikten sonra dosyayı kaydettiğinizden emin olun ve konfigürasyon dosyasının hatasız olup olmadığını kontrol etmek için linux terminalinde aşağıdaki komutu çalıştırın.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">nginx -t</pre></div>



<p>Yukarıdaki komutun çıktısı aşağıdaki gibi ise her şey yolunda demektir:</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful</pre></div>



<p>Konfigürasyon dosyamızın hatasız olduğundan emin olduktan sonra yaptığımız değişikliklerin geçerli olması için nginx servisini yeniden başlatmamız gerekiyor. Bunu aşağıdaki linux komutu ile gerçekleştirebiliriz.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">systemctl restart nginx</pre></div>



<p>Bu koddan herhangi bir çıktı beklemiyoruz. Yeniden başlatma sırasında bir hata çıkarsa tek çıktı o olacaktır. Son olarak NGINX servisinin durumunu sorgulamak için aşağıdaki komutu kullanabiliriz.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">systemctl status nginx</pre></div>



<p>Bu komutun çıktısında <em>Active: active (running) </em>satırı yer alıyorsa tüm işlemler başarılı bir şekilde gerçekleşmiş demektir. Bununla birlikte reverse proxy işlemimizi tamamlamış olduk ve alan adına atılan istekler konfigürasyon dosyası içerisinde tanımladığımız 8081 portuna yönlendirilecektir. Daha detaylı bilgi için <a href="https://docs.nginx.com/" target="_blank" rel="noreferrer noopener">NGINX Resmi Dokümanlarını</a> inceleyebilirsiniz.</p>



<p>Bu makalede web sunucusunun ne olduğuna, bir web sunucusu olan NGINX&#8217;e neden ihtiyacımız olduğuna, bize ne gibi avantajlar sağladığına, Ubuntu sunucu ve Docker container olmak üzere 2 farklı ortama kurulum aşamalarına ve temel olarak bir örnek üzerinden kullanımının nasıl olduğuna değindim. Faydalı olması dileği ile.</p>
<p><a href="https://gorkemarik.com/web-sunuculari/nginx-nedir-ve-nasil-kullanilir/">NGINX Nedir ve Nasıl Kullanılır?</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://gorkemarik.com/web-sunuculari/nginx-nedir-ve-nasil-kullanilir/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
