Özel alan adı ve birinci taraf proxy
Widget dosyaları, sohbet bağlantısı, çevrimdışı form ve Smart Answer web sitenizin alt alan adından nasıl sunulur: proxy anahtarı, gerçek ziyaretçi adresi ve nginx, Apache, Caddy için hazır şablonlar.
Özel alan adıyla sohbet, web sitenizin bir alt alan adı üzerinden çalışır; örneğin chat.your-company.com. Sunucunuz widget isteklerini alır ve ters proxy olarak reactive.chat hizmetine iletir. Bu sayfa sunucuyu yöneten kişi içindir. İçerik editörleri için kısa sürüm Özel alan adı (birinci taraf) bölümündedir.
Alt alan adı üzerinden çalışanlar
- Widget dosyaları –
loader.js, ardından yüklenen çekirdek (core.<hash>.js) ve diğer modüller. - Sohbet bağlantısı –
/rc_wss/altındaki WebSocket;/rc_wss/h/altındaki HTTP yedeği ve/rc_wss/upload/altındaki dosya yüklemeleri dâhil. - Çevrimdışı form – sohbet bağlantısı kurulamadığında
POST /api/offline/<SITE_KEY>. - Smart Answer – Web sitenizin aramasında YZ yanıtı kullanıyorsanız
/api/suche/.
Sağladıkları:
- Üçüncü taraf alan adlarına istek gönderilmez. Bu yollar için ziyaretçilerinizin tarayıcıları yalnızca alt alan adınızla iletişim kurar.
- Content Security Policy içinde tek adres.
script-srcveconnect-srciçinde reactive.chat adresleri yerine alt alan adınız yer alır (ayrıntılar Güvenlik ve CSP bölümünde). - Gerçek ziyaretçi adresi ulaşır. Proxy bunu gizli anahtarla korunan özel başlıkta bildirir. Hız sınırlama ve engelleme böylece proxy başına değil, ziyaretçi başına sayılır.
Sağlamadıkları:
- Kendi sunucunuzda barındırma değildir. Sohbetler, ekler ve ayarlar reactive.chat tarafından işlenip saklanmaya devam eder.
- Onay konusunda bir hüküm içermez. Özel alan adınız verileri kimin işlediğini değiştirmez.
- Proxy trafiği görür. TLS proxy üzerinde sonlanır; orada istek gövdelerini günlüğe kaydetmeyin ve
/rc_wss/h/isteklerini erişim günlüğü dışında tutun (bu isteklerin sorgusunda kısa ömürlü bağlantı token’ı bulunur).
Gereksinimler
- Genel erişime açık, 443 numaralı port üzerinden HTTPS ile erişilebilen ve dışarıya HTTPS bağlantıları açabilen sunucu veya ters proxy. nginx (ssl modülüyle), Apache 2.4.47 veya üzeri ve Caddy 2 için şablonlar vardır.
- Apache için
mod_ssl,mod_proxy,mod_proxy_http,mod_proxy_wstunnel,mod_headersvemod_setenvifmodülleri. - Yalnızca sohbet için kullanılan bir alt alan adı. Sohbet tüm ana makine adını gerektirir;
www.your-company.com/chat/gibi yol çalışmaz. Yalnızca adı girin:https://, port veya yol olmadan. IP adresleri,.local,.lan,.internalgibi iç ağ uzantıları vereactive.chataltındaki adlara izin verilmez. - Web sitesiyle aynı alan adı. Sohbet yalnızca alt alan adı, yerleştirildiği web sitesinin alan adına aitse birinci taraftır.
- Yalnızca genel erişime açık adresler içeren DNS (A ve/veya AAAA).
- Alt alan adı için TLS sertifikası (nginx/Apache şablonları certbot yollarını bekler; Caddy kendisi alır).
- Projeyi düzenleme yetkisi.
Kurulum
- Hesabınızda projeyi, Yerleştirme → Özel alan adı kur bölümünü açın.
- 1. Ana makine altında adı, örneğin
chat.your-company.com, girip kaydedin. - 2. Proxy anahtarı altında Anahtar oluştur düğmesine tıklayın. Anahtar
rcpx_ile başlar ve yalnızca bir kez gösterilir; yalnızca özeti saklanır. Sadece proxy yapılandırmasında bulunmalıdır; web sayfasına, tarayıcı betiğine veya kod deposuna asla koymayın. - 3. Sunucu yapılandırması altında sunucunuzun şablonunu alın. Anahtarı oluşturduktan hemen sonra anahtarı içerir; daha sonra
__RC_PROXY_KEY__gösterir. Yapılandırmayı sınayın (nginx -tveyaapachectl configtest) ve sunucuyu yeniden yükleyin. - 5. Kontrol altında Şimdi kontrol et düğmesine tıklayın (en fazla 10 saniyede bir). Mesaj oluşturulmaz.
- Yalnızca beş kontrol adımının tümünde “Tamam” görünürse yerleştirme kodunu 4. Yerleştirme kodu altındakiyle değiştirin:
<script src="https://chat.your-company.com/loader.js"
data-rc-site-key="SITE_KEY"
data-rc-ws-url="wss://chat.your-company.com/rc_wss/"
async></script>
Widget dosyalarının konumunu src değerinden, sohbet bağlantısını data-rc-ws-url değerinden alır; çevrimdışı form, yükleme ve HTTP yedeği adreslerini bundan türetir. Diğer tüm öznitelikler aynı kalır (Script etiketi başvurusu).
Proxy neleri iletmelidir?
/rc_wss/→ sohbet sunucusuhttps://ws.reactive.chat/rc_wss/, WebSocket yükseltmesi, uzun zaman aşımı (şablonlar: 3.600 sn), arabelleğe almadan, en az 32 MB gövde sınırıyla (yüklemeler)./api/offline/→https://ws.reactive.chat/api/offline/(küçük gövde; şablon: 32 kB, 30 sn)./api/suche/→https://ws.reactive.chat/api/suche/, arabelleğe almadan (yanıt Server-Sent Events akışıdır), en fazla 8 kB gövde, 120 sn.- diğer her şey → dağıtım ağı
https://cdn.reactive.chat/.
Tüm yollar için:
- Host başlığı ve SNI hedefin adıdır; alt alan adınız değil. Bilinmeyen ana makineye HTTP 421 döndürülür.
- Hedefin sertifikası doğrulanır.
- Çerez ve erişim bilgileri iletilmez. Tarayıcının
CookieveAuthorizationbaşlıkları aktarılmaz,Set-Cookiegeri döndürülmez. - Yönlendirme yapılmaz. Önbellek gerekmez; eklerseniz
loader.jsiçin süreyi kısa tutun. Dosyanın adında sürüm numarası yoktur (çekirdekte vardır; Mimari bölümüne bakın).
/rc_wss/, /api/offline/ ve /api/suche/ için proxy her istekte iki başlık ayarlar:
- X-RC-Proxy-Key – anahtarınız
rcpx_…. - X-RC-Client-IP – proxy tarafından görülen ziyaretçi adresi.
“Ayarlar” şu demektir: tarayıcının bu adlarla gönderdiği her değerin üzerine yazılır. Dağıtım ağına giden yolda ikisi de temizlenir.
Yük dengeleyici veya CDN arkasında proxy önce o cihazın adresini görür. Bu durumda gerçek adresin alınmasını ayarlayın: nginx real_ip (set_real_ip_from, real_ip_header), Apache mod_remoteip (RemoteIPHeader, RemoteIPTrustedProxy), Caddy trusted_proxies ve {remote_host} yerine {client_ip}. Kontrol bu durumu saptamaz; yalnızca geçerli bir adres ayarlandığını görür.
nginx şablonu
Hesap sayfası ana makine adını, hedef adresleri ve anahtarı doldurur; şablonu oradan kopyalamanız en iyisidir. Buradaki sürüm başvuru içindir; yer tutucular chat.your-company.com, SITE_KEY ve __RC_PROXY_KEY__ değerleridir. RHEL/CentOS üzerinde CA paketi /etc/pki/tls/certs/ca-bundle.crt konumundadır.
server {
listen 80;
listen [::]:80;
server_name chat.your-company.com;
location /.well-known/acme-challenge/ { root /var/www/html; }
location / { return 301 https://$host$request_uri; }
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name chat.your-company.com;
ssl_certificate /etc/letsencrypt/live/chat.your-company.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.your-company.com/privkey.pem;
# HTTP fallback (SSE / long polling): token in the query, do not log
location /rc_wss/h/ {
access_log off;
proxy_pass https://ws.reactive.chat/rc_wss/h/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host ws.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name ws.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
proxy_set_header X-RC-Client-IP $remote_addr;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
proxy_cache off;
}
# Chat connection (WebSocket) and uploads
location /rc_wss/ {
proxy_pass https://ws.reactive.chat/rc_wss/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ws.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name ws.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
proxy_set_header X-RC-Client-IP $remote_addr;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
proxy_cache off;
client_max_body_size 32m;
proxy_request_buffering off;
}
# Offline form
location /api/offline/ {
proxy_pass https://ws.reactive.chat/api/offline/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host ws.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name ws.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
proxy_set_header X-RC-Client-IP $remote_addr;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_hide_header Set-Cookie;
client_max_body_size 32k;
proxy_read_timeout 30s;
}
# Smart Answer (website search), answer as a stream
location /api/suche/ {
proxy_pass https://ws.reactive.chat/api/suche/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host ws.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name ws.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
proxy_set_header X-RC-Client-IP $remote_addr;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_hide_header Set-Cookie;
client_max_body_size 8k;
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 120s;
}
# Widget files
location / {
proxy_pass https://cdn.reactive.chat/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host cdn.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name cdn.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "";
proxy_set_header X-RC-Client-IP "";
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_hide_header Set-Cookie;
}
}
Apache şablonu (2.4.47 veya üzeri)
Yalnızca 443 numaralı port için VirtualHost; 80 numaralı porttan yönlendirmeyi ve sertifikayı diğer ana makinelerinizdeki gibi ayarlayın. SSLProxyVerifyDepth 5 gereklidir; aksi durumda Apache hedefin zincirini yalnızca bir düzey derinliğinde kontrol eder ve “Certificate Chain too long” bildirir.
<VirtualHost *:443>
ServerName chat.your-company.com
SetEnvIf Request_URI "^/rc_wss/h/" rc_no_log
CustomLog ${APACHE_LOG_DIR}/chat.your-company.com_access.log combined env=!rc_no_log
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/chat.your-company.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/chat.your-company.com/privkey.pem
SSLProxyEngine on
SSLProxyVerify require
SSLProxyVerifyDepth 5
SSLProxyCheckPeerName on
SSLProxyCACertificateFile /etc/ssl/certs/ca-certificates.crt
ProxyRequests Off
ProxyPreserveHost Off
ProxyAddHeaders Off
RequestHeader unset X-RC-Proxy-Key early
RequestHeader unset X-RC-Client-IP early
RequestHeader unset Cookie early
RequestHeader unset Authorization early
ProxyPass "/rc_wss/" "https://ws.reactive.chat/rc_wss/" upgrade=websocket timeout=3600 flushpackets=on
ProxyPass "/api/offline/" "https://ws.reactive.chat/api/offline/" timeout=30
ProxyPass "/api/suche/" "https://ws.reactive.chat/api/suche/" timeout=120 flushpackets=on
ProxyPass "/" "https://cdn.reactive.chat/"
<Location "/rc_wss/">
RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
</Location>
<Location "/api/offline/">
RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
Header unset Set-Cookie
</Location>
<Location "/api/suche/">
RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
Header unset Set-Cookie
</Location>
</VirtualHost>
2.4.47 öncesi Apache, upgrade=websocket seçeneğini tanımaz. Bu durumda ilk ProxyPass satırını şununla değiştirin:
RewriteEngine on
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule ^/rc_wss/(.*) "wss://ws.reactive.chat/rc_wss/$1" [P,L]
ProxyPass "/rc_wss/" "https://ws.reactive.chat/rc_wss/" timeout=3600 flushpackets=on
Caddy 2 şablonu
Bir değerle kullanılan header_up, tarayıcının bu adla gönderdiği değeri değiştirir. Erişim günlüklerini açarsanız /rc_wss/h/* yolunu hariç tutun (log_skip; Caddy 2.8 öncesinde skip_log).
chat.your-company.com {
handle /rc_wss/* {
reverse_proxy https://ws.reactive.chat {
header_up Host ws.reactive.chat
header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
header_up X-RC-Client-IP {remote_host}
header_up -Cookie
header_up -Authorization
transport http {
tls_server_name ws.reactive.chat
}
flush_interval -1
}
}
handle /api/offline/* {
reverse_proxy https://ws.reactive.chat {
header_up Host ws.reactive.chat
header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
header_up X-RC-Client-IP {remote_host}
header_up -Cookie
header_up -Authorization
header_down -Set-Cookie
transport http {
tls_server_name ws.reactive.chat
}
}
}
handle /api/suche/* {
reverse_proxy https://ws.reactive.chat {
header_up Host ws.reactive.chat
header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
header_up X-RC-Client-IP {remote_host}
header_up -Cookie
header_up -Authorization
header_down -Set-Cookie
transport http {
tls_server_name ws.reactive.chat
}
flush_interval -1
}
}
handle {
reverse_proxy https://cdn.reactive.chat {
header_up Host cdn.reactive.chat
header_up -X-RC-Proxy-Key
header_up -X-RC-Client-IP
header_up -Cookie
header_up -Authorization
header_down -Set-Cookie
transport http {
tls_server_name cdn.reactive.chat
}
}
}
}
Beş kontrol adımı
Her adım “Tamam”, “Hata”, “Not” veya “kontrol edilmedi” gösterir. Kontrol yalnızca beş kez “Tamam” ile başarılıdır. Kontroller 443 numaralı portta yalnızca HTTPS kullanır; yönlendirme yoktur, adım başına 5 saniye.
- Ad çözümleme – A/AAAA mevcut, tüm adresler genel erişime açık. Sonraki tüm adımlar tam olarak bu adrese bağlanır.
- Alan adınız üzerinden loader.js – dosya yüklenip bizimkiyle karşılaştırılır. Bağlantı, yanıt veya geçerli sertifika yoksa kalan adımlar atlanır. Yönlendirme hatadır; farklı dosya önbelleği veya
/için yanlış hedefi işaret eder. - Anahtar ve ziyaretçi adresi –
/rc_wss/eigene-domain-probeçağrısı. Olası hatalar:X-RC-Proxy-Keyeksik; anahtar bilinmiyor (oluşturulduktan hemen sonra en fazla 30 saniye gecikme);X-RC-Client-IPeksik veya geçersiz; anahtar başka projeye ait. Anahtar geçerli ancak farklı ana makine için kayıtlıysa not gösterilir. - WebSocket –
wss://chat.your-company.com/rc_wss/, HTTP 101 verc.v1alt protokolüyle yanıt vermelidir. - Çevrimdışı form –
GET /api/offline/SITE_KEY, 405 ile yanıt vermelidir (uç nokta yalnızca POST kabul eder; böylece mesaj oluşturulmaz).
Kontrol adresini 3. adımda gösterildiği gibi kendiniz de çağırabilirsiniz:
curl -s https://chat.your-company.com/rc_wss/eigene-domain-probe
Doğru kurulumda:
{"rc":"eigene-domain-probe","v":1,"schluessel":"gueltig","client_ip":"gesetzt","site":"SITE_KEY","host":"chat.your-company.com"}
- schluessel –
gueltig(geçerli),unbekannt(bilinmiyor) veyafehlt(eksik). - client_ip –
gesetzt(ayarlanmış),fehlt(eksik) veyaungueltig(geçersiz). - site, host – yalnızca geçerli anahtarla. Yanıt asla adres döndürmez.
Proxy anahtarı
- Yenileme: Yeni anahtar oluştur hemen yenisini verir; önceki 24 saat geçerli kalır. En fazla iki geçerli anahtar bulunur; 24 saat içinde tekrar yenileme en eski anahtarı hemen geçersiz kılar.
- Kaldırma: Anahtarı kaldır hemen geçersiz kılar (devam eden yenilemeden kalan eski anahtar dâhil). Özel alan adını kaldır, ana makine adını ve anahtarı birlikte kaldırır; önce web sitenizdeki kodu normaline döndürün.
- Eksik veya yanlış anahtar: Sohbet çalışmaya devam eder, ancak iki başlık yok sayılır. Tüm ziyaretçiler proxy adresinizle görünür; kötüye kullanım koruması adres başına saydığından tüm proxy’yi, dolayısıyla tüm ziyaretçileri aynı anda hız sınırlamasına tabi tutabilir.
- Anahtar başına bir proje: Başka projenin site anahtarını kullanan widget, geçerli anahtarlı proxy üzerinden bağlanırsa bağlantı reddedilir. Ek proje için kendine ait anahtarlı ayrı alt alan adı gerekir.
- Anahtar sızdırıldı: Anahtarı bilen herkes projeniz için istediği ziyaretçi adresini belirtebilir. Kaldırın, yenisini oluşturup girin.
Sorun giderme
- HTTP 421 (Misdirected Request): Proxy hedef adı yerine sizin adınızı Host olarak gönderir. nginx:
proxy_set_header Hostileproxy_ssl_server_name on/proxy_ssl_name; Apache:ProxyPreserveHost Off; Caddy:header_up Hostvetls_server_name. - Hedefe bağlantıda HTTP 502 / TLS hatası: Apache üzerinde
SSLProxyVerifyDepth 5yok; nginx üzerindeproxy_ssl_trusted_certificateyolu yanlış veyaproxy_ssl_server_name onyok; dışarıya HTTPS engelli. - Yüklerken HTTP 413: Ayar olmadan nginx yalnızca 1 MB kabul eder;
/rc_wss/bölümündeclient_max_body_size 32m(ve öndeki yük dengeleyicide en az aynı sınır). - WebSocket yükseltmesi yok:
Upgrade/Connectioniletilmiyor. Sohbet HTTP yedeği üzerinden çalışır, ancak yalnızca iki başarısız WebSocket denemesinden sonra bağlanır. - Çevrimdışı form için 401:
/api/offline/önünde şifre koruması var. - Kaynak hakkında notla 403: Projede İzin verilen kaynaklar altında web sitesinin alan adı (sohbet alt alan adı değil!) eksik.
- 403 “Yanıt reactive.chat hizmetinden gelmiyor”: Hedef önündeki güvenlik duvarı veya erişim kuralı isteği reddediyor.
- DNS özel adrese yönleniyor (
10.0.0.0/8,192.168.0.0/16,100.64.0.0/10,fc00::/7…): Genel DNS kaydı genel erişime açık olmalıdır.
Sonraki: Taşıma ve protokol · Güvenlik ve CSP
अंतिम अपडेट: