Ana Sayfa / Yazılım / Nginx ile Reverse Proxy Nasıl Kurulur ?

Nginx ile Reverse Proxy Nasıl Kurulur ?

Nginx ile reverse proxy kurarak sitenizin hızına hız katabilir ve sayfalarınızın cachelenmesi daha düzgün bir hale getirebilirsiniz. Nginx, Varnish veya Squid gibi diğer reverse proxy sunuculara göre çok daha basit ve anlaşılması daha kolay bir konfigürasyona sahiptir. Diğer reverse proxylerden daha hızlı olup olmadığı soru işareti olsa da bizce önemli olan kolay ayarlanabilir olmasıdır. Eğer reverse proxynin işleyiş mantığını anlamazsanız Varnish, Squid ya da Nginx de her zaman problem yaşarsınız.

Nginx İle Reverse Proxy Centos’da Nasıl Kurulur ?

Sıfırdan başlayacak olursak Centos’da sourcedan compile etmekle uğraşmayıp, aşağıdaki şekilde Nginx’i 2 saniyede kurabiliriz. Source’dan compile etmenin avantajı her zaman en son Nginx sürümünü kullanmak olsa da bu makalede bu işleme girmiyoruz. Nginx ile reverse proxy kurmak için ilk adım:

Nginx Kurulumu

yum install epel-release yum install nginx
1
2
yum install epel-release
yum install nginx

Kurulum işlemi tamamlandıktan sonra konfigürasyon dosyalarına el atmamız gerekiyor. Nano ya da vi gibi bir editörle Nginx’in kendi ayarlarına girelim.

Nginx Config Dosyası

nano /etc/nginx/nginx.conf
1
nano /etc/nginx/nginx.conf

Konfigürasyon dosyasında önemli bir çok parametre olsa da konumuz reverse proxy olduğu için her bir parametreyi açıklamak yerine standart ve basit bir dosya paylaşmayı uygun görüyoruz çünkü asıl ayarlarımızı farklı bir dosya üzerinde yapmamız gerekiyor.

Nginx default config dosyası

user nginx; worker_processes 8; worker_rlimit_nofile 20480; #error_log /var/log/nginx/error.log; #error_log /var/log/nginx/error.log notice; #error_log /var/log/nginx/error.log info; pid /var/run/nginx.pid; events http
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
user              nginx;
worker_processes  8;
worker_rlimit_nofile 20480;
 
#error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;
 
pid        /var/run/nginx.pid;
 
events
 
http

Yukarıda paylaştığımız dosyada worker_process Nginx’in aynı anda kaç tane CPU’yu kullanabileceğini belirtmektedir. Bunu Nginx’in kurulu olduğu sunucunuza göre değiştirmelisiniz. Alttaki komut kaç tane CPU’nuz olduğunuzu gösterir.

Kaç CPU var?

grep ^processor /proc/cpuinfo | wc -l
1
grep ^processor /proc/cpuinfo | wc -l

Bunun dışındaki diğer tüm ayarlarla oynamak size kalmış. Örneğin error logları açmak isteyebilir ve GZIP ayarlarını değiştirmek isteyebilirsiniz. Daha önce dediğimiz gibi asıl konumuz bu ayarlar olmadığı için işlem yapacağımız konfigürasyon dosyasını anlatacağız.

Reverse Proxy Ne İşe Yarar ?

Yukarıda Nginx’i sadece Centos’a kurduk ve bir kaç ayarını değiştirdik. Biraz sonra nginx ile reverse proxy yapabilmek için ayarlarının nasıl yapılacağına geçeceğiz fakat öncelikle reverse proxy’nin ne işe yaradığını anlatmamız daha doğru olacaktır. Eğer mantığı kavramazsanız aklınıza hiç gelmeyecek yüzlerce problemle karşılaşabilirsiniz.
Reverse proxy ile temel amaç bir sayfanın cachelenmiş halini son kullanıcıya sunmaktır. Bir WordPress sitesi üzerinden örnek verecek olursak; bir sitenin sayfaları oluşturulurken veritabanından alınan bilgiler ışığında sayfa render edilir. Bu site örneğin Apache üzerinde çalışıyorsa, her gelen kullanıcı için bir PHP process Apache tarafından yaratılır. Sayfalarınızdaki kullanıcı sayısı arttıkça işlemler (processler) fazlalaşır ve kullandığınız sunucu üzerindeki yük gittikçe artar.
Reverse proxy’nin amacı bir kere yaratılmış bir sayfanın bu işlemlere tekrar tabi tutulmadan cacheden gelmesini sağlamak ve böylelik performansı arttırmaktır. Mesela bu okumuş olduğunuz makalenin sürekli değişmesi olası bir şey olmadığından bu sayfayı belli bir süreliğine cachede tutmak mantıklıdır. Her defasında veritabanına ne oldu diye sorgu atmak ve sonucu render etmekle uğraşan bir process yaratmak pek de performans açısından doğru değildir. Makale değil de sürekli değişen, yani dinamik bir sayfanın cachelenmesi ise pek uygun değildir.
Bu çerçeveden bakılırsa reverse proxy konfigürasyonu hangi sayfaların ne kadar süreliğine cachelenmesi ya da hiç cachelenmeden ana sunucudan sayfanın getirilmesi üzerine kurgulanır.

