Modern mikroservisler ve kurumsal uygulama ekosisteminde, ölçeklenebilirlik, güvenlik ve performans için doğru web sunucusu yığınını seçmek kritik öneme sahiptir. Apache Tomcat, Java tabanlı uygulamaları (WAR'lar) sunmak için de facto standart olsa da, doğrudan halka açık internete dağıtmak genellikle en iyi uygulama değildir. Bunun yerine, güçlü bir mimari genellikle trafiğin Tomcat örneğine ulaşmadan önce ters proxy ve güvenlik kapısı olarak görev yapan ön uç bir HTTP sunucusu (Apache HTTP Server, Nginx veya HAProxy gibi) içerir. Bu yazı, maksimum verimlilik ve güvenlik için bu uyumun nasıl yapılandırılacağını inceler.
Ters Proxy Deseni: Güvenlik ve Yük Dengeleme
Tomcat'in önüne bir HTTP sunucusu yerleştirmek, soyutlama katmanlarının birkaç katmanını sağlar. Statik içerik önbelleğe almayı yönetir, SSL/TLS bağlantılarını sonlandırarak uygulama sunucusundaki CPU yoğunluklu şifreleme işlemlerini hafifletir ve arka ucu doğrudan maruz kalmadan korur. Apache HTTP Sunucusu'nu Tomcat'e bağlamanın endüstri standardı yolu, mod_proxy_ajp veya mod_proxy_http modülleri aracılığıyla gerçekleşir. AJP (Apache JServer Protocol), HTTP'ye göre ikili verimliliği nedeniyle genellikle tercih edilir, ancak mod_proxy_http ile HTTP/2 desteği giderek daha uygulanabilir hale gelmektedir.
Aşağıda, standart AJP bağlantı noktasında (8009) çalışan yerel bir Tomcat örneğine bir ters proxy kuran httpd.conf için bir yapılandırma parçası bulunmaktadır:
<VirtualHost *:80>
ServerName app.example.com
# Proxy Modüllerini Etkinleştir
ProxyRequests Off
ProxyPreserveHost On
# Tomcat'e AJP Proxy
<Proxy >
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
<VirtualHost *:443>
ServerName app.example.com
# SSL Yapılandırması buraya gelir
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
SSL/TLS Sonlandırma ve Sanal Sunucular
Güvenli Yuva Katmanı (SSL) ve Taşıma Katmanı Güvenliği (TLS), modern web uygulamaları için vazgeçilmezdir. TLS'yi Tomcat içinde değil, HTTP sunucusu katmanında sonlandırmak çok daha verimlidir. Bu sayede, Java uygulama sunucusunu yeniden derlemek veya yeniden başlatmak zorunda kalmadan modern şifreleme takımlarını ve protokolleri (TLS 1.3 gibi) kullanabilirsiniz. Ayrıca, sanal sunucular, trafiği Host üst bilgisine göre yönlendirerek tek bir IP adresinden birden fazla ayrı uygulamayı sunmanıza olanak tanır.
Sanal sunucuları yapılandırırken, ProxyPreserveHost On özelliğinin etkin olduğundan emin olun. Bu, istemci tarafından talep edilen orijinal ana bilgisayar adının arka uç Tomcat sunucusuna iletilmesini sağlar; bu, mutlak URL'ler üreten veya gelen domain'e dayalı CORS politikalarını işleyen uygulamalar için hayati önem taşır.
Performans Ayarı: İş Parçacığı Havuzları ve Bağlantı Sınırları
Mimari temel yerleştirildikten sonra, ince ayar yapmak hayati hale gelir. Tomcat'in performansı büyük ölçüde server.xml içindeki bağlayıcı yapılandırması tarafından belirlenir. acceptCount, maxThreads ve minSpareThreads parametreleri, sunucunun gelen bağlantıları nasıl ele aldığını tanımlar.
Yüksek trafikli Java uygulamaları için aşağıdaki ayar kılavuzlarını göz önünde bulundurun:
- Maksimum İş Parçacıkları: Bu değeri mevcut CPU çekirdeklerinize ve belleğinize göre artırın. Genel bir kural olarak, G/Ç ile sınırlı görevler için
CPU çekirdekleri * 2ileCPU çekirdekleri * 3arasındadır, ancak bu uygulama mantığına göre değişir. - Keep-Alive: Her istek için yeni TCP bağlantıları kurmanın yarattığı yükü azaltmak üzere, hem HTTP sunucusunda hem de Tomcat bağlayıcısında keep-alive özelliğinin etkin olduğundan emin olun.
- Arabellek Boyutları: Arabellek tahsislerini azaltmak için bağlayıcıdaki
bufferSize'i tipik yük boyutlarınıza göre ayarlayın.
Son olarak, JVM yığın kullanımını ve çöp toplama günlüklerinizi izlemeyi unutmayın. Optimum sunucu yapılandırmasına rağmen, bellek yetersizliği hatası veya sık sık gerçekleşen Tam GC duraklamaları tüm yığınınızı darboğaza sokabilir. JVisualVM, Prometheus ve Grafana gibi araçlar, bu metrikleri gerçek zamanlı olarak görselleştirmek için paha biçilmezdir.
Sonuç
Apache HTTP Sunucusu ile Tomcat'i birleştirmek, Java uygulamaları için dayanıklı, güvenli ve yüksek performanslı bir ortam oluşturur. SSL sonlandırmayı, statik varlıkları yönetmeyi ve dinamik istekleri AJP veya HTTP/2 üzerinden verimli bir şekilde proxy'lemeyi üstlenerek, altyapı endişelerinizi iş mantığınızdan soyutlarsınız. İş parçacığı havuzları ve bağlantı sınırlarının dikkatli bir şekilde ayarlanmasıyla, bu yığın düşük gecikme süresi ve yüksek kullanılabilirliği korurken milyonlarca isteği işleyebilir.