CemirFastRustProxy
Tokio ve Hyper üzerine kurulu, asenkron ve yüksek performanslı bir ters vekil (reverse proxy) sunucusu.
CemirFastRustProxy, Rust ile yazdığım asenkron bir ters vekil sunucu (reverse proxy). Ters vekil, internetten gelen istekleri karşılayıp arkadaki uygulama sunucularına ileten ve yanıtları geri döndüren ara katman demek. Tokio ve Hyper üzerine kurulu proje; TLS sonlandırma, yük dengeleme, sağlık kontrolü, hız sınırlama ve statik dosya sunumu gibi işleri tek bir programda topluyor.
Amaç
Bu projeyle, her alan adını kendi küçük yapılandırma dosyasıyla yönetebileceğim, yapılandırma değiştiğinde yeniden başlatma gerektirmeyen bir ters vekil geliştirmek istedim.
Bir diğer hedefim, arkadaki servislerden biri çöktüğünde trafiğin otomatik olarak sağlıklı sunuculara yönelmesini ve çöken sunucuya istek gönderilmeye devam edilmemesini sağlamaktı. Bu yüzden projede yük dengeleme, sağlık kontrolü ve devre kesici gibi dayanıklılık mekanizmalarına ağırlık verdim.
Nasıl çalışır
Program açıldığında ana yapılandırma dosyası olan cemir.fast okunuyor. Bu dosyada dinlenecek adresler, işçi iş parçacığı sayısı, log düzeyi ve istemci zaman aşımları gibi genel ayarlar yer alıyor. Her alan adı ise .cem uzantılı ayrı bir dosyada tanımlanıyor. Bu dosyalar TOML biçiminde yazılıyor ve içlerinde sanal sunucu bilgileri, arka uç sunucular, yönlendirme kuralları, sağlık kontrolü ayarları, CSRF ayarları ve özel hata sayfaları bulunuyor.
80 numaralı porta gelen istekler otomatik olarak HTTPS'e yönlendiriliyor. 443 numaralı portta TLS bağlantısı rustls ile sonlandırılıyor ve SNI sayesinde aynı IP adresi üzerinde birden fazla alan adı için farklı sertifikalar kullanılabiliyor. SNI, istemcinin bağlanmak istediği alan adını TLS el sıkışması sırasında bildirdiği bir uzantı.
Gelen istek, yolu ve yöntemi uyan rotaya göre ya yerel bir dizinden statik dosya olarak sunuluyor ya da bir arka uç sunucu grubuna iletiliyor. Arka uç seçimi round-robin (sırayla), least-connections (en az aktif bağlantı) veya gecikmeye duyarlı algoritmayla yapılıyor. Gecikmeye duyarlı algoritma, her sunucunun yanıt süresini üstel ağırlıklı hareketli ortalama ile izleyip en hızlı yanıt veren sunucuyu seçiyor.
Yapılandırma dosyaları notify kütüphanesiyle izleniyor. Bir dosya değiştiğinde yeni yapılandırma okunuyor ve arc-swap ile kilit kullanmadan etkin yapılandırmanın yerine geçiyor. Böylece program durmadan ve açık bağlantılar kesilmeden ayarlar güncelleniyor.
Öne çıkan özellikler
- Her alan adı kendi
.cemdosyasıyla bağımsız olarak yapılandırılıyor. - Sertifika ve log yolları belirtilmezse alan adına göre varsayılan yollar otomatik olarak kullanılıyor.
- Aktif sağlık kontrolü her arka uç sunucuyu belirli aralıklarla yokluyor, pasif kontrol ise gerçek isteklerin sonucuna göre sunucunun durumunu güncelliyor.
- Devre kesici (circuit breaker), art arda hata veren bir sunucuya giden trafiği belirli bir süre için kesiyor ve sonra sunucunun düzelip düzelmediğini deniyor.
- Yalnızca idempotent, yani tekrar edilmesi yan etki doğurmayan isteklerde üstel bekleme süreli yeniden deneme yapılabiliyor.
- IP başına çalışan jeton sepeti (token bucket) algoritmasıyla hız sınırlama uygulanıyor.
- İzin verilen kaynaklar dışından gelen POST, PUT ve DELETE isteklerinde CSRF başlığı zorunlu tutuluyor.
- Yanıtlar gzip, zstd, brotli veya deflate ile sıkıştırılabiliyor.
- 404, 500 ve 502 gibi durum kodları için özel HTML hata sayfaları tanımlanabiliyor.
- Tüm trafik merkezi erişim ve hata loglarına, istenirse alan adı bazında ayrı log dosyalarına yazılıyor.
Teknik altyapı
Proje Rust 2024 sürümüyle yazıldı. Asenkron çalışma zamanı olarak Tokio, HTTP katmanı için Hyper ve tower, sıkıştırma ve zaman aşımı için tower-http kullanırım. TLS tarafında rustls ve tokio-rustls var. Yapılandırma serde ve toml ile okunuyor. Eşzamanlı veri yapıları için parking_lot, dashmap ve crossbeam, loglama için tracing kullanılıyor.
Ağ tarafında socket2 ile dinleme soketlerine SO_REUSEPORT, TCP_NODELAY ve keep-alive gibi ayarlar uygulanıyor. Bellek ayırıcı olarak jemalloc kullanılıyor. Sürüm derlemesi en yüksek optimizasyon düzeyi, LTO ve sembol temizleme ile yapılıyor. Kurulum, başlatma ve durdurma işleri bir Makefile ile yönetiliyor ve program systemd servisi olarak çalıştırılabiliyor.
Kullanım alanları
- Tek sunucuda birden fazla alan adını HTTPS ile yayınlamak için kullanılabilir.
- Birden fazla uygulama sunucusunun önünde yük dengeleyici olarak çalışabilir.
- Arka uç servislerin zaman zaman çöktüğü ortamlarda devre kesici ve sağlık kontrolüyle kesintiyi azaltmaya yardımcı olur.
- Statik sitelerle API'lerin aynı alan adı altında farklı yollardan sunulması gereken yapılarda işe yarar.
- Rust ile ağ programlama ve ters vekil mimarisi öğrenmek isteyenler için incelenebilecek bir örnek sunar.
Durum
Projenin şu anki sürüm numarası 2026.5.3. Depoda yapılandırma örnekleri, hata sayfaları ve systemd servis dosyası da yer alıyor.
- Kategori
- Ağ, sunucu ve altyapı
- Yıl
- 2026
Teknolojiler
- Rust
- Tokio
- Hyper
- Networking
- Open Source
Bağlantılar
- GitHub https://github.com/muslu/cemirfastrustproxy