Անվան մեջ կա redirect բառը, ուստի այն փակցվում է location բլոկի մեջ, երբ VPN-ի հետևում գտնվող backend-ը հասանելի չէ։ Ոչինչ չի փոփոխվում, և ակնհայտ եզրակացությունն այն է, որ հրահանգը կոտրված է կամ այլ շարահյուսություն է պահանջում։ Իրականում եղածն ավելի պարզ ու քիչ շողոքորթ է՝ proxy_redirect-ը աշխատում է արդեն վերադարձած պատասխանի վրա, և այս տեղակայման մեջ ոչ մի հարցում այդքան հեռու չի հասել։

Երկու հրահանգ, երկու պահ մեկ հարցման մեջ

Հակադարձ պրոքսիով անցնող HTTP հարցումը հերթով անցնում է մի քանի որոշումներով, և երկու հրահանգները գտնվում են այդ հաջորդականության հակառակ ծայրերում։ Մեկը ընտրում է, թե ուր է գնում հարցումը։ Մյուսը խմբագրում է որոշակի վերնագրեր վերադարձող պատասխանի մեջ։

DirectiveWhen it actsWhat it can change
proxy_passBefore any bytes leave the proxyWhich upstream receives the request
proxy_redirectAfter the upstream respondsMatching Location and Refresh text

Այդ հերթականությունն է ամբողջ պատասխանը։ Եթե երկրորդ տողը երբեք չի կատարվում, որովհետև առաջինը ձախողվել է, երկրորդ հրահանգը սխալ կազմաձևված չէ, այն պարզապես անհասանելի է։ Ինչքան էլ վերագրեք երկրորդ տողը, պատասխանը, որը պետք է խմբագրեր, չի ստեղծվի։ Ախտորոշեք առաջին տողից դեպի դուրս, և շփոթեցնող վարքագիծը հանգում է բացակայող երթուղու կամ մերժված կապի։

Upstream-ի ընտրությունը proxy_pass-ինն է

Ենթադրենք՝ NGINX-ը աշխատում է հանրային մուտքի հոսթի վրա և իր VPN-ով հասնում է 10.40.0.20:8080 հասցեում գտնվող հավելվածին։ Այդ հավելվածն ընտրող հատվածը այսպիսի տեսք ունի՝ գոյություն ունեցող server բլոկի ներսում:

location / {
    proxy_pass http://10.40.0.20:8080;
}

Օգտագործեք իրական սխեման, հասցեն ու պորտը, և դա համարեք հատված, ոչ թե տեղակայում։ Մուտքի հոսթը նաև պետք է պահի VPN երթուղին, թույլատրված փոխանցման ուղին և աշխատող վերադարձի տրաֆիկը դեպի այդ ծառայությունը, որովհետև թղթի վրա հասցեին հասնող պրոքսին դեռ պետք է միջուկի համաձայնությունը։

proxy մոդուլի տեղեկատուն upstream-ի ընտրությունը առանձին է պահում պատասխանի վերնագրերի վերագրումից և նշում է, որ URI պարունակող proxy_pass արժեքը փոխում է, թե ինչպես է փոխարինվում համապատասխան location նախածանցը։ Ուղու բաղադրիչներ ավելացնելը կամ հեռացնելը՝ առանց հավելվածի սպասած URL-ը ստուգելու, 404 ստեղծելու հուսալի ձև է, որը նման է երթուղավորման ձախողման։

proxy_redirect-ը ուղղում է մասնավոր հասցե արտահոսող պատասխանները

Երբ տրաֆիկը սկսում է հոսել, backend-ը կարող է պատասխանել Location վերնագրով, որը նշում է իր մասնավոր հասցեն։ Այդ վերնագրին հետևող դիտարկիչը թողնում է հանրային մուտքի կետը և փորձում հասնել մի բանի, որը չի կարող լուծել։ Դիտավորյալ կազմաձևված պատասխանի վերագրումը մասնավոր URL-ը քարտեզագրում է հանրայինի վրա:

proxy_redirect http://10.40.0.20:8080/ https://app.example.com/;

