Apache, mod_proxy modülü ve ilgili alt modülleri sayesinde ters proxy (reverse proxy) olarak çalışabilir; istemci isteklerini arka uç sunuculara iletir ve bu sunucuların yanıtlarını geri döndürür.
Ters proxy, istemci istekleri için aracı görevi görür ve bunları bir veya birden fazla dahili arka uç sunucuya yönlendirir. İnternete tek ve birleşik bir arayüz sunarken dahili ağ mimarisini gizler. Sağladığı avantajlar arasında güvenliğin artması, yük dengeleme, SSL/TLS sonlandırma, önbellekleme ve arka uç yönetiminin basitleşmesi yer alır.
mod_proxy Modülünü Etkinleştirme
Apache'yi ters proxy olarak yapılandırmak için çekirdek mod_proxy modülünün ve belirli alt modüllerin etkinleştirilmesi gerekir. Bu modüller farklı protokol desteği ve özellikler sunar.
Gerekli modüller:
mod_proxy: çekirdek proxy modülü.mod_proxy_http: HTTP ve HTTPS trafiğini proxy'lemek için.mod_proxy_balancer: birden fazla arka uç sunucu arasında yük dengelemesi için gereklidir.mod_proxy_wstunnel: WebSocket proxy'leme için.mod_ssl: Apache, istemci bağlantıları için SSL/TLS sonlandırmayı üstlenecekse.
Debian/Ubuntu tabanlı sistemlerde modülleri a2enmod komutuyla, CentOS/RHEL tabanlı sistemlerde ise httpd.conf içindeki LoadModule satırlarının başındaki yorum işaretini kaldırarak etkinleştirin:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod proxy_wstunnel
sudo a2enmod ssl
sudo systemctl restart apache2
Temel HTTP Ters Proxy Yapılandırması
Ters proxy için temel yönergeler ProxyPass ve ProxyPassReverse'tür. Yapılandırma genellikle bir <VirtualHost> bloğu içine ya da doğrudan httpd.conf dosyasına yazılır.
<VirtualHost *:80>
ServerName yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
# /app için gelen tüm istekleri bir arka uç sunucuya ilet
ProxyPass /app http://backend-app-server:8080/app
ProxyPassReverse /app http://backend-app-server:8080/app
# Kök yol / için gelen tüm istekleri başka bir arka uca ilet
ProxyPass / http://backend-web-server:8000/
ProxyPassReverse / http://backend-web-server:8000/
# Apache üzerinde SSL/TLS sonlandırma ve arka uca HTTP iletimi için
# RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
Temel Yönergeler
ProxyRequests Off: bu kritik bir ayardır. Apache'nin ileri (forward) proxy yeteneklerini devre dışı bırakarak sunucunun açık proxy gibi davranmasını engeller; aksi hâlde ciddi bir güvenlik riski oluşur. Ters proxy kurulumlarında bu yönerge her zamanOffolmalıdır.ProxyPreserveHost On: bu yönerge, istemci isteğindeki özgünHostbaşlığının arka uç sunucuya aktarılmasını sağlar.OffolduğundaHostbaşlığı, arka uç sunucunun ana bilgisayar adı ve portuyla değiştirilir.ProxyPass [path] [url]: yerel bir URL yolunu (path) arka uç URL'sine (url) eşler. Apache,pathile eşleşen istekleri yakalar veurladresine iletir.- Örnek:
ProxyPass /app http://backend-app-server:8080/appsatırı,http://yourdomain.com/app/page.htmladresine gelen bir isteğinhttp://backend-app-server:8080/app/page.htmladresine iletileceği anlamına gelir.
- Örnek:
ProxyPassReverse [path] [url]: arka uç sunucudan gelen HTTP yanıtlarındakiLocation,Content-LocationveURIbaşlıklarını yeniden yazar. Böylece arka ucun ürettiği yönlendirmeler ve bağlantılar, dışarıya açık proxy URL'sini gösterir ve istemciler dahili URL'lere maruz kalmaz.<Proxy *>: proxy'nin kendisi için erişim denetimini tanımlar.Require all granted, tüm istemcilerin proxy'yi kullanmasına izin verir. Daha sıkı güvenlik için yalnızca belirli IP adreslerine veya ağlara izin verilebilir.
Gelişmiş mod_proxy Özellikleri
Yük Dengeleme
mod_proxy_balancer, gelen istekleri birden fazla arka uç sunucuya dağıtarak erişilebilirliği ve ölçeklenebilirliği artırır.
<VirtualHost *:80>
ServerName app.yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy balancer://mycluster>
BalancerMember http://backend1.internal:8080 route=1 loadfactor=10
BalancerMember http://backend2.internal:8080 route=2 loadfactor=10
# İsteğe bağlı: balancer'a özel ayarlar için ProxySet
ProxySet lbmethod=byrequests stickysession=JSESSIONID nofailover=Off
# Oturum yapışkanlığı için arka uç, JSESSIONID gibi bir çerez ayarlamalıdır
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
<Location "/balancer-manager">
SetHandler balancer-manager
Require ip 192.168.1.0/24 # Erişimi dahili ağ ile sınırla
</Location>
</VirtualHost>