Nginx ile Reverse Proxy Yapmak İçin Backend Ayarları

Bir site Apache sunucunun (Apache yerine tabi bu IIS yada NGINX de tabi olabilir) 80 portundan kullanıcıya cevap veriyorsa önce bu port farklı bir portla değiştirilir ki reverse proxy sunucusu 80’den kullanıcılara cevap verebilsin. Reverse proxy Apache’ye atadığınız yeni portdan sayfaları talep eder. Aşağıdaki konfigürasyona geçmeden önce Apache sunucunuzun 80 yerine 82 portundan cevap vermesi için httpd.conf dosyanızı değiştirip apacheyi restart edin.

Nginx İle Reverse Proxy Yapmak İçin Virtual.Conf Ayarı

Aşağıdaki konfigürasyon dosyası bir WordPress sitesini cachelemek için yaratılmıştır. Sırasıyla şu işlemleri yaptığımız zaman Nginx ile gelen konfigürasyonları uçurup, nginx ile reverse proxy kurulumu için gerekli konfigürasyonu oluşturacağız:

Nginx’in default dosyalarını uçuralım

rm /etc/nginx/conf.d/default.conf rm /etc/nginx/conf.d/virtual.conf nano /etc/nginx/conf.d/virtual.conf
1
2
3
rm /etc/nginx/conf.d/default.conf
rm /etc/nginx/conf.d/virtual.conf
nano /etc/nginx/conf.d/virtual.conf

Virtual.conf dosyasını ayarlayalım:

WordPress için yaratılmış bir Nginx Virtual.conf

proxy_cache_path /home/nginxcache levels=1:2 keys_zone=my_zone:120m max_size=5G inactive=1M; #Nginx cache dosyalarının nereye ve ne kadar süreliğine yazılacağını belirtir. server if ($query_string != “”) # Sonuçta bir wordpress sayfasının admin sayfalarını niye cacheyelim ki? if ($request_uri ~* “/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml”) # Aşağıdaki cookieler varsa da cachelemek pek doğru değil değil mi? if ($http_cookie ~* “comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_log ged_in”) proxy_cache my_zone; add_header X-Proxy-Cache $upstream_cache_status; proxy_set_header Host www.sayfam.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header X-Proxy-Serve SAYFAM; # Bu headerı test etmek için kullanıyoruz. proxy_pass http://localhost:82; # Gelen istekler aslında 82 nolu porttaki Apache’den cevaplanıyor. proxy_cache_valid 200 301 302 3m; # 200 301 ve 302 cevaplarımız 3 dakikalığına cacheleniyor. proxy_cache_valid 404 1m; #404 ise 1 dk proxy_cache_bypass $skip_cache; #Yukarıda skip_cache 1 olursa Nginx hiç cachelemez. proxy_cache_bypass $http_pragma $http_authorization; # Bu ayarla sayfaların headerlarından da kaç dk cache atılması belirtilebilir. proxy_cache_key “$scheme$request_method$host$request_uri”; } error_page 403 500 502 503 504 /500.html; location = /500.html location ~ ^/(wp-admin|wp-login\.php) }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
proxy_cache_path /home/nginxcache levels=1:2 keys_zone=my_zone:120m max_size=5G inactive=1M; #Nginx cache dosyalarının nereye ve ne kadar süreliğine yazılacağını belirtir.
 
 
server
 
        if ($query_string != “”)
# Sonuçta bir wordpress sayfasının admin sayfalarını niye cacheyelim ki?
        if ($request_uri ~* “/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml”)
 
# Aşağıdaki cookieler varsa da cachelemek pek doğru değil değil mi?
        if ($http_cookie ~* “comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_log
ged_in”)
 
        proxy_cache my_zone;
        add_header X-Proxy-Cache $upstream_cache_status;
proxy_set_header Host www.sayfam.com;
proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Proxy-Serve SAYFAM; # Bu headerı test etmek için kullanıyoruz.
        proxy_pass http://localhost:82; # Gelen istekler aslında 82 nolu porttaki Apache’den cevaplanıyor.
proxy_cache_valid 200 301 302 3m; # 200 301 ve 302 cevaplarımız 3 dakikalığına cacheleniyor.
proxy_cache_valid 404 1m; #404 ise 1 dk
proxy_cache_bypass  $skip_cache; #Yukarıda skip_cache 1 olursa Nginx hiç cachelemez.
proxy_cache_bypass $http_pragma $http_authorization; # Bu ayarla  sayfaların headerlarından da kaç dk cache atılması belirtilebilir.
proxy_cache_key “$scheme$request_method$host$request_uri”;
    }
 
      error_page 403 500 502 503 504  /500.html;
      location = /500.html
 
       location ~ ^/(wp-admin|wp-login\.php)
}

Yukarıdaki konfigürasyon dosyasının yorum satırlarından da anlaşabileceği gibi temel amaç gelen istekleri 82 portuna yönlendirmek ve 82’den gelen cevapların da hangilerinin cachelenip hangilerinin cachelenmemesi gerektiğine karar vermektir. Bu dosyayı kaydettikten sonra aşağıdaki komutu çalıştırdığımız zaman Nginx artık reverse proxy olarak çalışmaya başlar. IPTables’den 82 nolu portun dışarıya kapalı olduğuna emin olun yoksa hem 80 hem de 82 nolu portlarda sayfanız ulaşılır olur ki bu da SEO açısından negatif sonuçlar doğurabilir.

service nginx start
1
service nginx start

Yukarıdaki konfigürasyona göre birşeyler cacheleniyorsa aşağıdaki klasörün büyüklüğü file cache yaptığımız için artacaktır:

/home/nginxcache
1
/home/nginxcache

Konfigürasyonu test etmenin en basit yollarından biri HTTP Spy gibi bir extension’ı Chrome’a yükleyip, headerları incelemektedir. Herhangi bir sayfa Nginx’de cachelenmiş ise header’da HIT, eğer cachede yoksa MISS, konfigürasyona göre cachelenmemesi gereken wp-admin tarzı bir path is BYPASS tarzı cevaplar header’da görülecektir.

Teknoloji

Nginx ile reverse proxy kurarak sitenizin hızına hız katabilir ve sayfalarınızın cachelenmesi daha düzgün bir hale getirebilirsiniz. Nginx, Varnish veya Squid gibi diğer reverse proxy sunuculara göre çok daha basit ve anlaşılması daha kolay bir konfigürasyona sahiptir. Diğer reverse proxylerden daha hızlı olup olmadığı soru işareti olsa da bizce önemli olan kolay ayarlanabilir olmasıdır. Eğer reverse proxynin işleyiş mantığını anlamazsanız Varnish, Squid ya da Nginx de her zaman problem yaşarsınız.

Nginx İle Reverse Proxy Centos’da Nasıl Kurulur ?

Sıfırdan başlayacak olursak Centos’da sourcedan compile etmekle uğraşmayıp, aşağıdaki şekilde Nginx’i 2 saniyede kurabiliriz. Source’dan compile etmenin avantajı her zaman en son Nginx sürümünü kullanmak olsa da bu makalede bu işleme girmiyoruz. Nginx ile reverse proxy kurmak için ilk adım:

Nginx Kurulumu

yum install epel-release yum install nginx
1
2
yum install epel-release
yum install nginx

Kurulum işlemi tamamlandıktan sonra konfigürasyon dosyalarına el atmamız gerekiyor. Nano ya da vi gibi bir editörle Nginx’in kendi ayarlarına girelim.

Nginx Config Dosyası

nano /etc/nginx/nginx.conf
1
nano /etc/nginx/nginx.conf

Konfigürasyon dosyasında önemli bir çok parametre olsa da konumuz reverse proxy olduğu için her bir parametreyi açıklamak yerine standart ve basit bir dosya paylaşmayı uygun görüyoruz çünkü asıl ayarlarımızı farklı bir dosya üzerinde yapmamız gerekiyor.

Nginx default config dosyası

user nginx; worker_processes 8; worker_rlimit_nofile 20480; #error_log /var/log/nginx/error.log; #error_log /var/log/nginx/error.log notice; #error_log /var/log/nginx/error.log info; pid /var/run/nginx.pid; events http
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
user              nginx;
worker_processes  8;
worker_rlimit_nofile 20480;
 
#error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;
 
pid        /var/run/nginx.pid;
 
events
 
http

