Nginx’i Ubuntu 14.04 Üzerinde Apache için Bir Web Sunucusu ve Ters Proxy Olarak Yapılandırma
Web sunucusu mimarileri, performans ve ölçeklenebilirlik ihtiyaçlarına göre sürekli evrim geçirmektedir. Tek bir sunucu üzerinde bile, farklı web sunucusu yazılımlarının güçlü yönlerini birleştirerek önemli avantajlar elde edilebilir. Bu makalede, Ubuntu 14.04 işletim sistemi yüklü bir sunucuda (droplet), Nginx’i hem statik içerik sunucusu hem de Apache için bir ters proxy (reverse proxy) olarak nasıl yapılandıracağımızı adım adım inceleyeceğiz. Bu yapılandırma, özellikle yüksek trafikli siteler için performansı artırma, kaynak tüketimini optimize etme ve daha esnek bir mimari oluşturma potansiyeli sunar.
Neden Nginx ve Apache Birlikte Kullanılmalı?
Nginx ve Apache, her ikisi de dünya genelinde yaygın olarak kullanılan güçlü web sunucusu yazılımlarıdır. Ancak her birinin kendine özgü güçlü yönleri ve kullanım senaryoları vardır:
* Nginx’in Güçlü Yönleri:
* Performans ve Eşzamanlı Bağlantılar: Nginx, olay tabanlı (event-driven) mimarisi sayesinde yüksek sayıda eşzamanlı bağlantıyı düşük bellek ve CPU tüketimiyle işleyebilir. Özellikle statik dosyaların (HTML, CSS, JavaScript, resimler vb.) sunumunda Apache’den çok daha hızlıdır.
* Ters Proxy Yetenekleri: Nginx, ters proxy, yük dengeleyici (load balancer) ve HTTP önbellek sunucusu olarak mükemmel yeteneklere sahiptir.
* Düşük Kaynak Tüketimi: Daha az bellek ve CPU kullanarak yüksek performans sunar.
* Apache’nin Güçlü Yönleri:
* Modül Zenginliği ve Esneklik: Apache, geniş bir modül ekosistemine sahiptir (mod_php, mod_rewrite vb.) ve dinamik içerik işleme konusunda son derece esnektir.
* Olgunluk ve Topluluk Desteği: Yıllardır geliştirilen ve geniş bir kullanıcı kitlesine sahip olan Apache, çok sayıda dokümantasyon ve topluluk desteği sunar.
* Dinamik İçerik İşleme: PHP, Python, Ruby gibi dillerle yazılmış web uygulamalarını çalıştırmak için hala tercih edilen güçlü bir platformdur.
Bu iki sunucuyu bir araya getirerek, Nginx’i hızlı bir ön uç (frontend) olarak kullanarak statik içerikleri verimli bir şekilde sunabilir, gelen tüm istekleri filtreleyebilir ve sadece dinamik içerik gerektiren istekleri Apache’ye yönlendirebiliriz. Bu sayede Apache’nin kaynakları sadece dinamik içerik işleme için kullanılır, bu da genel performansı ve sunucu kararlılığını artırır.
Ön Gereksinimler
Bu yapılandırmaya başlamadan önce aşağıdaki ön gereksinimlere sahip olduğunuzdan emin olun:
* Ubuntu 14.04 Droplet/Sunucu: Bu makale özellikle Ubuntu 14.04 üzerine odaklanmıştır. Temel prensipler diğer Debian tabanlı sistemler için de geçerli olsa da, komutlar ve dosya yolları farklılık gösterebilir.
* Sudo Yetkileri: Sunucuda root veya sudo yetkilerine sahip bir kullanıcı.
* Temel Linux Komut Bilgisi: Dosya düzenleme, servis yönetimi gibi temel komutlara aşinalık.
* Apache2 Kurulumu: Sunucunuzda Apache2’nin kurulu ve çalışır durumda olması gerekmektedir. Eğer kurulu değilse, aşağıdaki komutlarla kurabilirsiniz:
sudo apt-get update
sudo apt-get install apache2
* Alan Adı: Yapılandırma için bir alan adına sahip olmanız ve DNS kayıtlarının sunucunuzun IP adresine yönlendirilmiş olması önerilir. Bu makalede example.com alan adını kullanacağız.
Adım 1: Apache’yi Hazırlama
Nginx, varsayılan olarak 80 (HTTP) ve 443 (HTTPS) portlarını dinleyecektir. Bu nedenle, Apache’nin bu portları kullanmasını engellemek için dinleme portunu değiştirmemiz gerekmektedir. Apache’yi genellikle 8080 veya 8000 gibi farklı bir porta yönlendireceğiz. Bu sayede Nginx, gelen tüm web trafiğini karşılayacak ve dinamik içerik isteklerini Apache’ye iletecektir.
Apache Dinleme Portunu Değiştirme
Apache’nin dinlediği portu değiştirmek için iki ana yapılandırma dosyasını düzenlememiz gerekir:
1. /etc/apache2/ports.conf: Bu dosya, Apache’nin hangi portları dinleyeceğini global olarak tanımlar.
Bir metin düzenleyici ile dosyayı açın:
sudo nano /etc/apache2/ports.conf
Dosya içinde Listen 80 satırını bulup Listen 8080 olarak değiştirin (veya istediğiniz başka bir port). Eğer Listen 443 satırı varsa, SSL yapılandırması Nginx tarafından yapılacaksa bunu da değiştirebilirsiniz, ancak şimdilik 80 portuna odaklanalım.
Değişiklik sonrası dosya içeriği aşağıdaki gibi görünebilir (önemli kısımlar):
# If you just change the port that Apache is listening on here,
# you will also need to change any VirtualHost statement that
# uses a port number.
#
Listen 8080
Listen 443
Listen 443
2. Sanal Host Yapılandırması: Apache’nin sanal host yapılandırmasını da güncellemeli, böylece yeni port üzerinden dinleme yapar. Varsayılan sanal host dosyası genellikle /etc/apache2/sites-available/000-default.conf‘tur.
Dosyayı açın:
sudo nano /etc/apache2/sites-available/000-default.conf
Dosya içinde :80> satırını bulup :8080> olarak değiştirin.
Örnek:
# ... diğer yapılandırmalar ...
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# ...
Eğer başka sanal host dosyalarınız varsa (örneğin example.com.conf), aynı değişikliği onlar için de yapmalısınız.
Apache’yi Yeniden Başlatma ve Test Etme
Yapılandırma değişikliklerini uygulamak için Apache servisini yeniden başlatın:
sudo service apache2 restart
Apache’nin yeni port üzerinden dinleyip dinlemediğini kontrol etmek için netstat komutunu kullanabilirsiniz:
sudo netstat -tulnp | grep apache2
Çıktıda 0.0.0.0:8080 veya 127.0.0.1:8080 gibi bir satır görmelisiniz.
Şimdi, tarayıcınızdan sunucunuzun IP adresini ve yeni portu kullanarak Apache’ye doğrudan erişmeyi deneyin (örn. http://sunucu_ip_adresi:8080). Apache’nin varsayılan “It works!” sayfası veya sitenizin içeriği görünmelidir.
Adım 2: Nginx Kurulumu
Apache’yi hazırladıktan sonra, Nginx’i kurmaya geçebiliriz.
Nginx Paketlerini Yükleme
Öncelikle paket listesini güncelleyin ve Nginx’i yükleyin:
sudo apt-get update
sudo apt-get install nginx
Kurulum tamamlandıktan sonra Nginx servisi otomatik olarak başlayacaktır.
Nginx Servis Durumunu Kontrol Etme
Nginx’in çalışıp çalışmadığını kontrol etmek için:
sudo service nginx status
Çıktıda nginx is running veya benzer bir ifade görmelisiniz.
Güvenlik Duvarı Ayarları (UFW)
Ubuntu 14.04’te UFW (Uncomplicated Firewall) kullanıyorsanız, Nginx’in web trafiği alabilmesi için 80 (HTTP) ve isteğe bağlı olarak 443 (HTTPS) portlarına izin vermeniz gerekir.
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS' # Eğer HTTPS kullanacaksanız
sudo ufw enable # Eğer UFW etkin değilse etkinleştirin
sudo ufw status # Ayarlarınızı kontrol edin
Şimdi tarayıcınızdan sunucunuzun IP adresini yazarak Nginx’in varsayılan karşılama sayfasını görmelisiniz. Eğer görüyorsanız, Nginx başarıyla kurulmuş ve çalışıyor demektir.
Adım 3: Nginx’i Ters Proxy Olarak Yapılandırma
Bu adımda, Nginx’i example.com alan adı için bir ters proxy olarak yapılandıracağız. Nginx, 80 numaralı porttan gelen istekleri karşılayacak ve bu istekleri Apache’nin 8080 numaralı portuna yönlendirecektir.
Yeni Bir Nginx Sunucu Bloğu Oluşturma
Nginx yapılandırmaları /etc/nginx/sites-available/ dizininde bulunur. Yeni bir yapılandırma dosyası oluşturalım:
sudo nano /etc/nginx/sites-available/example.com.conf
Dosyanın içine aşağıdaki içeriği ekleyin. Bu yapılandırma, tüm gelen istekleri Apache’ye yönlendirecektir:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 90;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
Yapılandırma Açıklamaları:
* listen 80;: Nginx’in 80 numaralı porttan gelen HTTP isteklerini dinlemesini sağlar.
* server_name example.com www.example.com;: Bu sunucu bloğunun hangi alan adları için geçerli olduğunu belirtir. Kendi alan adınızı buraya yazın.
* access_log ve error_log: Bu sunucu bloğuna özel erişim ve hata günlüklerinin kaydedileceği yerleri belirtir.
* location / { ... }: Bu blok, tüm gelen istekleri (/ ile başlayan her şeyi) işler.
* proxy_pass http://127.0.0.1:8080;: İşte ters proxy’nin kalbi. Nginx’e, bu location bloğuna uyan istekleri http://127.0.0.1:8080 adresine (yani yerel sunucudaki Apache’ye) iletmesini söyler.
* proxy_set_header Host $host;: Bu başlık, orijinal Host başlığını Apache’ye iletir. Bu, Apache’nin sanal hostlarını doğru bir şekilde tanıması için kritik öneme sahiptir.
* proxy_set_header X-Real-IP $remote_addr;: Gerçek istemcinin IP adresini Apache’ye iletir. Bu olmazsa, Apache tüm istekleri Nginx’in IP adresinden (127.0.0.1) geliyormuş gibi görecektir.
* proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;: Bu da istemcinin IP adresini ileten standart bir başlık olup, proxy zincirindeki tüm IP’leri gösterebilir.
* proxy_set_header X-Forwarded-Proto $scheme;: İstemcinin hangi protokolü (HTTP veya HTTPS) kullandığını Apache’ye bildirir. SSL sonlandırması Nginx’te yapıldığında önemlidir.
* proxy_read_timeout, proxy_connect_timeout, proxy_send_timeout: Proxy bağlantıları için zaman aşımı değerlerini belirler.
* proxy_buffer_size, proxy_buffers, proxy_busy_buffers_size: Proxy tamponlama ayarları, özellikle büyük dosyalar veya yoğun trafik için performansı etkileyebilir.
Sunucu Bloğunu Etkinleştirme
Yapılandırma dosyasını oluşturduktan sonra, Nginx’in onu tanıması için /etc/nginx/sites-enabled/ dizinine bir sembolik bağlantı oluşturmalıyız:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
Varsayılan Nginx yapılandırmasını (ki bu da 80 portunu dinler) devre dışı bırakmak iyi bir uygulamadır, aksi takdirde çakışmalar yaşanabilir:
sudo rm /etc/nginx/sites-enabled/default
Nginx Yapılandırmasını Test Etme ve Yeniden Başlatma
Değişiklikleri uygulamadan önce Nginx yapılandırmasının sözdizimini kontrol edin:
sudo nginx -t
Eğer çıktı syntax is ok ve test is successful diyorsa, Nginx’i yeniden başlatın:
sudo service nginx restart
Test Etme
Şimdi tarayıcınızdan http://example.com (kendi alan adınızı kullanarak) adresine erişin. Apache’nin 8080 portundan sunduğu içeriği görmelisiniz. Bu, Nginx’in başarıyla bir ters proxy olarak çalıştığını gösterir.
Adım 4: Nginx’i Statik Dosyalar için Web Sunucusu Olarak Yapılandırma (Opsiyonel ama Önemli)
Nginx’in en büyük avantajlarından biri statik dosyaları Apache’den çok daha verimli bir şekilde sunabilmesidir. Bu adımda, Nginx’i belirli dosya türlerini doğrudan kendisinin sunması için yapılandıracağız. Bu, Apache üzerindeki yükü önemli ölçüde azaltacaktır.
example.com.conf dosyasını tekrar düzenleyin:
sudo nano /etc/nginx/sites-available/example.com.conf
location / { ... } bloğundan önce veya sonra aşağıdaki location bloğunu ekleyin:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;
# Statik dosyaları Nginx'in kendisi sunar
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg|eot)$ {
root /var/www/html; # Apache'nin DocumentRoot'u ile aynı veya Nginx için ayrı bir dizin olabilir
expires 30d;
add_header Cache-Control "public, no-transform";
try_files $uri @apache; # Eğer dosya bulunamazsa Apache'ye yönlendir
}
# Dinamik istekleri Apache'ye yönlendir
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 90;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
# @apache adlandırılmış konumu, try_files tarafından kullanılır
location @apache {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Eklenen Blok Açıklamaları:
location ~ \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg|eot)$ { ... }: Bu blok, belirli dosya uzantılarına sahip istekleri yakalar (resimler, CSS, JS, fontlar vb.). ~* büyük/küçük harf duyarsız eşleşme yapar.
* root /var/www/html;: Nginx’in bu statik dosyaları arayacağı kök dizini belirtir. Bu genellikle Apache’nin DocumentRoot‘u ile aynı olmalıdır.
* expires 30d;: Tarayıcı önbelleklemesini etkinleştirir. Bu, istemcilerin bu dosyaları 30 gün boyunca yerel olarak önbelleğe almasını sağlar ve sunucuya tekrar istek göndermelerini engeller.
* add_header Cache-Control "public, no-transform";: Önbellekleme başlıklarını ekler.
* try_files $uri @apache;: Nginx’in önce isteğin URI’sini ($uri) kök dizinde bir dosya olarak bulmaya çalışmasını söyler. Eğer bulamazsa, isteği @apache adlandırılmış location bloğuna iletir. Bu, statik dosya bulunamazsa isteğin yine de Apache’ye gitmesini sağlar.
* location @apache { ... }: Bu, try_files yönergesi tarafından kullanılan özel bir adlandırılmış location bloğudur. Temel olarak Apache’ye yönlendirme yapar.
Yapılandırmayı kaydedin, test edin (sudo nginx -t) ve Nginx’i yeniden başlatın (sudo service nginx restart). Artık Nginx, statik dosyaları doğrudan sunarken, diğer tüm istekleri Apache’ye yönlendirecektir. Bu, sunucunuzun performansında gözle görülür bir iyileşme sağlayacaktır.
Adım 5: Birden Fazla Alan Adı (Virtual Host) Yapılandırması
Tek bir sunucuda birden fazla web sitesi barındırmak yaygın bir senaryodur. Nginx ve Apache kombinasyonunda bunu yapmak oldukça basittir. Her alan adı için Nginx’te ayrı bir server bloğu oluşturmanız ve Apache’de (eğer dinamik içerik sunuyorsa) uygun VirtualHost yapılandırmasına sahip olmanız yeterlidir.
Nginx Tarafında
Her yeni alan adı (örn. example2.com) için /etc/nginx/sites-available/example2.com.conf adında yeni bir dosya oluşturun. İçeriği example.com.conf‘a benzer olacaktır, sadece server_name ve access_log/error_log yollarını yeni alan adına göre güncelleyin.
server {
listen 80;
listen [::]:80;
server_name example2.com www.example2.com;
access_log /var/log/nginx/example2.com_access.log;
error_log /var/log/nginx/example2.com_error.log;
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg|eot)$ {
root /var/www/example2.com/html; # Bu alan adı için ayrı bir kök dizin
expires 30d;
add_header Cache-Control "public, no-transform";
try_files $uri @apache2;
}
location / {
proxy_pass http://127.0.0.1:8080; # Tüm dinamik istekler Apache'ye
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location @apache2 { # Yeni alan adı için adlandırılmış konum
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Yeni yapılandırma dosyasını etkinleştirin ve Nginx’i yeniden başlatın:
sudo ln -s /etc/nginx/sites-available/example2.com.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo service nginx restart
Apache Tarafında
Apache’nin sanal hostları, Nginx’ten gelen Host başlığını kullanarak hangi siteye ait içeriği sunacağını belirleyecektir. Bu nedenle, Apache tarafında herhangi bir port değişikliği yapmanıza gerek yoktur, sadece yeni alan adı için bir VirtualHost oluşturmanız yeterlidir.
/etc/apache2/sites-available/example2.com.conf gibi bir dosya oluşturun:
sudo nano /etc/apache2/sites-available/example2.com.conf
İçeriği aşağıdaki gibi olabilir:
ServerAdmin webmaster@example2.com
ServerName example2.com
ServerAlias www.example2.com
DocumentRoot /var/www/example2.com/html
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
ErrorLog ${APACHE_LOG_DIR}/example2.com_error.log
CustomLog ${APACHE_LOG_DIR}/example2.com_access.log combined
Yeni Apache sanal hostunu etkinleştirin ve Apache’yi yeniden başlatın:
sudo a2ensite example2.com.conf
sudo service apache2 restart
Bu yapılandırma ile Nginx, gelen isteğin Host başlığına bakarak hangi Nginx server bloğunun eşleştiğini bulur. Eğer istek dinamik içerikse, Nginx onu Apache’ye iletir ve Apache de yine Host başlığına bakarak doğru VirtualHost‘u bulup içeriği sunar.
Adım 6: Performans ve Güvenlik İyileştirmeleri
Nginx’i ters proxy olarak kullanırken performansı ve güvenliği artırmak için çeşitli ek yapılandırmalar yapabiliriz.
Nginx Önbellekleme (Caching)
Nginx, Apache’den gelen yanıtları önbelleğe alarak tekrar eden dinamik içerik istekleri için bile performansı önemli ölçüde artırabilir. Bu, özellikle sık güncellenmeyen dinamik sayfalar için faydalıdır.
Önbellekleme için nginx.conf dosyasında (genellikle /etc/nginx/nginx.conf) veya ana sunucu bloğunuzun dışında http bloğunun içine bir proxy_cache_path yönergesi eklemeniz gerekir:
# /etc/nginx/nginx.conf dosyasında veya http bloğunun içinde
http {
# ... diğer http ayarları ...
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
proxy_cache_key "$scheme$request_method$host$request_uri";
server {
# ... server bloğunuz ...
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m; # 200 ve 302 yanıtlarını 10 dakika önbelleğe al
proxy_cache_valid 404 1m; # 404 yanıtlarını 1 dakika önbelleğe al
proxy_cache_bypass $http_pragma $http_authorization; # Belirli durumlarda önbelleği atla
proxy_no_cache $http_pragma $http_authorization; # Belirli durumlarda önbelleğe alma
add_header X-Proxy-Cache $upstream_cache_status; # Önbellek durumunu başlığa ekle
# ... diğer proxy_pass ve proxy_set_header ayarları ...
}
}
}
Açıklamalar:
* proxy_cache_path: Önbellek dosyalarının saklanacağı dizini, önbellek seviyelerini, anahtar bölgesini (bellekteki meta veriler için), etkin olmayan öğelerin ne kadar süre sonra silineceğini ve önbelleğin maksimum boyutunu tanımlar.
* proxy_cache_key: Önbelleğe alınacak her öğe için benzersiz bir anahtar oluşturur.
* proxy_cache my_cache;: Belirtilen my_cache önbelleğini kullanmasını sağlar.
* proxy_cache_valid: Belirli HTTP durum kodlarına sahip yanıtların ne kadar süreyle önbelleğe alınacağını belirler.
* proxy_cache_bypass ve proxy_no_cache: Özellikle oturum bilgisi içeren veya yetkilendirme gerektiren istekler için önbelleklemenin atlanmasını sağlar.
Önbellek dizinini oluşturmayı unutmayın:
sudo mkdir -p /var/cache/nginx
sudo chown -R www-data:www-data /var/cache/nginx
Gzip Sıkıştırma
Nginx, web sayfalarını ve statik dosyaları (CSS, JS, HTML) sıkıştırarak bant genişliği kullanımını azaltabilir ve yükleme sürelerini hızlandırabilir. Bu, nginx.conf dosyasında http bloğunun içinde yapılandırılır:
http {
# ...
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# ...
}
Açıklamalar:
* gzip on;: Gzip sıkıştırmayı etkinleştirir.
* gzip_vary on;: Vary: Accept-Encoding başlığını ekler.
* gzip_proxied any;: Tüm proxy’lenmiş istekler için sıkıştırmayı etkinleştirir.
* gzip_comp_level 6;: Sıkıştırma seviyesini belirler (1’den 9’a kadar, 6 iyi bir denge).
* gzip_types: Hangi MIME türlerinin sıkıştırılacağını belirtir.
SSL/TLS Sonlandırma (Nginx Üzerinde)
HTTPS trafiğini Nginx’te sonlandırmak yaygın bir uygulamadır. Bu, Nginx’in SSL/TLS şifrelemesini yönetmesini, sertifikaları işlemesini ve şifresi çözülmüş HTTP isteklerini Apache’ye iletmesini sağlar. Bu, Apache üzerindeki yükü azaltır ve Nginx’in daha verimli SSL işleme yeteneklerinden faydalanır.
Öncelikle bir SSL sertifikasına ihtiyacınız olacaktır (Let’s Encrypt ile ücretsiz sertifikalar alabilirsiniz). Sertifika ve anahtar dosyalarını sunucunuza yükledikten sonra, Nginx sunucu bloğunuzu aşağıdaki gibi güncelleyin:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# HTTP'den HTTPS'ye yönlendirme
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Sertifika yolu
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Özel anahtar yolu
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_prefer_server_ciphers on;
# Statik dosyalar ve proxy_pass ayarları (önceki gibi)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg|eot)$ {
root /var/www/html;
expires 30d;
add_header Cache-Control "public, no-transform";
try_files $uri @apache;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # Bu başlık Apache'ye HTTPS kullanıldığını bildirir
# ... diğer proxy ayarları ...
}
location @apache {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Açıklamalar:
* İlk server bloğu, HTTP (80 portu) üzerinden gelen tüm istekleri HTTPS’ye yönlendirir.
* İkinci server bloğu, HTTPS (443 portu) isteklerini dinler ve SSL/TLS yapılandırmasını içerir.
* ssl_certificate ve ssl_certificate_key: Sertifika ve özel anahtar dosyalarının yolları.
* Diğer ssl_ yönergeleri, SSL güvenliğini ve performansını optimize etmek için kullanılır.
Bu değişiklikleri yaptıktan sonra, Nginx’i yeniden başlatmayı ve UFW’den 443 portuna izin verdiğinizden emin olmayı unutmayın.
Güvenlik Duvarı (UFW) Ayarları
Son olarak, güvenlik duvarı ayarlarınızı gözden geçirin. Apache’nin dinlediği 8080 portunun dışarıdan erişime kapalı olduğundan emin olun. Sadece Nginx’in dinlediği 80 ve 443 portları açık olmalıdır.
sudo ufw allow 'Nginx Full' # Nginx HTTP ve HTTPS için izin verir
sudo ufw delete allow 8080 # Eğer daha önce Apache için 8080 portuna izin verdiyseniz silin
sudo ufw status
Adım 7: Sorun Giderme ve İzleme
Yapılandırma sırasında veya sonrasında sorunlarla karşılaşmanız durumunda, aşağıdaki adımlar sorun gidermeye yardımcı olabilir:
* Nginx Logları:
* Erişim Logları: /var/log/nginx/access.log (veya example.com_access.log gibi özel log dosyalarınız)
* Hata Logları: /var/log/nginx/error.log (veya example.com_error.log gibi özel log dosyalarınız)
Bu log dosyaları, Nginx’in istekleri nasıl işlediği ve herhangi bir hata olup olmadığı hakkında değerli bilgiler sağlar.
* Apache Logları:
* Erişim Logları: /var/log/apache2/access.log (veya example.com_access.log gibi özel log dosyalarınız)
* Hata Logları: /var/log/apache2/error.log (veya example.com_error.log gibi özel log dosyalarınız)
Apache logları, Nginx’ten gelen isteklerin Apache tarafından nasıl işlendiğini ve PHP veya diğer dinamik içeriklerle ilgili hataları gösterir.
* Servis Durumları:
sudo service nginx status
sudo service apache2 status
Bu komutlar, her iki servisin de çalışıp çalışmadığını kontrol etmenizi sağlar.
* Yapılandırma Kontrolleri:
sudo nginx -t # Nginx yapılandırma sözdizimini kontrol eder
sudo apache2ctl configtest # Apache yapılandırma sözdizimini kontrol eder
Bu komutlar, yanlış yazılmış bir direktif veya sözdizimi hatası olup olmadığını hızlıca tespit etmenize yardımcı olur.
* Port Dinleme Kontrolü:
sudo netstat -tulnp | grep LISTEN
Bu komut, hangi portların hangi servisler tarafından dinlendiğini gösterir. Nginx’in 80 ve 443’ü, Apache’nin ise 8080’i dinlediğinden emin olun.
Sonuç
Bu kapsamlı rehberde, Ubuntu 14.04 üzerinde Nginx’i hem statik içerik sunucusu hem de Apache için bir ters proxy olarak nasıl yapılandıracağımızı adım adım öğrendik. Bu yapılandırma, web sitenizin performansını artırmanın, sunucu kaynaklarını daha verimli kullanmanın ve genel olarak daha sağlam ve ölçeklenebilir bir web mimarisi oluşturmanın etkili bir yoludur. Nginx’in hızlı statik dosya sunumu ve gelişmiş önbellekleme yetenekleri ile Apache’nin güçlü dinamik içerik işleme kabiliyetlerini birleştirerek, ziyaretçilerinize daha hızlı ve daha güvenilir bir deneyim sunabilirsiniz.
Unutulmamalıdır ki, Ubuntu 14.04 eski bir işletim sistemi sürümüdür ve güvenlik güncellemeleri almamaktadır. Üretim ortamlarında daha güncel ve desteklenen bir Ubuntu sürümü kullanmanız şiddetle tavsiye edilir. Ancak burada açıklanan prensipler, modern Linux dağıtımlarında da Nginx ve Apache’yi bir araya getirmek için geçerliliğini korumaktadır. Bu yapılandırmayı temel alarak, kendi özel ihtiyaçlarınıza göre daha karmaşık ve optimize edilmiş çözümler geliştirebilirsiniz.
