Config'inizi çevirin, iki proxy'yi yan yana çalıştırın ve trafiği devredin

nginx veya Traefik'ten geçiş

Bu rehber, bir nginx veya Traefik config'inde bulunan parçaları çevirir ve trafiği kesintisiz devreder.

Plan şudur: r3v3rs3'ü başka bir portta çalıştırın, config'i orada kurun, Host header'ı ile test edin, sonra portu taşıyın.

Adım 1: Elinizdekini listeleyin

Mevcut config'inizdeki her maddeyi yazın. Çoğu kurulumda beş tür madde vardır:

  1. Server block'ları veya router'lar: hangi host nereye gidiyor.
  2. Location'lar veya rule'lar: hangi path nereye gidiyor ve path nasıl değişiyor.
  3. Sertifikalar: dosya veya ACME.
  4. Ek özellikler: redirect, header, basic auth, rate limit, IP filtresi, cache.
  5. Upstream'ler: sunucular, weight değerleri ve health check'ler.

Aşağıdaki tablolardaki her maddenin r3v3rs3 karşılığı vardır. Tabloda olmayan bir şeyin, örneğin bir Lua script'inin veya bir nginx modülünün, karşılığı yoktur; o parça için başka bir çözüm gerekir.

Adım 2: nginx direktiflerini çevirin

nginxr3v3rs3
listen 443 ssl;HTTPS protokollü bir port ve TLS Termination
listen 443 quic;QUIC üzerinden HTTP (HTTP/3) protokollü bir port
server_name app.example.com;Proxy'nin Virtual Host'lar alanı
location /api { }Path'i /api olan bir route
proxy_pass http://api:8080/v1/;Route'ta http://api:8080/v1/ sunucusu
upstream app { server a; server b; }Bir route'ta iki sunucu
server a weight=3;Sunucunun Weight değeri 3
return 301 https://$host$request_uri;HTTP'yi Otomatik Olarak HTTPS'e Yönlendir
rewrite ^/items/([0-9]+)$ /item/$1 break;Route'ta Path Regex'i ve Yerine Yazılacak Değer
add_header X-Frame-Options DENY;Response header kuralı: set X-Frame-Options: DENY
auth_basic ve auth_basic_user_fileProxy'de kullanıcılarıyla Basic Auth
auth_request /auth;Auth URL'i ile Forward Auth
allow ve denyIP Filtresi allow ve deny listeleri
limit_req_zone ve limit_reqRequest sayısı, süre ve burst ile Rate Limit
proxy_cache_path ve proxy_cacheMemory limiti ve TTL ile Cache
gzip on;Algoritmalar ve minimum boyut ile Compression
return 404;Sabit status kodu route tipi
proxy_set_header X-Real-IP $remote_addr;Otomatiktir. Client IP bölümüne bakın
client_max_body_size 10m;Request Body Limiti
proxy_read_timeout 60s;Proxy'nin veya route'un Request Timeout'u
stream { server { proxy_pass db:5432; } }TCP proxy

Zaman kaybettiren iki fark:

route /api, sunucu http://api:8080/v1/   ->  GET /api/users  =  /v1/users
route /keep, Route Path'ini Kaldır kapalı ->  GET /keep/x    =  /keep/x

Query string iki durumda da korunur.

Adım 3: Traefik label'larını çevirin

