Ji jiyana bi Kubernetes re: Çawa servera HTTP-ê ji Spanyolan re ne xweş kir

Ji jiyana bi Kubernetes re: Çawa servera HTTP-ê ji Spanyolan re ne xweş kir

Nûnerê muwekîlê me, ku stûna serîlêdana wî di ewrê Microsoft-ê (Azure) de dimîne, pirsgirêkek çareser kir: di van demên dawî de, hin daxwazên hin xerîdarên ji Ewrûpayê bi xeletiya 400 bi dawî bûn (Daxwaza xirab). Hemî serîlêdan di .NET-ê de têne nivîsandin, li Kubernetes têne bicîh kirin…

Yek ji serîlêdanan API ye, ku di dawiyê de hemî seyrûsefer tê. Ev seyrûsefer ji hêla servera HTTP ve tê guhdarî kirin kestrel, ji hêla muwekîlê .NET-ê ve hatî mîheng kirin û di nav podek de tête kirin. Digel debugkirinê, em di vê wateyê de bi şens bûn ku bikarhênerek taybetî hebû ku bi domdarî pirsgirêk ji nû ve hilberand. Lêbelê, her tişt ji hêla zincîra trafîkê ve tevlihev bû:

Ji jiyana bi Kubernetes re: Çawa servera HTTP-ê ji Spanyolan re ne xweş kir

Çewtiya di Ingress de wiha xuya bû:

{
   "number_fields":{
      "status":400,
      "request_time":0.001,
      "bytes_sent":465,
      "upstream_response_time":0,
      "upstream_retries":0,
      "bytes_received":2328
   },
   "stream":"stdout",
   "string_fields":{
      "ingress":"app",
      "protocol":"HTTP/1.1",
      "request_id":"f9ab8540407208a119463975afda90bc",
      "path":"/api/sign-in",
      "nginx_upstream_status":"400",
      "service":"app",
      "namespace":"production",
      "location":"/front",
      "scheme":"https",
      "method":"POST",
      "nginx_upstream_response_time":"0.000",
      "nginx_upstream_bytes_received":"120",
      "vhost":"api.app.example.com",
      "host":"api.app.example.com",
      "user":"",
      "address":"83.41.81.250",
      "nginx_upstream_addr":"10.240.0.110:80",
      "referrer":"https://api.app.example.com/auth/login?long_encrypted_header",
      "service_port":"http",
      "user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
      "time":"2019-03-06T18:29:16+00:00",
      "content_kind":"cache-headers-not-present",
      "request_query":""
   },
   "timestamp":"2019-03-06 18:29:16",
   "labels":{
      "app":"nginx",
      "pod-template-generation":"6",
      "controller-revision-hash":"1682636041"
   },
   "namespace":"kube-nginx-ingress",
   "nsec":6726612,
   "source":"kubernetes",
   "host":"k8s-node-55555-0",
   "pod_name":"nginx-v2hcb",
   "container_name":"nginx",
   "boolean_fields":{}
}

Di heman demê de, Kestrel got:

HTTP/1.1 400 Bad Request
Connection: close
Date: Wed, 06 Mar 2019 12:34:20 GMT
Server: Kestrel
Content-Length: 0

Tewra bi lêkera herî zêde, xeletiya Kestrel pir zêde bû agahiyên kêrhatî kêm:

{
   "number_fields":{"ThreadId":76},
   "stream":"stdout",
   "string_fields":{
      "EventId":"{"Id"=>17, "Name"=>"ConnectionBadRequest"}",
      "SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
      "ConnectionId":"0HLL2VJSST5KV",
      "@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
      "@t":"2019-03-07T13:06:48.1449083Z",
      "@x":"Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Malformed request: invalid headers.n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.<ProcessRequestsAsync>d__185`1.MoveNext()",
      "message":"Malformed request: invalid headers."
   },
   "timestamp":"2019-03-07 13:06:48",
   "labels":{
      "pod-template-hash":"2368795483",
      "service":"app"
   },
   "namespace":"production",
   "nsec":145341848,
   "source":"kubernetes",
   "host":"k8s-node-55555-1",
   "pod_name":"app-67bdcf98d7-mhktx",
   "container_name":"app",
   "boolean_fields":{}
}

Wusa dixuye ku tenê tcpdump dê alîkariya çareserkirina vê pirsgirêkê bike ... lê ez ê di derbarê zincîra trafîkê de dubare bikim:

Ji jiyana bi Kubernetes re: Çawa servera HTTP-ê ji Spanyolan re ne xweş kir

Lêkirin

Diyar e, çêtir e ku meriv guh bide trafîkê li ser wê girêka taybetî, li cihê ku Kubernetes podek bi cih kiriye: qebareya avêtinê dê wusa be ku dê bi kêmanî tiştek zû zû were dîtin. Û bi rastî, dema ku ew lêkolîn kir, çarçoveya jêrîn hat dîtin:

GET /back/user HTTP/1.1
Host: api.app.example.com
X-Request-ID: 27ceb14972da8c21a8f92904b3eff1e5
X-Real-IP: 83.41.81.250
X-Forwarded-For: 83.41.81.250
X-Forwarded-Host: api.app.example.com
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Original-URI: /front/back/user
X-Scheme: https
X-Original-Forwarded-For: 83.41.81.250
X-Nginx-Geo-Client-Country: Spain
X-Nginx-Geo-Client-City: M.laga
Accept-Encoding: gzip
CF-IPCountry: ES
CF-RAY: 4b345cfd1c4ac691-MAD
CF-Visitor: {"scheme":"https"}
pragma: no-cache
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
referer: https://app.example.com/auth/login
accept-language: en-US,en;q=0.9,en-GB;q=0.8,pl;q=0.7
cookie: many_encrypted_cookies; .AspNetCore.Identity.Application=something_encrypted; 
CF-Connecting-IP: 83.41.81.250
True-Client-IP: 83.41.81.250
CDN-Loop: cloudflare

HTTP/1.1 400 Bad Request
Connection: close
Date: Wed, 06 Mar 2019 12:34:20 GMT
Server: Kestrel
Content-Length: 0

Li ser vekolîna ji nêz ve ya çopê, peyv hate dîtin M.laga. Hêsan e ku meriv texmîn bike ku li Spanyayê bajarek M.laga tune (lê heye Málaga). Li ser vê ramanê sekinîn, me li mîhengên Ingress nihêrî, li wir me ya ku mehek berê hate xistin (li ser daxwaza xerîdar) dît. perçeyek "bê zirar".:

    ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header X-Nginx-Geo-Client-Country $geoip_country_name;
      proxy_set_header X-Nginx-Geo-Client-City $geoip_city;

Piştî neçalakkirina şandina van sernivîsan, her tişt baş bû! (Zû zû eşkere bû ku serîlêdan bixwe êdî ne hewceyî van sernivîsan e.)

Niha em li pirsgirêkê binêrin bi giştîtir. Ew dikare bi hêsanî di hundurê serîlêdanê de bi çêkirina daxwazek telnet ve were nûve kirin localhost:80:

GET /back/user HTTP/1.1
Host: api.app.example.com
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
Cookie: test=Desiree

... vedigere 401 Unauthorized, wekî ku tê hêvî kirin. Ger em bikin çi dibe:

GET /back/user HTTP/1.1
Host: api.app.example.com
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
Cookie: test=Désirée

?

Dê vegere 400 Bad request - di têketina serîlêdanê de em ê xeletiyek ku jixwe ji me re nas e bistînin:

{
   "@t":"2019-03-31T12:59:54.3746446Z",
   "@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
   "@x":"Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Malformed request: invalid headers.n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.<ProcessRequestsAsync>d__185`1.MoveNext()",
   "ConnectionId":"0HLLLR1J974L9",
   "message":"Malformed request: invalid headers.",
   "EventId":{
      "Id":17,
      "Name":"ConnectionBadRequest"
   },
   "SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
   "ThreadId":71
}

Encam

Bi taybetî Kestrel nikare Sernivîsên HTTP-ê bi tîpên rast ên di UTF-8-ê de, ku di navên hejmareke pir mezin a bajaran de hene, rast bişopînin.

Di doza me de faktorek din ev e ku xerîdar naha plan nake ku pêkanîna Kestrel di serîlêdanê de biguhezîne. Lêbelê, pirsgirêkên di AspNetCore bixwe de (No.4318, No.7707) ew dibêjin ku ev ê ne alîkar be...

Bi kurtasî: not êdî ne li ser pirsgirêkên taybetî yên Kestrel an UTF-8 (di sala 2019 de?!), lê li ser vê yekê ye ku hişmendî û xwendina domdar Her gava ku hûn li pirsgirêkan digerin, zû an dereng dê fêkiyê bide. Bextxweş bî!

PS

Li ser bloga me jî bixwînin:

Source: www.habr.com

Add a comment