ตอนนี้บน Stack Overflow ยังมีคนจำนวนไม่น้อยที่เชื่อว่า Axios “พังแบบเงียบ ๆ” เวลาใช้ HTTPS proxies ความเชื่อนี้โผล่ซ้ำแล้วซ้ำอีกในบทความสอน Node.js proxy แต่ไม่ได้สะท้อนเวอร์ชันล่าสุดที่ใช้ทดสอบในคู่มือนี้ ผมลองตั้งชุดทดสอบภายในเครื่องจริง โดยมีทั้งต้นทางแบบ HTTP และ HTTPS อยู่หลัง proxy สองตัว และ Axios 1.19.0 ก็ส่งคำขอ HTTPS ผ่าน CONNECT tunnel ได้ถูกต้อง แทนที่จะเลี่ยง proxy ไปตรง ๆ
แต่ไม่ได้แปลว่าปัญหาที่คนเจอกันนั้นไม่มีจริง Axios เวอร์ชันเก่ามีบั๊กจริง (ดูหลักฐานได้จาก issue #3384 และ issue #4531) และ Node รุ่นใหม่ยังเพิ่มเส้นทางจัดการ proxy ผ่าน environment มาอีกชั้น ซึ่งต้องตั้งค่าอย่างระวัง คู่มือนี้จะพาคุณดูว่าอะไรใช้ได้จริงกับ Axios 1.19.0 ในปัจจุบัน วิธีเชื่อม proxy เข้ากับ request แบบต่าง ๆ รูปแบบ rotation ผ่าน interceptor ที่แทบไม่มีบทความไหนพูดถึง และตารางรวม error พร้อมวิธีแก้แบบครบถ้วนเผื่ออะไร ๆ จะผิดพลาดขึ้นมา
Axios Proxy คืออะไร และทำไมถึงสำคัญใน Node.js?
ในบริบทของ Axios, proxy ก็คือเซิร์ฟเวอร์ตัวกลางที่คั่นอยู่ระหว่างโปรเซส Node ของคุณกับเว็บไซต์ปลายทาง คำขอของคุณจะถูกส่งไปที่ proxy ก่อน จากนั้น proxy จะส่งต่อไปยังปลายทาง และฝั่งปลายทางจะเห็น IP ของ proxy แทนที่จะเป็น IP ของคุณ นั่นแหละคือกลไกทั้งหมด
นักพัฒนามักใช้วิธีนี้ด้วยเหตุผลหลัก ๆ เช่น การ scrape เว็บไซต์ที่จำกัดความถี่หรือบล็อกตาม IP, การทดสอบว่าแอปทำงานอย่างไรจากภูมิภาคอื่น, การส่งทราฟฟิกผ่านจุดออกขององค์กร, หรือแค่ต้องการไม่ให้ IP ของเซิร์ฟเวอร์ตัวเองไปโผล่ใน access logs ของปลายทาง เอกสาร config ของ request ใน Axios มีตัวเลือก proxy ในตัวที่รองรับฟิลด์ host, port, protocol และ auth — มีมานานแล้ว และเป็นสิ่งแรกที่ทุกบทความสอน (รวมถึงบทความนี้) มักจะพาคุณลอง
แต่สิ่งที่มักถูกมองข้ามคือ proxy ตัวนี้ทำงานต่างกันไปตามว่าเป้าหมายเป็น HTTP หรือ HTTPS และต่างกันด้วยว่าใช้ Axios เวอร์ชันไหนอยู่ จุดต่างตรงนี้เองคือเหตุผลทั้งหมดที่ทำให้คู่มือนี้ต้องมีอยู่
ตั้งค่า Node.js และ Axios เบื้องต้น
ข้ามส่วนนี้ได้เลยถ้าคุณมีโปรเจกต์อยู่แล้ว แต่ถ้ายังไม่มี ใช้เวลาแค่ประมาณสองนาที
mkdir axios-proxy-demo && cd axios-proxy-demo
npm init -y
npm install axios
เพิ่ม "type": "module" ใน package.json ถ้าคุณอยากใช้ ESM imports (ผมทำแบบนั้น — เพราะ require() แบบ CommonJS สำหรับเดโม proxy ดูตกยุคไปนิด) ตอนนี้ Node LTS คือ v24.18.0 แต่ผมทดสอบบน v22.22.3 โดยตั้งใจ เพื่อให้ผลลัพธ์ไม่ขึ้นกับความแปลกใหม่ล่าสุดของ runtime
ใส่โค้ดนี้ใน app.js แล้วรัน node app.js:
import axios from 'axios';
const res = await axios.get('https://httpbin.org/ip');
console.log(res.data);
คุณควรจะเห็น IP จริงของคุณกลับมาใน response นี่คือ baseline ของคุณ — พอ proxy ใช้งานได้ คำขอชุดเดิมนี้ควรแสดง IP ของ proxy แทน
ให้บันทึก response นี้ไว้ก่อนเปิด proxy เพราะมันเป็นค่ามาตรฐานที่ใช้เทียบกับผลลัพธ์เมื่อยิงผ่าน proxy ในขั้นตอนถัดไป
Axios รองรับ HTTPS Proxy จริงไหม? มาตรฐานที่ควรเข้าใจให้ตรง
คำตอบสั้น ๆ คือ ใช่ ใน stable release ปัจจุบัน Axios 1.19.0 อธิบายการใช้ CONNECT tunneling สำหรับ HTTPS target ที่อยู่หลัง HTTP proxy ไว้อย่างชัดเจน API ดาวน์โหลดของ npm บันทึกว่า Axios ถูกดาวน์โหลด 117,890,039 ครั้ง ระหว่าง 31 กรกฎาคมถึง 6 สิงหาคม 2026 ซึ่งเป็นตัวชี้วัดเก่าแต่ก็พอบอกได้ว่ามีการใช้งานแพร่หลายแค่ไหน เมื่อคุณเรียก URL แบบ HTTPS ผ่าน proxy, Axios รุ่นปัจจุบันจะส่ง CONNECT request เพื่อสร้าง tunnel และ TLS handshake จะเกิดขึ้นแบบ end-to-end กับ origin จริง ผมทดสอบเรื่องนี้โดยตรงแล้ว: ใช้ local HTTP proxy, local HTTPS origin ที่มี self-signed cert และนับ CONNECT บน proxy ก็เพิ่มขึ้นตรงตามที่ควรจะเป็น
แล้วทำไมคำว่า “Axios HTTPS proxy broken” ถึงโผล่ในแทบทุกกระทู้เรื่องนี้? มีหลายเหตุผล และล้วนมีมูลทั้งนั้น:
- Axios เวอร์ชันเก่า issue ที่คนชอบอ้างมักเก่าเป็นปี ๆ และอธิบายพฤติกรรมที่ขึ้นกับ release หรือ configuration เฉพาะ ไม่ควรเอาไปเหมารวมกับ Axios ปัจจุบัน
- proxy server ที่ไม่รองรับ CONNECT ถ้าตั้งค่าแบบนั้น tunnel จะล้มเหลว และ Axios ควรส่ง error ออกมา; ต้องจับเส้นทางจริงและ error จริงก่อนจะสรุปว่า proxy ถูก bypass
- เอา
proxyconfig ไปใช้ผิดความหมาย ตัวเลือกproxyเป็นคำสั่งสำหรับ forward proxy ไม่ใช่สวิตช์แบบ “ส่งทุกอย่างผ่าน agent ตัวนี้ไม่ว่าอะไรจะเกิดขึ้น”
Chromium รายงานในปี 2023 ว่าการนำทางกว่า 90% บน Chrome ทุกแพลตฟอร์มหลักใช้ HTTPS ตัวเลขนี้ก็เป็นข้อมูลเก่า ไม่ใช่การสำรวจทั้งเว็บแบบปัจจุบัน แต่ก็อธิบายได้ว่าทำไมพฤติกรรมกับ HTTPS target ถึงเป็นหัวใจของบทความนี้ ถ้าคุณใช้ Axios เวอร์ชันเก่า ให้ลองทำซ้ำบนสายเวอร์ชันปัจจุบันก่อนที่จะคิดว่าปัญหาเก่าจะยังอธิบายพฤติกรรมวันนี้ได้ และควรทดสอบการอัปเกรดในแอปจริงของคุณก่อนเอาไป deploy
ถ้ายังอยากใช้ explicit agent อยู่
native proxy config ใช้ได้ดีสำหรับ proxy แบบเดียว คงที่ และใช้งานแบบเดิมซ้ำ ๆ แต่พอคุณต้องการควบคุมราย request, หมุน proxy, หรือรองรับ SOCKS มันจะเริ่มไม่พอ เพราะตัวเลือก built-in ของ Axios ไม่ได้ออกแบบมาสำหรับงานนั้น นี่คือจุดที่ HttpsProxyAgent เข้ามามีบทบาท และผมจะไล่ให้ดูด้านล่าง มอง native option เป็นแบบ “พอใช้ได้สำหรับ proxy เดียว งานเดียว” ส่วน agent-based approach คือแบบ “สิ่งที่คุณอยากได้จริงใน production”
เส้นทาง Environment Proxy ของ Node v24 และ v22.21+
Node รุ่นใหม่มีโหมด environment-proxy ในตัว เปิดใช้งานผ่าน NODE_USE_ENV_PROXY=1 หรือ flag --use-env-proxy ตาม CLI docs ของ Node ฟีเจอร์นี้เข้ามาใน v24.0.0 และถูก backport ไปที่ v22.21.0 ด้วย ดังนั้นคำว่า “Node 22+” จึงไม่แม่นยำ — ต้องเป็น v22.21.0 ขึ้นไปเท่านั้น ถ้าคุณใช้ Node 22 patch ที่เก่ากว่านั้น flag นี้จะไม่มีให้ใช้
Axios เวอร์ชันปัจจุบันอ่าน HTTP_PROXY, HTTPS_PROXY และ NO_PROXY ผ่าน dependency proxy-from-env อยู่แล้ว ดังนั้น path นี้ไม่จำเป็นต้องใช้ global-agent สำหรับ Axios รุ่นปัจจุบัน พอ Node เปิด env-proxy mode ของตัวเองด้วย ก็อาจมีสองชั้นเข้ามาเกี่ยวข้องในการตัดสินใจเส้นทางการส่งทราฟฟิก
เอกสารของ Axios ระบุว่าใน Node เวอร์ชันที่ agent มี property proxyEnv Axios จะปล่อยให้ Node เป็นคนจัดการแทนที่จะ resolve เอง ในทางปฏิบัติ คุณควรเลือกใช้ระบบใดระบบหนึ่งแล้วให้มันเป็นเจ้าของเส้นทางทั้งหมด:
- ให้ Node จัดการ เปิด flag ไว้ ไม่ต้องตั้ง
proxyใน Axios แล้วปล่อยให้ env vars ทำงาน - ให้ Axios จัดการ ไม่ต้องเปิด Node flag แล้วให้การ resolve จาก env vars ของ Axios ทำงานเอง
- คุมเองทั้งหมด ตั้ง
proxy: falseแบบชัดเจน แล้วส่งhttpsAgentของคุณเอง — วิธีนี้จะตัดระบบอัตโนมัติทั้งสองฝั่งออกไปเลย ซึ่งผมแนะนำเมื่อคุณต้องการ rotation หรือ logic แบบ per-request
ผมทดสอบการ resolve ฝั่ง Axios โดยตรงแล้ว: ตั้ง HTTP_PROXY ใน environment ของ child process แล้ว request วิ่งผ่าน local proxy ของผมจริง และพอเพิ่ม NO_PROXY ที่ตรงกัน request ถัดไปก็ข้าม proxy ได้ถูกต้อง แปลว่า path ของ env var ใช้งานได้จริงแบบ out of the box ในตอนนี้ — สิ่งที่ต้องระวังคือสถานการณ์ที่มีสองโหมดทำงานพร้อมกัน
5 วิธีเชื่อม Proxy เข้ากับ Axios แบบเปรียบเทียบ
ก่อนลงโค้ด มาดูภาพรวมกันก่อน ผมสร้างและทดสอบทุกวิธีนี้กับ local proxy setup จริง ไม่ได้อ่านจากเอกสารอย่างเดียว
| วิธี | รองรับ HTTPS | รองรับ Auth | ควบคุมราย Request | เหมาะกับ Rotation | ความซับซ้อน |
|---|---|---|---|---|---|
ใช้ proxy แบบ inline | ✅ (Axios ปัจจุบัน) | ✅ | ✅ | ❌ | ต่ำ |
ค่าเริ่มต้นของ axios.create() | ✅ (Axios ปัจจุบัน) | ✅ | ❌ (ทั้ง instance) | ❌ | ต่ำ |
env vars (HTTP_PROXY/HTTPS_PROXY) | ✅ | ✅ | ❌ | ❌ | ต่ำ |
httpsAgent + HttpsProxyAgent | ✅ | ✅ | ✅ | ⚠️ (ต้องจัดการเอง) | ปานกลาง |
| request interceptor + agent pool | ✅ | ✅ | ✅ | ✅ | ปานกลาง-สูง |
ใช้ inline option ถ้าคุณมีสคริปต์สั้น ๆ ที่ยิงผ่าน proxy เดียว ใช้ axios.create() ถ้าทุก request ในโมดูลนั้นควรวิ่งผ่าน proxy เดียวกันโดยไม่ต้องเขียน config ซ้ำ ใช้ env vars เมื่อทีม infrastructure ตั้งค่าทาง proxy ให้จากส่วนกลางอยู่แล้ว และคุณแค่อยากรับค่าต่อมา ใช้ explicit agent เมื่อคุณต้องการการควบคุมที่ native config ให้ไม่ได้ — และใช้ interceptor pattern ทันทีที่คำว่า “ควบคุม” เริ่มแปลว่า “ต้องหมุน proxy”

ขั้นตอน: ตั้งค่า Proxy พื้นฐานใน Axios
วิธีที่ง่ายที่สุดคือใส่ built-in proxy object ลงใน request โดยตรง:
import axios from 'axios';
const res = await axios.get('https://httpbin.org/ip', {
proxy: {
host: '203.0.113.10',
port: 8080,
protocol: 'http',
},
});
console.log(res.data);
ลองรันแล้วคุณควรเห็น IP ของ proxy แทน IP ของคุณเอง ถ้าทดสอบกับ proxy จริงในเครื่อง localhost ปกติจะใช้เวลาไม่ถึงหนึ่งวินาที — เมื่อเทียบกับการไปตั้งค่า proxy ระดับ system ทั้งเครื่องแค่เพื่อทดสอบ request เดียว ซึ่งมักกินเวลาสิบกว่านาทีแบบไม่จำเป็น
เอา response นี้ไปเทียบกับ baseline ถ้าสำเร็จ คุณควรเห็น public IP ของ proxy ไม่ใช่ origin IP ที่บันทึกไว้ก่อนหน้านี้
ใช้ axios.create() เพื่อกำหนดค่าเริ่มต้นทั้ง instance
ถ้าทุก request ในโมดูลเดียวกันต้องวิ่งผ่าน proxy เดียวกัน ให้ฝังค่านั้นไว้ใน instance แทนการใส่ซ้ำทุกครั้ง:
const client = axios.create({
proxy: {
host: '203.0.113.10',
port: 8080,
},
timeout: 15_000,
});
const res = await client.get('https://httpbin.org/ip');
ผมยืนยันแล้วว่าเมื่อ override proxy: false ใน request เดียว ก็จะข้ามค่า default ของ instance ได้อย่างเรียบร้อย — มีประโยชน์มากถ้า 95% ของ call ต้องใช้ proxy แต่บางครั้ง เช่น health-check ping ไม่ควรผ่าน proxy
ตั้งค่า Proxy ผ่าน Environment Variables
ถ้าเป็น routing ที่บริหารจากส่วนกลาง เช่น Docker container หรือ CI environment ที่ ops ตั้ง env vars ไว้แล้ว คุณไม่ต้องแตะ config ของ Axios เลย:
export HTTP_PROXY=http://203.0.113.10:8080
export HTTPS_PROXY=http://203.0.113.10:8080
export NO_PROXY=localhost,127.0.0.1
Axios รุ่นปัจจุบันอ่านตัวแปรพวกนี้ได้โดยไม่ต้องพึ่ง global-agent แค่จำขอบเขตของ Node version ที่พูดไปข้างบนให้ดี: ถ้า NODE_USE_ENV_PROXY เปิดอยู่ด้วย คุณต้องระบุให้ชัดว่าใครเป็นเจ้าของเส้นทาง และต้องทดสอบพฤติกรรม NO_PROXY ใน runtime ที่ deploy จริง
ขั้นตอน: ตั้งค่า HTTPS Proxy ด้วย httpsAgent เพื่อการควบคุมจริงจัง
นี่คือรูปแบบที่ผมแนะนำจริงเมื่อคุณต้องการมากกว่า “มี proxy เดียวใช้ไปตลอด” ให้ติดตั้งแพ็กเกจ agent เวอร์ชันล่าสุด:
npm install https-proxy-agent
https-proxy-agent 9.1.0 ต้องใช้ Node 20 ขึ้นไป และจะส่ง CONNECT ไปที่ proxy อย่างถูกต้องก่อนจะ tunnel การเชื่อมต่อปลายทางผ่านเข้าไป
import axios from 'axios';
import { HttpsProxyAgent } from 'https-proxy-agent';
const agent = new HttpsProxyAgent('http://203.0.113.10:8080');
const client = axios.create({
proxy: false, // หยุดไม่ให้ native resolution ของ Axios เข้ามาชนกัน
httpsAgent: agent,
timeout: 15_000,
});
const res = await client.get('https://httpbin.org/ip');
console.log(res.data);
ตั้ง proxy: false เมื่อคุณให้ explicit agent เป็นเจ้าของการ routing อยู่แล้ว วิธีนี้ทำให้ config ชัดเจนและป้องกันไม่ให้ native หรือ environment-proxy resolution ของ Axios ไปแข่งขันกับ agent ที่คุณส่งมา
เพิ่ม Proxy Authentication
ฝัง credentials เข้าไปใน proxy URL ได้เลย:
const agent = new HttpsProxyAgent('http://myuser:mypassword@203.0.113.10:8080');
ถ้ารหัสผ่านมีอักขระพิเศษ เช่น @, :, # ซึ่งมักสร้างปัญหา ให้ percent-encode ก่อนประกอบ URL หรือใช้ encodeURIComponent() กับแต่ละส่วน ถ้ามี @ ดิบ ๆ อยู่ใน password ตัว parser จะคิดว่าเป็นจุดเริ่มของ host section และคุณจะได้ connection error ที่ดูไม่เกี่ยวกับ encoding เลย
ใช้ SOCKS5 Proxy กับ Axios
SOCKS proxy ใช้ HttpsProxyAgent ไม่ได้ — ต้องใช้ agent อีกตัวสำหรับโปรโตคอลนี้:
npm install socks-proxy-agent
import { SocksProxyAgent } from 'socks-proxy-agent';
const agent = new SocksProxyAgent('socks5://myuser:mypass@203.0.113.10:1080');
const client = axios.create({
proxy: false,
httpsAgent: agent,
});
socks-proxy-agent 10.1.0 ก็ต้องใช้ Node 20 ขึ้นไปเช่นกัน SOCKS5 คุ้มค่าที่จะใช้เมื่อคุณเจอเครือข่ายองค์กรที่เปิดเฉพาะ SOCKS gateway หรือเมื่อผู้ให้บริการ proxy ของคุณรองรับโปรโตคอลยืดหยุ่นกว่าพวก HTTP proxy ทั่วไป
หมุน Proxy ด้วย Axios Request Interceptors
การสุ่ม proxy ในโค้ดที่เรียกใช้งานแต่ละจุดอาจโอเคสำหรับสคริปต์แบบครั้งเดียว แต่พอคุณยิง request เป็นร้อย ๆ ครั้ง มันจะเริ่มพัง เพราะไม่มีจุดกลางที่คอยติดตามว่า proxy ไหนตายแล้ว ไม่มี retry logic และโค้ดเลือก proxy มักถูก copy-paste กระจายไปทั่ว ระบบ interceptor ของ Axios ช่วยรวม logic นี้ไว้ในที่เดียวที่ทดสอบได้ บทความคู่แข่งห้าเจ้าในผล SERP ที่ผมดูมา ไม่มีใครใช้ pattern นี้เลย

สร้าง Proxy Pool
import axios, { AxiosError, InternalAxiosRequestConfig } from 'axios';
import { HttpsProxyAgent } from 'https-proxy-agent';
class ProxyPool {
private agents: HttpsProxyAgent<string>[];
private index = 0;
constructor(proxyUrls: string[]) {
this.agents = proxyUrls.map((url) => new HttpsProxyAgent(url));
}
next(): HttpsProxyAgent<string> {
const agent = this.agents[this.index];
this.index = (this.index + 1) % this.agents.length;
return agent;
}
}
const pool = new ProxyPool([
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
]);
const client = axios.create({ timeout: 15_000 });
client.interceptors.request.use((config: InternalAxiosRequestConfig) => {
config.proxy = false;
config.httpsAgent = pool.next();
return config;
});
ผมลองกับ local proxy สองตัวแล้ว และยืนยันได้ว่าคำขอสลับกันถูกต้อง — proxy A, แล้ว proxy B, แล้วกลับไป A อีกครั้ง หมายเหตุว่า Axios จะรัน request interceptors แบบ last-in-first-out ดังนั้นถ้าคุณมี interceptor อื่นอยู่ด้วย เช่น ใส่ auth header หรือ logging ลำดับการทำงานสำคัญกว่าที่หลายคนคิด
เพิ่ม Response Interceptor พร้อมตัวกัน Retry เกินจำเป็น
นี่คือจุดที่สคริปต์หมุน proxy แบบทำเองส่วนใหญ่มักหละหลวม การ retry แบบไม่แยกแยะทุก failure ด้วย pool ที่ไม่จำกัด อาจทำให้ request เดียวกลายเป็นปัญหาลูกโซ่ โดยเฉพาะกับ method ที่ไม่ idempotent อย่าง POST เพราะการ retry อาจไปทำ side effect ซ้ำโดยที่คุณไม่ต้องการ
type RetryableConfig = InternalAxiosRequestConfig & {
__proxyRetryCount?: number;
};
client.interceptors.response.use(
undefined,
async (error: AxiosError) => {
const config = error.config as RetryableConfig | undefined;
if (!config) throw error;
const method = String(config.method ?? 'get').toUpperCase();
config.__proxyRetryCount ??= 0;
if (method !== 'GET' || config.__proxyRetryCount >= 1) throw error;
config.__proxyRetryCount += 1;
config.proxy = false;
config.httpsAgent = pool.next();
return client.request(config);
}
);
ผมทดสอบกับ proxy ที่ตั้งใจทำให้เสีย และยืนยันว่า retry เกิดขึ้นแค่ครั้งเดียวบน agent ตัวถัดไป — ไม่มี infinite loop และไม่มี retry กับ POST นั่นคือขอบเขตที่คุณต้องการ: นโยบาย retry ที่ชัดเจนว่า request แบบไหนปลอดภัยพอจะส่งซ้ำได้ ไม่ใช่แนว “ลองไปเรื่อย ๆ จนกว่าจะติด”

ตารางวิเคราะห์ Error: ผูกทุกอาการเข้ากับวิธีแก้
แนะนำให้บุ๊กมาร์กส่วนนี้ไว้ เพราะนี่คือ error ที่เจอจริงใน GitHub issues และ Stack Overflow ไม่ใช่เคสสมมติ
| Error / อาการ | สาเหตุที่เป็นไปได้ | วิธีแก้ |
|---|---|---|
ECONNREFUSED | host/port ผิด หรือ proxy server ล่ม | ตรวจด้วย curl -x http://host:port target-url ก่อนแตะโค้ด Axios |
407 Proxy Authentication Required | ขาด credentials หรือใส่ผิด | เพิ่ม auth: { username, password } ใน config proxy หรือฝัง creds ลงใน URL ของ HttpsProxyAgent |
403 Forbidden | origin หรือ WAF ปฏิเสธคำขอ หรือบล็อก proxy IP | ตรวจนโยบายการเข้าถึงของเว็บไซต์ การยืนยันตัวตน และอัตราการส่ง request; อย่ามองว่าการเปลี่ยน header หรือ IP คือสิทธิ์ในการเลี่ยงข้อจำกัด |
| Response แสดง IP จริงของคุณ | NO_PROXY, proxy:false, direct agent แบบ explicit หรือ configuration เฉพาะเวอร์ชัน/ประวัติศาสตร์อาจกำลัง bypass proxy อยู่ | ตรวจว่า layer ไหนเป็นเจ้าของ routing; ยืนยันเส้นทางด้วย endpoint ที่ควบคุม IP ได้ และใช้ explicit agent ถ้าจำเป็น |
ETIMEDOUT | ใช้เวลาสร้างการเชื่อมหรือรอ response เกิน timeout ที่กำหนด | วัดว่าเวลาเสียไปตรงไหน ปรับ timeout เฉพาะเมื่อ workload สมเหตุสมผล ถ้าไม่ใช่ให้เปลี่ยนหรือพัก route ที่มีปัญหา |
ECONNRESET ระหว่าง response | proxy, network หรือ origin ปิดการเชื่อมต่อ | บันทึก hop ที่ล้มเหลว; retry เฉพาะ request ที่ปลอดภัยต่อการส่งซ้ำ และต้องมีเพดานที่ชัดเจน |
502 Bad Gateway หลัง Nginx | proxy_pass ของ Nginx ตั้งค่าผิด หรือ timeout ของ Axios ไม่สอดคล้องกับ Nginx | ตรวจ proxy_connect_timeout และ proxy_read_timeout (ค่าเริ่มต้นทั้งคู่คือ 60s) แล้วปรับให้ตรงกับ timeout ของ Axios |
ERR_TLS_CERT_ALTNAME_INVALID | ใช้ agent ไม่ตรงกับโปรโตคอล หรือ cert เป็น self-signed | ตรวจว่าใช้ agent ถูกชนิดสำหรับโปรโตคอลหรือไม่; ตั้ง rejectUnauthorized: false เฉพาะตอนทดสอบในเครื่อง — ห้ามใช้ใน production |
เช็กลิสต์ Debug แบบเร็ว
ถ้าอะไรพังแล้วคุณยังหาสาเหตุไม่เจอ ให้ไล่ตามลำดับนี้:
- ทดสอบ proxy ตรง ๆ ด้วย
curl -x http://host:port https://your-target.comถ้ายังไม่ผ่าน ให้ดูเรื่องการเชื่อมต่อ proxy, authentication และปลายทางก่อนเปลี่ยน Axios ถ้าผ่าน แปลว่าเส้นทางฝั่ง Axios ยังต้องตรวจแยกอีกชั้น - ยืนยันว่าเวอร์ชัน Axios และ Node ที่รันจริงคืออะไร แล้วเทียบรายงานเก่ากับ release/config เดียวกันก่อนนำวิธีแก้มาใช้
- แยกให้ได้ว่าใครเป็นคน resolve proxy — native config ของ Axios, env-var resolution ของ Axios, env-proxy mode ในตัวของ Node, หรือ explicit agent อย่าให้มากกว่าหนึ่งระบบเป็นเจ้าของ request เดียวกัน
- ตรวจ
NO_PROXYว่ามี hostname match แบบไม่ตั้งใจหรือไม่ - ถ้าใช้ explicit agent ให้แน่ใจว่าได้ตั้ง
proxy: falseแล้ว เพื่อไม่ให้ Axios พยายามจัดการซ้ำสอง
เมื่อไหร่ควรข้ามงานตั้งค่า Proxy เองไปเลย
ทุกอย่างที่กล่าวมามีประโยชน์จริงถ้าเป้าหมายของคุณคือ routing ทราฟฟิกแบบอิสระ ไม่ว่าจะเป็นการทดสอบเครือข่ายองค์กร, geo-testing แอป, หรือ egress ที่ควบคุมได้ แต่หลายคนที่ค้นหา “how do I set up an Axios proxy” จริง ๆ แล้วต้องการข้อมูลจากเว็บไซต์เป็นหลัก โดย proxy เป็นแค่เครื่องมือไปสู่จุดหมายนั้น
ถ้าเป็นกรณีของคุณ ควรถามตัวเองว่าคุณจำเป็นต้องใช้ proxy จริงไหม หรือจริง ๆ แล้วคุณต้องการ scraping API ที่จัดการ infrastructure ให้คุณเลย Thunderbit Open API รับ URL กับ schema แล้วส่งกลับเป็น JSON ที่มีโครงสร้างชัดเจน — ไม่ต้อง parse HTML ดิบ ไม่ต้องติดตั้ง agent library และไม่ต้องคอยดูแล proxy pool เอง อีกทั้ง endpoint /extract ยังจัดการหน้าเว็บที่ render ด้วย JS, anti-bot measure และ CAPTCHA ฝั่งเซิร์ฟเวอร์ให้ด้วย ส่วน /distill ก็เป็นทางเลือกที่เบากว่า ถ้าคุณต้องการแค่แปลงหน้าเว็บเป็น Markdown ที่สะอาด นอกจากนี้ยังมี MCP server ที่เปิดเครื่องมืออย่าง thunderbit_extract และ thunderbit_suggest_fields ให้ coding assistants อย่าง Claude หรือ Cursor ดึงข้อมูลแบบมีโครงสร้างระหว่างทำงานได้โดยไม่ต้องแตะ config proxy เลย และยังมี CLI สำหรับ workflow บนเทอร์มินัลและ CI อีกด้วย
| ประเด็น | DIY Axios + Proxies | Thunderbit API/MCP/CLI |
|---|---|---|
| การหา proxy และ rotation | คุณต้องจัดการเอง | จัดการฝั่งเซิร์ฟเวอร์ให้ |
| ความท้าทายของ browser และ access | คุณต้องดูแล layer ของ browser/network เอง | บริการจัดการให้ภายใต้ขอบเขตที่เอกสารระบุ |
| หน้าเว็บที่ render ด้วย JS | ต้องใช้ headless browser | renderMode: full |
| รูปแบบผลลัพธ์ | HTML ดิบ → คุณต้อง parse เอง | JSON แบบมีโครงสร้างผ่าน schema |
| การดูแลเมื่อเว็บไซต์เปลี่ยน | คุณต้องดูแล parsing/selectors เอง | extraction layer แบบ managed ช่วยลดงานดูแลฝั่งแอปได้บางส่วน |
พูดกันตรง ๆ คือ ถ้าคุณต้องการ routing ทราฟฟิกเพื่อการทดสอบหรือ networking ขององค์กร สิ่งเหล่านี้ไม่ได้มาแทน Axios กับ proxy config แต่ถ้าสิ่งที่คุณต้องส่งมอบคือข้อมูลเว็บแบบมีโครงสร้าง แนว API-first อาจช่วยลดโค้ดเรื่อง proxy, browser และ parsing ที่แอปต้องรับผิดชอบได้มาก ณ วันที่ 7 สิงหาคม 2026 เอกสาร rate limit ของ Thunderbit API ระบุว่า Free tier ทำได้ 10 requests ต่อนาที และ 2 concurrent requests ให้ถือว่าตัวเลขเหล่านี้เป็น limits ที่อาจเปลี่ยนได้ตามเวลา และควรเช็กหน้าเอกสารอีกครั้งก่อนนำไปใช้ใน production
สรุป
บทเรียนสำคัญจากเรื่องนี้สวนทางกับสิ่งที่บทความเก่า ๆ หลายชิ้นบอกไว้: Axios รุ่นปัจจุบันมีเอกสารและจากการทดสอบ local ที่บันทึกไว้ มันใช้ CONNECT tunneling กับ HTTPS target ได้ถูกต้อง ปัญหาในอดีตยังมีความหมาย แต่ต้องดูในบริบทของเวอร์ชันและ configuration แบบเจาะจง native config เป็นจุดเริ่มต้นที่ดีและซับซ้อนไม่มาก เมื่อคุณต้องการควบคุมราย request, รองรับ SOCKS, หรือหมุน proxy ให้ใช้ HttpsProxyAgent (หรือ SocksProxyAgent) คู่กับ proxy: false จะทำให้ความรับผิดชอบชัดเจนกว่า และถ้าคุณต้องหมุน pool ใน production, request/response interceptors คือจุดศูนย์กลางที่ทดสอบได้ดีที่สุด — เพียงแต่ต้องมี loop guard และ retry เฉพาะ request ที่ปลอดภัยต่อการส่งซ้ำเท่านั้น
เก็บ ตารางวิเคราะห์ปัญหา ด้านบนไว้ใช้ตอน proxy ทำ error แปลก ๆ ตอนตีสอง และถ้าคุณเริ่มรู้ตัวว่ากำลังเสียเวลาดีบัก plumbing ของ proxy มากกว่าการใช้ข้อมูลที่พยายามดึงออกมา บางทีเครื่องมือ API-first extraction อาจแก้ปัญหาจริงได้เร็วกว่า infrastructure ทุกชนิด
คำถามที่พบบ่อย
Axios รองรับ HTTPS proxy แบบ native ไหม? รองรับใน Axios รุ่นปัจจุบันสำหรับ conventional HTTP proxy: เอกสารปัจจุบันอธิบาย CONNECT tunneling สำหรับ HTTPS target และ Axios 1.19.0 ผ่านเส้นทางนี้ได้ในการทดสอบ local ที่บันทึกไว้ แต่ release เก่า ๆ และการตั้งค่าบางแบบเคยมีปัญหาจริง ดังนั้นต้องตรวจเวอร์ชันและ proxy ที่ใช้จริง ไม่ควรเดาว่าจะสำเร็จทุกครั้งหรือพังทุกครั้ง
จะหมุน proxy ใน Axios ยังไง?
ใช้ request interceptor เพื่อกำหนด httpsAgent คนละตัวจาก proxy pool ก่อนส่งแต่ละ request และจับคู่กับ response interceptor ที่ retry คำขอที่ล้มเหลวบน proxy ตัวอื่น ต้องจำกัด retry ให้ชัด — แค่หนึ่งครั้ง และเฉพาะ method ที่เป็น idempotent เช่น GET เพื่อไม่ให้ส่ง request ที่ไม่ควรถูก replay ซ้ำ
ทำไม Axios proxy ของฉันถึงแสดง IP จริง?
ตรวจดูว่า NO_PROXY, proxy:false, explicit direct agent หรือ routing เฉพาะของ deployment เป็นตัว bypass proxy อยู่หรือไม่ บันทึกเวอร์ชัน Axios/Node และลองทดสอบ proxy แบบเดี่ยวด้วย cURL ถ้าคุณต้องการ routing ราย request แบบชัดเจน ให้ใช้ HttpsProxyAgent คู่กับ proxy:false แล้วตรวจ IP ที่เห็นบน endpoint ที่ควบคุมได้
ใช้ SOCKS5 proxy กับ Axios ได้ไหม?
ได้ ผ่านแพ็กเกจ socks-proxy-agent สร้าง SocksProxyAgent จาก SOCKS URL ของคุณแล้วส่งเป็น httpsAgent ใน Axios config — แต่อย่าพยายามส่ง HttpsProxyAgent พร้อมกัน เพราะสองโปรโตคอลนี้ใช้ agent คนละชนิด
ต่างกันยังไงระหว่าง proxy option กับ httpsAgent ใน Axios?
proxy เป็น config ในตัวของ Axios สำหรับ proxy เดี่ยวที่คงที่ และใช้ได้ดีในเคสตรงไปตรงมาเวอร์ชันปัจจุบัน ส่วน httpsAgent รับ Node.js agent แบบกำหนดเอง เช่น HttpsProxyAgent หรือ SocksProxyAgent ทำให้คุณควบคุมเส้นทาง, authentication และ rotation ได้ตรงจุดแบบราย request ซึ่ง native option ไม่ได้ถูกออกแบบมาให้ทำตั้งแต่แรก