Traefikr3v3rs3
entrypointsPortlar
Host(\app.example.com`)`Proxy'nin Virtual Host'lar alanı
PathPrefix(\/api`)`Path'i /api olan bir route
PathPrefix olmayan routerPath'i / olan bir route
loadBalancer.servers içeren serviceRoute'un sunucuları
loadBalancer.healthCheckPath ve aralık ile Health Check
loadBalancer.sticky.cookieCookie adıyla Sticky Cookie'yi Aç
middlewares.stripPrefixRoute'un varsayılan davranışı
middlewares.addPrefixEklenecek Prefix
middlewares.redirectSchemeHTTP'yi Otomatik Olarak HTTPS'e Yönlendir
middlewares.redirectRegexregex, target ve status içeren redirect kuralı
middlewares.basicAuthBasic Auth
middlewares.forwardAuthForward Auth. Forward auth ile single sign-on rehberine bakın
middlewares.ipAllowListIP Filtresi
middlewares.rateLimitRate Limit
middlewares.headersHeader kuralları
middlewares.compressCompression
ACME ile certresolverACME kaydı. Wildcard sertifika ile HTTPS rehberine bakın
Docker label'larıDocker service discovery. Docker'dan proxy'ler rehberine bakın
tcp routerTCP proxy

Docker label'larıyla kurulmuş bir Traefik kurulumu en az işi ister: Docker provider'ını açın ve traefik. label'larının yanına r3v3rs3. label'larını yazın. İki proxy de aynı container'ları okur, hiçbir şeyi silmeden ikisini karşılaştırabilirsiniz.

Adım 4: Başka bir portta kurun

Port 80 ve 443'e henüz dokunmayın. r3v3rs3'e boş bir port verin:

  1. HTTP protokolü ile 0.0.0.0:8080 portunu ekleyin.
  2. Bütün proxy'leri gerçek virtual host'larıyla kurun.
  3. Her birini Host header'ı ile test edin:
$ curl -s -o /dev/null -w '%{http_code}\n' -H 'Host: app.example.com' http://127.0.0.1:8080/
200
$ curl -s -H 'Host: app.example.com' http://127.0.0.1:8080/api/users

DNS'te hiçbir şey değişmez, kullanıcılarınız eski proxy'de kalır. Adım 1'deki listedeki her madde eskisi gibi cevap verene kadar çalışın.

HTTPS için 0.0.0.0:8443 portunu ekleyin ve --resolve kullanın:

$ curl -sI --resolve app.example.com:8443:127.0.0.1 https://app.example.com:8443/

Adım 5: Response'ları karşılaştırın

Status kodu yetmez. İki proxy'nin header'larını karşılaştırın:

$ curl -sI -H 'Host: app.example.com' http://127.0.0.1:8080/ > new.txt
$ curl -sI https://app.example.com/ > old.txt
$ diff old.txt new.txt

Cache header'larına, Set-Cookie attribute'larına, CORS header'larına ve redirect'lere bakın. r3v3rs3 upstream request'ine via: r3v3rs3 ile forwarded ve x-forwarded-* header'larını ekler:

{
  "forwarded": "for=203.0.113.7, host=app.example.com, proto=https",
  "x-forwarded-for": "203.0.113.7",
  "x-forwarded-proto": "https",
  "x-forwarded-host": "app.example.com",
  "via": "r3v3rs3"
}

X-Real-IP okuyan bir uygulama için bu header'ı yazan bir request header kuralı ekleyin, çünkü r3v3rs3 bu header'ı göndermez.

CDN arkasındaysanız karşılaştırmadan önce CDN'i Client IP ayarlarında tanımlayın. Aksi halde her log satırı CDN'in adresini taşır.

Adım 6: Trafiği devredin

Şu sırayla yapın:

  1. Başka bir makineye geçiyorsanız bir gün önce DNS kayıtlarının TTL değerini beş dakikaya düşürün.
  2. Eski proxy'yi durdurun veya başka bir porta taşıyın. İki process aynı portu dinleyemez.
  3. r3v3rs3 portlarını 8080 ve 8443 yerine 80 ve 443 yapın. Değişiklik restart olmadan uygulanır.
  4. Sertifikaları kontrol edin. ACME'de HTTP-01 challenge'ı port 80'i, TLS-ALPN-01 challenge'ı port 443'ü ister, bu yüzden devirden önceki bir order başarısız olabilir.
  5. Gerçek adresi test edin:
$ curl -sI https://app.example.com/
  1. Birkaç dakika proxy listesini izleyin. Sağlıklı sunucu sayısı ve discovery provider'larının issue'ları orada görünür.

Geri dönmek için portları eski haline getirin ve eski proxy'yi başlatın. Emin olana kadar eski config dosyasını saklayın, çünkü geri dönüş yolu tam olarak budur.

Adım 7: Eski kurulumu kaldırın

Birkaç gün sorunsuz geçtikten sonra:

Karşılığı olmayanlar

ÖzellikDurum
Lua, njs ve diğer nginx modülleriYok.
Tam path eşleşmesiYok. Path, segment bazında prefix olarak eşleşir.
Response body değiştirme (sub_filter)Yok.
Disk cacheYok. Cache memory'dedir.
Upstream'e HTTP/3Yok. Upstream bağlantısı HTTP/2 veya HTTP/1.1 kullanır.
WebTransportYok.

Referans

Sonraki adımlar