Փոխարինեք երկու կողմերն էլ իրական արժեքներով։ Հասկացեք նաև նեղ շրջանակը՝ համապատասխան Location և Refresh վերնագրերի տեքստը վերագրվում է, իսկ HTML-ում, JavaScript-ում կամ ներբեռնված ֆայլերում ներկառուցված URL-ները՝ ոչ։

Եթե հավելվածը ամենուր բացարձակ հղումներ է կառուցում, կայուն լուծումը նրա սեփական արտաքին URL-ի կազմաձևն է, ոչ թե պրոքսիի վրա աճող վերագրման կանոնների ցանկը։ Կանոններ ավելացնելը, մինչև ելքը ճիշտ տեսք ունենա, ստեղծում է կազմաձև, որը ձախողվում է առաջին էջում, որը ոչ ոք չի փորձարկել։ Հավելվածի մեկ ճիշտ կարգավորում փոխարինում է ամբողջ հավաքածուն։

Ինչ չի կարող ուղղել վերնագրի վերագրումը

Մի քանի հարակից խնդիրներ նման են վերահասցեավորման խնդիրների, բայց այդպիսին չեն։ Upstream-ին ուղարկվող Host վերնագիրը կարող է պահանջել համապատասխանել backend-ի վիրտուալ հոսթին։ TLS upstream-ը կարող է պահանջել կոնկրետ սերվերի անուն և վկայագրի ստուգում, և պատասխանի վերնագրի վերագրումը ոչ մեկին չի օգնում։

Cookie-ների շրջանակը և դոմենի ատրիբուտները պատկանում են հավելվածին և նրա կազմաձևին։ Պրոքսին կարող է ամբողջ օրը գցել կամ վերագրել վերնագրեր և այնուամենայնիվ ստեղծել սեսիա, որը ձախողվում է երկրորդ հարցման ժամանակ, որովհետև cookie-ն տրվել է հոսթի համար, որը դիտարկիչը երբեք չի այցելել։ Այդ ձախողումը ընդհատվող է թվում, դրա համար էլ այդքան երկար է ապրում տոմսերի հերթում։ Cookie-ի դոմենը կարդալը սովորաբար մեկ րոպեում ավարտում է հետաքննությունը։

Նույնպես պահեք նույնականացումը և backend-ի ընտրությունը նախատեսված հավելվածի սահմաններում։ Հանրային հակադարձ պրոքսին պետք է մեկ հավելված բացահայտի սերվերի VPN-ով, փոխարենը՝ դառնալու ընդհանուր դարպաս դեպի յուրաքանչյուր մասնավոր հասցե, որին այդ հոսթը կարող է հասնել։ Մեկ ընդհանուր location, որը փոխանցում է այն ամենը, ինչ խնդրում է կանչողը, մեկ բացահայտված ծառայությունը վերածում է ձեր մասնավոր ցանցի քարտեզի։ Անվանեք upstream-ը հստակ և թողեք այնտեղ։

Փորձարկեք այն հերթականությամբ, որով անցնում է հարցումը

Հերթով հաստատեք երեք բան՝ NGINX-ը ընտրեց նախատեսված location-ը, ավարտեց հարցումը դեպի backend, և դիտարկիչը հետևեց ցանկացած հետագա վերահասցեավորման ու բեռնեց ենթապաշարները։ Յուրաքանչյուր քայլ ունի իր լոգի տողերը, և դրանք հերթով կարդալը անորոշ 502-ը դարձնում է կոնկրետ հայտնագործություն։

Ձեզ անհրաժեշտ տարբերությունը ձախողված upstream կապի և անհասանելի մասնավոր անվան ուղարկված դիտարկիչի միջև է։ Առաջինը երևում է պրոքսիի սխալների լոգում, երկրորդը՝ որպես հարցում, որը երբեք չի հասնում, մինչ դիտարկիչը բողոքում է հոսթից, որը չի կարող լուծել։ Երկու տարբեր խնդիր, երկու տարբեր ֆայլ, և դրանցից միայն մեկն է առնչվում proxy_redirect-ին։

Առնչվող հոդվածներ