|
<< İçindekileri Görüntülemek İçin Tıklayın >> Yer: Teknik Kılavuzlar > Netsim System Agent Kurulum ve Yönetim Kılavuzu > 4. Yapılandırma > 4.5 netServer — dinleyiciler ve sınırlar |
netServer.listenerList altındaki her girdi bir ip/port çiftine bağlanır.
Sanal sunucular bindListeners ile dinleyicinin adına başvurur.
| Ayar | Öndeğer | Açıklama |
|---|---|---|
ip / port | 0.0.0.0 / — | Dinlenecek adres ve port. Linux'ta 1024 altı port ayrıcalık ister. |
workerModel | multiProcess | multiProcess: her istek ayrı süreçte (yalıtım). multiThread: aynı süreçte iş parçacığı. |
useSSL / SSLCertificate | false | TLS ve kullanılacak sertifikanın certificateList içindeki adı. |
limits.maxConnections | 400 | Aynı anda işlenen bağlantı. Aşılırsa yeni bağlantı 503 ile reddedilir; 0 = sınırsız. |
limits.maxConnectionsPerClient | 200 | Aynı istemciden (aynı IP) aynı anda işlenen bağlantı. Aşılırsa yeni bağlantı 503 ile reddedilir; 0 = sınırsız. |
allowedNetworks | yok | Bu dinleyiciye bağlanabilen istemci ağları (IPv4 CIDR listesi, en fazla 16; örnek ["10.0.0.0/8", "192.168.1.20"]). Verilmezse süzgeç yoktur. Listede olmayan istemcinin bağlantısı kabul anında, hiçbir yanıt yazılmadan kapatılır ve günlüğe yazılır. Geçersiz bir girdi ajanın açılışını durdurur. |
limits.keepAliveTimeout | 600 saniye (10 dk) | Sonraki isteği beklerken boşta duran bağlantının ömrü; süre dolunca sunucu bağlantıyı kapatır. 0 = sınırsız. |
limits.maxContentSize | 200000000 bayt | En büyük istek gövdesi. Bu dinleyicideki bütün HTTP istekleri için geçerlidir — aşağıya bakın. |
limits.maxContentInMemory | 1000000 bayt | Gövdenin bellekte tutulacağı üst sınır; aşan gövde geçici bir dosyaya alınır. 0 = sınır yok (her gövde bellekte). |
limits.maxHeaderLines | 255 | İstek başlığında kabul edilen satır sayısı. |
limits.requestTimeoutMS | 30000 (30 sn) | Bir isteğin başlık + gövde okumasının tamamı için duvar saati sınırı. Süre dolarsa istek 408 alır ve bağlantı kapanır. 0 = sınırsız. İstekler arasındaki boşluğu bu değil keepAliveTimeout bağlar. |
limits.maxHeaderLineSize / maxHeaderTotalSize | 16384 / 65536 bayt | Tek başlık satırının ve bütün başlıkların toplam boyutu; aşan istek 400 alır. 0 = sınırsız. |
limits.sendTimeoutMS / recvTimeoutMS | 6000 | Gönderme / alma zaman aşımı; sokete uygulanır. Ad sonundaki MS bilerek — bkz. aşağıdaki birim tablosu. |
limits.poolTimeoutMS | 600000 (10 dk) | Havuzdaki bir işçinin yeni görev beklerken ayakta kalma süresi. Havuzlamanın tek düğmesi budur: 0 verilirse işçi süreç havuza hiç alınmaz, her istek yeni bir süreçle karşılanır. |
limits ayarı gerçekten çalışıyorBu blok, uygulanan ve okunup yok sayılan ayarları bir arada taşır:
| Ayar | Birim | Durum |
|---|---|---|
maxContentSize | bayt | Etkin (bkz. yukarısı). |
maxContentInMemory | bayt | Etkin — bunu aşan gövde <TEMP>/netsim-body-<pid>-<rastgele>.tmp dosyasına alınır. Dosya açılışta silinmek üzere işaretlenir, yani süreç çökse bile geride kalmaz; kurulamazsa belleğe düşülür ve istek reddedilmez. chunked gövdede boyut önceden bilinmediği için bellekte başlanır ve eşik aşılınca dosyaya taşınır. |
maxHeaderLines | satır | Etkin. |
requestTimeoutMS | ms | Etkin — istek başına toplam okuma süresi; başlık ve gövde aynı deadline'ı paylaşır (chunked gövde dâhil). recvTimeoutMS'in yerini almaz: o okuma başınadır ve her okumaya zamanında tek bir bayt yetiştiren bir istemcide hiç tetiklenmez. Süre okumalar arasında denetlendiği için sürede küçük bir aşma olabilir — en çok bir okuma, yani recvTimeoutMS kadar. Giden isteklerde (istemci tarafı) deadline yoktur, yoksa büyük bir indirme yarıda kesilirdi. |
maxHeaderLineSize / maxHeaderTotalSize | bayt | Etkin — satır okunduğu anda denetlenir, yani sınırı aşan başlık biriktirilmeden reddedilir. İstek ve yanıt okumasında birden geçerlidir. |
sendTimeoutMS / recvTimeoutMS | ms | Etkin — kabul edilen soketin gönderme/alma zaman aşımına yazılır. Birim ILTcpSocket::isReady'de tv_sec = değer / 1000 ile doğrulandı. |
poolTimeoutMS | ms | Etkin — işçi süreç havuzda bu süre kadar yeni görev bekler; değer doğrudan ILTimeout(ms)'e geçer, öndeğer 10 × 60000. |
keepAliveTimeout | saniye | Etkin — öndeğer 600 (10 dk). Keep-alive iki işçi modelinde iki ayrı yerde yürüdüğü için sınır da iki yerde uygulanır — bkz. bir alttaki başlık. |
maxConnections | adet | Etkin — accept sonrası, işçiye dağıtmadan önce denetlenir. Canlı sayı multiProcess'te havuzda beklemeyen “TCP Net Worker” süreçlerinden okunur, multiThread'te dinleyicinin kendi sayacından. Aşılırsa HTTP dinleyicisinde 503 + Retry-After: 5 yazılıp bağlantı kapatılır (HTTP dışı dinleyicide sadece kapatılır). Dinlemek durmaz, yer açılınca yeniden kabul edilir. |
maxConnectionsPerClient | adet | Etkin — IP kabul anında ham soket tutamacından okunur (getpeername), sayım multiProcess'te paylaşılan süreç listesindeki istemci IP alanından, multiThread'te dinleyicinin kendi defterinden yapılır. Adres öğrenilemezse sınır uygulanmaz — bilinmeyen bir şey yüzünden bağlantı reddedilmez. |
Bu bloğun zaman aşımlarında birim ada yazılıdır: MS ile bitenler
milisaniye, bitmeyenler saniyedir.
Bir yanıt gönderildikten sonra bağlantının sürdürülmesine tek bir yerde karar verilir (yanıtın “bağlantıyı kapat” işareti yoksa sürdürülür), ama sonrası işçi modeline göre tamamen farklı çalışır:
workerModel | Sonraki isteği ne bekler |
|---|---|
multiProcess(öndeğer) |
Bağlantıyı işleyen alt sürecin kendi döngüsü: aynı soket aynı süreçte tutulur ve sonraki istek orada karşılanır. Dinleyicinin bekleyenler listesi bu modelde hiç devreye girmez. |
multiThread |
Dinleyicinin bekleyenler listesi: bağlantı park eder, kabul döngüsü her turda listeyi yoklar ve veri geldiğinde yeni bir işçi kurar. |
Üç ayar birlikte, bir isteğin işçi yuvasını süresiz tutmasını engeller. İzole bir örnekte
(requestTimeoutMS 4000, maxHeaderLineSize 512,
maxHeaderTotalSize 2048) davranış şöyledir:
| Senaryo | Sınır açık | Sınır kapalı (requestTimeoutMS: 0) |
|---|---|---|
| Başlıklar bitirilmeden saniyede bir satır damlatılıyor | 408, 5,7 sn | Yanıt gelmez — bağlantı istemci bırakana kadar (ör. 45 sn) açık kalır |
Bildirilen Content-Length'in yalnızca bir kısmı gönderiliyor | 408, 4,0 sn | 400, 6,0 sn (okuma başına recvTimeoutMS) |
| Tek başlık satırı 900 bayt | 400 | — |
| Toplam başlık ~3,7 KB | 400 | — |
| Sıradan istek | 200 | 200 |
İkinci satır ayrımı iyi gösteriyor: tamamen susan bir istemciyi okuma başına
recvTimeoutMS zaten keser; onun kesemediği, her okumaya zamanında bir bayt
yetiştiren istemcidir — birinci satır. Bu yüzden sınırı toplam süre koyar.
keepAliveTimeout her iki yolda da uygulanır. Örneğin
3 saniyeye ayarlı bir sunucu, yanıtı tamamen okuyup sessiz kalan bir istemcinin bağlantısını
~3 saniye sonra düzgün biçimde (FIN) kapatır ve günlüğe
keep-alive zaman asimi (3 sn) satırını yazar.
WebSocket bunun dışındadır. Yükseltmeden sonra bağlantı kendi çerçeve
döngüsüne girer ve keep-alive park yoluna hiç uğramaz; dolayısıyla
keepAliveTimeout bir WebSocket bağlantısına hiçbir modelde dokunmaz
(maxContentSize de çerçeveleri kapsamaz — bir alttaki başlık). Bir WebSocket
bağlantısının ömrünü istemcinin kapatması, oturumun kapanması ve oturum yöneticisinin
idleTimeout/lifeTime ayarları (saniye) belirler. Bir isteği işlenmekte
olan oturum (uzun bir UPGRADE LEVEL gibi) bu sürelerle kapatılmaz; boşta kalma süresi
istek bitince yeniden başlar.
maxContentSize neyi kapsarBu sınır uygulamaya değil dinleyiciye aittir. Gövde, isteği hangi uygulamanın
karşılayacağı belirlenip ona dağıtılmadan önce okunur, dolayısıyla aynı dinleyicideki
StaticFile, CRUD, MessageQueue,
ClientREST, AdminREST, WebDAV ve IoTGateway
isteklerinin hepsi aynı sınıra tabidir — WebDAV'a özgü bir ayar değildir. WebSocket
çerçeveleri bu sınırın dışındadır; IVEDI işlemcisinin çerçevelerini uygulamanın kendi
maxFrameSize alanı sınırlar. Farklı
bir sınır isteyen bir yüzeyi ayrı bir dinleyiciye almak gerekir; her
listenerList girdisinin kendi limits bloğu vardır. Uygulama başına
sınır diye bir ayar yoktur.
| Kapsam | Durum |
|---|---|
Gelen HTTP istek gövdesi (Content-Length'li ve chunked) |
Kapsamda. Aşan istek chunked olmayan yolda
414, chunked yolda gövde büyüdükçe reddedilir. |
| WebSocket çerçeveleri (yükseltmeden sonra) | Kapsam dışı. Çerçeveler ayrı bir yoldan okunur ve orada bir üst sınır uygulanmaz. |
| Ajanın kendi yaptığı giden HTTP çağrıları | Kapsam dışı. İstemci tarafı yanıt gövdesini sınırsız okur. |
Tampon istemcinin bildirdiği Content-Length değerine göre
önceden ayrılır — yani tek bir istek, tek bayt gövde göndermeden bu kadar yer
ayırtabilir. Bunun bellekteki payı maxContentInMemory ile sınırlıdır: eşiği aşan gövde geçici bir dosyaya alınır.
Dolayısıyla en kötü durum belleği maxConnections × maxContentInMemory
(öndeğerlerle 400 × 1 MB = 400 MB), kalanı ise disktir — maxConnections
× maxContentSize kadar geçici dosya yeri gerekebileceğini hesaba katın (öndeğerlerle
80 GB). İnternet'e açık bir kurulumda eşzamanlılığı ayrıca ağ düzeyinde de (güvenlik duvarı, ters
vekil) sınırlayın.