VPN асаалттай, дотоод самбар хөтөч дээр нээгддэг ч Python скрипт прокси алдаа гарсаар байна. Тэр зурагт туннельд ямар ч асуудал байхгүй: интерпретатор өөрийн орчноос прокси хаягийг уншиж, хүсэлтийг тийшээ илгээж байна. Энэхүү заавар нь процессын үнэхээр харж буй орчныг уншиж, хамгийн нарийн хасалтыг хэрэглэж, дараа нь л тодорхой сессийн бодлогыг авч үздэг. Алхам бүр гаралт нь үргэлжлүүлэх эсэхийг шийддэг командаар төгсдөг.

Процессын үнэхээр харж буй орчныг уншина уу

Ширээний прокси тохиргоо, shell экспорт, systemd нэгжийн Environment= мөрүүд нь гурван өөр эх сурвалж бөгөөд Requests зөвхөн өвлөж авсан сүүлчийнхийг л уншдаг. Доорх оношилгоог бүтэлгүйтэж буй скриптийг ажиллуулж буй ижил shell, контейнер эсвэл нэгжид ажиллуулна уу, интерактив терминалд биш. Таны нэвтрэх shell-д экспортолсон хувьсагч контейнер процессод харагдахгүй бөгөөд энэ зөрүү нь хаанаас ч гарч ирдэг прокси тухай олон мэдээллийг тайлбарладаг. Хоёр команд ижил өгөгдлийг өөр дэлгэрэнгүй түвшинд хэвлэдэг.

env | grep -i -E 'proxy|requests_ca_bundle|curl_ca_bundle'
python3 -c "import os;[print(k,'=',v) for k,v in sorted(os.environ.items()) if 'proxy' in k.lower()]"

Хувьсагч бүрийн хоёр бичлэгийг уншиж, давхардсан бичлэгүүдийг процесс хүлээн авсан дарааллаар хэрэглэдэг тул хуучирсан HTTP_PROXY саяхан экспортолсон утгыг дарж болно. CA багцын хувьсагчид энд бас чухал, учир нь тэд кодонд хаана ч харагдахгүйгээр verify юунд шийдэгдэхийг өөрчилдөг. Гаралт хоосон бол орчин таны асуудал биш бөгөөд энэ хэсгийг уншихаа болино. Хэрэв танихгүй прокси жагсаасан бол ямар нэгэн зүйл өөрчлөхөөс өмнө түүнийг тохируулж буй файл эсвэл нэгжийг олно уу.

Requests-ээс тодорхой URL-тэй юу хийхийг асууна уу. Энэ дуудлага багц илгээхгүйгээр тухайн хүсэлтийн нэгтгэсэн прокси, verify, cert утгуудыг харуулна.

python3 -c "import requests;s=requests.Session();print(s.merge_environment_settings('https://api.corp.example/status',{},None,None,None))"

Хувийн хост-д зориулсан хоосон бус proxies бичлэг нь таны хариулт бөгөөд хэвлэгдсэн verify утга нь хүсэлт ямар CA багцад итгэхийг хэлнэ. Хоёулаа зөв харагдаж байвал алдаа нь стекийн дараа байгаа тул шалгалтын хэсэг рүү шилжих хэрэгтэй. Кодоос таамаглах хэрэггүй: нэгтгэлт хүсэлт бүрт явагддаг тул нэг сесс хоёр хост-д өөрөөр ажиллаж болно.

Ямар нэгэн зүйлийг идэвхгүй болгохын өмнө хувийн хост-ыг хасна уу

Прокси бусад чиглэлд үнэхээр шаардлагатай бол нарийн засвар нь энэ хост-ыг хасах явдал юм. Одоо байгаа жагсаалтад нэмэх бөгөөд түүнийг солихгүй байх хэрэгтэй, учир нь NO_PROXY-г устгах нь түүнд найдаж байсан бусад бүх дотоод чиглэлийг эвдэнэ. Доорх командууд бичлэгийг нэмж, дараа нь Requests-ээс тойрч гарах эсэхийг асууна.

export NO_PROXY="${NO_PROXY:+$NO_PROXY,}api.corp.example,.corp.example"
python3 -c "import requests;print(requests.utils.should_bypass_proxies('https://api.corp.example/status',None))"

Тохирол нь хост-ын дагавараар явагддаг тул .corp.example бүх домайныг, api.corp.example зөвхөн нэг нэрийг хамарна. Ганц од бүх хост-д проксиг идэвхгүй болгодог бөгөөд үйлдвэрлэлийн ажил үүнийг бараг хэзээ ч хүсдэггүй. CIDR бичлэгийг хүндэтгэх эсэх нь дүрс дэх Requests болон urllib3 хувилбараас хамаардаг тул ажиллана гэж таамаглахын оронд яг бичлэгийг туршина уу. should_bypass_proxies-ийн үр дүнг бодит URL-д шалгана уу, ой санамжаас бичсэн хост нэрэнд биш.