Yukarıda paylaştığımız dosyada worker_process Nginx’in aynı anda kaç tane CPU’yu kullanabileceğini belirtmektedir. Bunu Nginx’in kurulu olduğu sunucunuza göre değiştirmelisiniz. Alttaki komut kaç tane CPU’nuz olduğunuzu gösterir.

Kaç CPU var?

grep ^processor /proc/cpuinfo | wc -l
1
grep ^processor /proc/cpuinfo | wc -l

Bunun dışındaki diğer tüm ayarlarla oynamak size kalmış. Örneğin error logları açmak isteyebilir ve GZIP ayarlarını değiştirmek isteyebilirsiniz. Daha önce dediğimiz gibi asıl konumuz bu ayarlar olmadığı için işlem yapacağımız konfigürasyon dosyasını anlatacağız.

Reverse Proxy Ne İşe Yarar ?

Yukarıda Nginx’i sadece Centos’a kurduk ve bir kaç ayarını değiştirdik. Biraz sonra nginx ile reverse proxy yapabilmek için ayarlarının nasıl yapılacağına geçeceğiz fakat öncelikle reverse proxy’nin ne işe yaradığını anlatmamız daha doğru olacaktır. Eğer mantığı kavramazsanız aklınıza hiç gelmeyecek yüzlerce problemle karşılaşabilirsiniz.
Reverse proxy ile temel amaç bir sayfanın cachelenmiş halini son kullanıcıya sunmaktır. Bir WordPress sitesi üzerinden örnek verecek olursak; bir sitenin sayfaları oluşturulurken veritabanından alınan bilgiler ışığında sayfa render edilir. Bu site örneğin Apache üzerinde çalışıyorsa, her gelen kullanıcı için bir PHP process Apache tarafından yaratılır. Sayfalarınızdaki kullanıcı sayısı arttıkça işlemler (processler) fazlalaşır ve kullandığınız sunucu üzerindeki yük gittikçe artar.
Reverse proxy’nin amacı bir kere yaratılmış bir sayfanın bu işlemlere tekrar tabi tutulmadan cacheden gelmesini sağlamak ve böylelik performansı arttırmaktır. Mesela bu okumuş olduğunuz makalenin sürekli değişmesi olası bir şey olmadığından bu sayfayı belli bir süreliğine cachede tutmak mantıklıdır. Her defasında veritabanına ne oldu diye sorgu atmak ve sonucu render etmekle uğraşan bir process yaratmak pek de performans açısından doğru değildir. Makale değil de sürekli değişen, yani dinamik bir sayfanın cachelenmesi ise pek uygun değildir.
Bu çerçeveden bakılırsa reverse proxy konfigürasyonu hangi sayfaların ne kadar süreliğine cachelenmesi ya da hiç cachelenmeden ana sunucudan sayfanın getirilmesi üzerine kurgulanır.

Nginx ile Reverse Proxy Yapmak İçin Backend Ayarları

Bir site Apache sunucunun (Apache yerine tabi bu IIS yada NGINX de tabi olabilir) 80 portundan kullanıcıya cevap veriyorsa önce bu port farklı bir portla değiştirilir ki reverse proxy sunucusu 80’den kullanıcılara cevap verebilsin. Reverse proxy Apache’ye atadığınız yeni portdan sayfaları talep eder. Aşağıdaki konfigürasyona geçmeden önce Apache sunucunuzun 80 yerine 82 portundan cevap vermesi için httpd.conf dosyanızı değiştirip apacheyi restart edin.

Nginx İle Reverse Proxy Yapmak İçin Virtual.Conf Ayarı

Aşağıdaki konfigürasyon dosyası bir WordPress sitesini cachelemek için yaratılmıştır. Sırasıyla şu işlemleri yaptığımız zaman Nginx ile gelen konfigürasyonları uçurup, nginx ile reverse proxy kurulumu için gerekli konfigürasyonu oluşturacağız:

Nginx’in default dosyalarını uçuralım

rm /etc/nginx/conf.d/default.conf rm /etc/nginx/conf.d/virtual.conf nano /etc/nginx/conf.d/virtual.conf
1
2
3
rm /etc/nginx/conf.d/default.conf
rm /etc/nginx/conf.d/virtual.conf
nano /etc/nginx/conf.d/virtual.conf

Virtual.conf dosyasını ayarlayalım:

WordPress için yaratılmış bir Nginx Virtual.conf