Хоёр давхаргыг оюундаа тусгаар байлгана уу. HTTP проксиг тойрох нь VPN-ийг тойрохгүй, учир нь прокси шийдвэр номын санд, туннелийн шийдвэр цөмийн чиглүүлэлтийн хүснэгтэд гардаг.

trust_env-ийг зөвхөн санаатай сессийн бодлого болгон идэвхгүй болгоно уу

Хэрэв бүх ажил орчны тохиргоог үл тоомсорлох ёстой бол сессийг тодорхой байгуулж, шийдвэрийг кодонд тэмдэглэнэ үү. Энэ бол бодлого, тойрч гарах арга биш бөгөөд шүүмжлэгчийн харж болох diff-д хамаарна. Доорх жишээ нь таймаут, тодорхой CA зам, төлөв шалгалтыг хадгалдаг.

import requests

with requests.Session() as session:
    session.trust_env = False
    response = session.get(
        "https://api.corp.example/status",
        timeout=(5, 20),
        verify="/etc/ssl/certs/corp-ca.pem",
    )
    response.raise_for_status()

trust_env-г унтраах нь гурван зан төлөвийг нэгэн зэрэг өөрчилдөг бөгөөд зөвхөн нэг нь прокситой холбоотой. Requests .netrc итгэмжлэлүүдийг уншихаа болиж, REQUESTS_CA_BUNDLE болон CURL_CA_BUNDLE хувьсагчид verify-д нөлөөлөхөө болино, энэ нь дараа нь багцлагдсан сертификатын санд буцдаг. Хэрэв танай байгууллага TLS-ийг өөрийн CA-аар дуусгадаг бол энэ буцалт нь саяхан хийсэн өөрчлөлттэй холбоогүй мэт харагдах шалгалтын алдаа үүсгэдэг. verify-г тодорхой дамжуулах нь хоёр нөлөөг тусгаар байлгадаг.

Хийх ёсгүй зүйл бол үүссэн алдааг намжаахын тулд verify=False-г тохируулах явдал юм. Энэ нь проксигийн буруу тохиргоог шалгагдаагүй холболтоор сольж, хасалт илрүүлэх ёстой байсан сертификатын асуудлыг нуудаг.

Бүтэлгүйтэж буй давхаргыг шалгаж, буцаах боломжийг хадгална уу

Гурван алдаа лог дээр ижил харагдах бөгөөд нийтлэг зүйл байхгүй: чиглэлд хүрч чадахгүй прокси ProxyError шидэх эсвэл 502 буцаадаг, итгэлцлийн асуудал SSLError шиддэг, аппликейшны татгалзал 401 эсвэл 403 буцаадаг. Аль нь болохыг харахын тулд хүсэлтийг Requests-ээс гадна дахин гаргана уу. Доорх командууд проксиг арилгаж, сертификатын гинжийг туршиж, дараа нь дуудлагыг номын сангаар давтана.

curl -sv --noproxy '*' https://api.corp.example/status -o /dev/null
openssl s_client -connect api.corp.example:443 -servername api.corp.example </dev/null
python3 -c "import requests;r=requests.get('https://api.corp.example/status',timeout=10);print(r.status_code)"

curl дуудлага амжилттай, Python дуудлага бүтэлгүй бол ялгаа нь орчин хэвээр байна. Хоёулаа TLS үе шатанд бүтэлгүй бол прокси хэзээ ч асуудал байгаагүй бөгөөд асуудал нь сертификатын гинж юм. Хоёулаа 401 буцаавал хүсэлт аппликейшнд хүрсэн бөгөөд үлдсэн ажил нь баталгаажуулалт юм. Гурвын алийг нь ажигласнаа тэмдэглэх нь дараагийн хүнд нэг цаг хэмнэнэ.

Буцаах нь хоёр чиглэлд нэг мөр: хасалтыг арилгах эсвэл trust_env-г буцаана. Ямар нэгэн зүйл нэмэхийн өмнө өмнөх NO_PROXY утгыг хадгалж, зөвхөн терминалын түүхэнд амьдардаг экспортоос илүү боох скрипт эсвэл нэгжийн түвшний Environment= бичлэгийг илүүд үзээрэй. Хоёр өөрчлөлт процессын орчинд харагддаг тул дахин эхлүүлэх нь ихэвчлэн хуучин зан төлөвт буцаадаг.

Дөрвөн зүйлийг баталгаажуулж дуусгана уу: хувийн URL-ийн нэгтгэсэн тохиргоо ямар ч прокси харуулахгүй, сертификат зорилтот CA-д баталгаажина, хүсэлт таны хүлээж буй төлөвийг буцаана, өөрчлөлт нь дахин үүсгэх боломжтой газарт commit хийгдсэн. Тайлбаргүй орчинтой ногоон скрипт бол дараагийн машин дээр дахин эвдрэх засвар юм. Энэхүү зааврын командууд нь тасалбарт буулгах ёстой командууд юм.

Холбоотой нийтлэлүүд