proxy_cache_path /home/nginxcache levels=1:2 keys_zone=my_zone:120m max_size=5G inactive=1M; #Nginx cache dosyalarının nereye ve ne kadar süreliğine yazılacağını belirtir. server if ($query_string != “”) # Sonuçta bir wordpress sayfasının admin sayfalarını niye cacheyelim ki? if ($request_uri ~* “/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml”) # Aşağıdaki cookieler varsa da cachelemek pek doğru değil değil mi? if ($http_cookie ~* “comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_log ged_in”) proxy_cache my_zone; add_header X-Proxy-Cache $upstream_cache_status; proxy_set_header Host www.sayfam.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header X-Proxy-Serve SAYFAM; # Bu headerı test etmek için kullanıyoruz. proxy_pass http://localhost:82; # Gelen istekler aslında 82 nolu porttaki Apache’den cevaplanıyor. proxy_cache_valid 200 301 302 3m; # 200 301 ve 302 cevaplarımız 3 dakikalığına cacheleniyor. proxy_cache_valid 404 1m; #404 ise 1 dk proxy_cache_bypass $skip_cache; #Yukarıda skip_cache 1 olursa Nginx hiç cachelemez. proxy_cache_bypass $http_pragma $http_authorization; # Bu ayarla sayfaların headerlarından da kaç dk cache atılması belirtilebilir. proxy_cache_key “$scheme$request_method$host$request_uri”; } error_page 403 500 502 503 504 /500.html; location = /500.html location ~ ^/(wp-admin|wp-login\.php) }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
proxy_cache_path /home/nginxcache levels=1:2 keys_zone=my_zone:120m max_size=5G inactive=1M; #Nginx cache dosyalarının nereye ve ne kadar süreliğine yazılacağını belirtir.
 
 
server
 
        if ($query_string != “”)
# Sonuçta bir wordpress sayfasının admin sayfalarını niye cacheyelim ki?
        if ($request_uri ~* “/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml”)
 
# Aşağıdaki cookieler varsa da cachelemek pek doğru değil değil mi?
        if ($http_cookie ~* “comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_log
ged_in”)
 
        proxy_cache my_zone;
        add_header X-Proxy-Cache $upstream_cache_status;
proxy_set_header Host www.sayfam.com;
proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Proxy-Serve SAYFAM; # Bu headerı test etmek için kullanıyoruz.
        proxy_pass http://localhost:82; # Gelen istekler aslında 82 nolu porttaki Apache’den cevaplanıyor.
proxy_cache_valid 200 301 302 3m; # 200 301 ve 302 cevaplarımız 3 dakikalığına cacheleniyor.
proxy_cache_valid 404 1m; #404 ise 1 dk
proxy_cache_bypass  $skip_cache; #Yukarıda skip_cache 1 olursa Nginx hiç cachelemez.
proxy_cache_bypass $http_pragma $http_authorization; # Bu ayarla  sayfaların headerlarından da kaç dk cache atılması belirtilebilir.
proxy_cache_key “$scheme$request_method$host$request_uri”;
    }
 
      error_page 403 500 502 503 504  /500.html;
      location = /500.html
 
       location ~ ^/(wp-admin|wp-login\.php)
}

Yukarıdaki konfigürasyon dosyasının yorum satırlarından da anlaşabileceği gibi temel amaç gelen istekleri 82 portuna yönlendirmek ve 82’den gelen cevapların da hangilerinin cachelenip hangilerinin cachelenmemesi gerektiğine karar vermektir. Bu dosyayı kaydettikten sonra aşağıdaki komutu çalıştırdığımız zaman Nginx artık reverse proxy olarak çalışmaya başlar. IPTables’den 82 nolu portun dışarıya kapalı olduğuna emin olun yoksa hem 80 hem de 82 nolu portlarda sayfanız ulaşılır olur ki bu da SEO açısından negatif sonuçlar doğurabilir.

service nginx start
1
service nginx start

Yukarıdaki konfigürasyona göre birşeyler cacheleniyorsa aşağıdaki klasörün büyüklüğü file cache yaptığımız için artacaktır:

/home/nginxcache
1
/home/nginxcache

Konfigürasyonu test etmenin en basit yollarından biri HTTP Spy gibi bir extension’ı Chrome’a yükleyip, headerları incelemektedir. Herhangi bir sayfa Nginx’de cachelenmiş ise header’da HIT, eğer cachede yoksa MISS, konfigürasyona göre cachelenmemesi gereken wp-admin tarzı bir path is BYPASS tarzı cevaplar header’da görülecektir.

Hakkında Bilenesoralim

Check Also

Veritabanı Nedir ve Ne Amaçla Kullanılır?

Veritabanı Nedir ve Ne Amaçla Kullanılır?

Veritabanları bilgileri depolamak ve yönetmek için kullanılan sistemlerdir. Veritabanlarını düzenli bilgiler topluluğu olarak adlandırabiliriz. Bilgileri …

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir