Cách cài đặt Proxy trong Axios: Hướng dẫn chi tiết

Bình luận: 0

Axios là một thư viện JavaScript để gửi các yêu cầu HTTP, hỗ trợ xử lý dữ liệu bất đồng bộ, xử lý phản hồi và lỗi, và dễ dàng tích hợp vào cả ứng dụng phía client lẫn server dựa trên Node.js. Trong nhiều tình huống thực tế, đặc biệt khi xử lý số lượng lớn yêu cầu hoặc khi việc truy cập nội dung bị hạn chế, việc thiết lập proxy trong Axios thường trở nên cần thiết. Các máy chủ trung gian cho phép thay đổi địa chỉ IP của client và định tuyến yêu cầu thông qua một nút trung gian. Vì việc sử dụng proxy trong Axios đòi hỏi cấu hình chính xác và hiểu biết về kiến trúc kết nối, hướng dẫn này trình bày các phương pháp kết nối giao thức HTTP(S) và SOCKS, chi tiết về xác thực, cấu hình agent, cũng như các lỗi thường gặp và cách khắc phục.

Tại sao nên sử dụng Proxy trong Axios?

Proxy được áp dụng trong các trường hợp sau:

  • Truy cập nội dung theo vùng — gửi yêu cầu từ một khu vực địa lý cụ thể để đảm bảo hoạt động chính xác với tài nguyên bản địa.
  • Tự động hóa phân tán — quản lý luồng yêu cầu qua nhiều địa chỉ IP khác nhau để xử lý dữ liệu ổn định và giảm thiểu lỗi.
  • Kiểm thử và gỡ lỗi — định tuyến lưu lượng qua máy chủ trung gian để phân tích yêu cầu và phản hồi.
  • Làm việc trong mạng doanh nghiệp — đáp ứng yêu cầu về kiến trúc mạng nội bộ và bảo mật.

Sử dụng Axios với các nút trung gian được cấu hình đúng cho phép triển khai các kịch bản này. Tuy nhiên, cần hiểu rằng bản thân thư viện chỉ là công cụ để gửi yêu cầu HTTP. Khả năng vượt chặn, truy cập nội dung bị giới hạn theo vùng và quản lý lưu lượng phụ thuộc vào:

  • đặc điểm của máy chủ proxy (loại, giao thức sử dụng, khả năng xác thực);
  • logic proxy bên ngoài (xoay vòng IP, cân bằng tải);
  • đặc điểm của hạ tầng mạng, bao gồm định tuyến và chính sách lưu lượng.

Axios hỗ trợ những loại Proxy nào?

Axios hỗ trợ các loại sau tùy theo giao thức:

  1. HTTP và HTTPS (hỗ trợ sẵn) sử dụng tham số proxy. Để cấu hình, chỉ cần chỉ định:
    • Địa chỉ IP;
    • Cổng;
    • Tên người dùng và mật khẩu (nếu cần).
  2. SOCKS (thông qua các agent của bên thứ ba). Bản thân thư viện không hỗ trợ trực tiếp giao thức SOCKS, nhưng có thể sử dụng thông qua các thư viện như socks-proxy-agent.

    Để tích hợp, bạn cần:

    • Tạo một instance của proxy agent, chỉ định loại (SOCKS4/SOCKS5) và tham số kết nối (IP, cổng, tên người dùng và mật khẩu),
    • Truyền đối tượng đã tạo vào Axios bằng các tùy chọn httpAgent và httpsAgent.
    • Gửi yêu cầu.

Quan trọng: Thư viện không hỗ trợ SSH, FTP, Shadowsocks hoặc các giao thức tương tự. Để sử dụng chúng, cần áp dụng các công cụ riêng hoặc cấu hình tunneling ở cấp hệ điều hành.

Cách cài đặt Proxy trong Axios?

Trước khi cài đặt, cần xem xét một số khía cạnh kỹ thuật: giao thức nào sẽ được sử dụng, có cần xác thực hay không, và có cần xoay vòng hay không. Dưới đây là hướng dẫn từng bước cho các phương pháp kết nối khác nhau.

Các bước chuẩn bị

Trước khi cấu hình proxy HTTP trong Axios, bạn cần chuẩn bị đúng môi trường làm việc.

Lưu ý: Các lệnh nên được thực thi trong terminal của hệ điều hành (CMD, PowerShell, bash) hoặc trong terminal tích hợp của IDE như Visual Studio Code. Để thực thi đúng, thư mục làm việc hiện tại phải trỏ tới thư mục gốc của dự án.

  1. Tạo một thư mục dự án mới và điều hướng vào đó:
    mkdir proxy-setup-axios
    cd proxy-setup-axios
  2. Khởi tạo một dự án Node.js. Sau khi thực thi lệnh này, một tệp package.json với các tham số mặc định sẽ xuất hiện trong thư mục dự án:
    npm init -y
  3. Cài đặt thư viện Axios:
    npm install axios
  4. Tạo tệp chính của dự án:
    echo>app.js
  5. Cấu hình script khởi động. Mở tệp package.json bằng bất kỳ trình soạn thảo nào và thay thế nội dung của phần scripts bằng:
    "scripts": {
    "start": "node app.js"
    }

    Quan trọng: Tệp package.json có thể được mở trong bất kỳ trình soạn thảo code nào hoặc thậm chí Notepad. Khi chỉnh sửa, hãy cẩn thận tuân thủ cú pháp: không xóa hoặc thay đổi dấu ngoặc kép, ngoặc nhọn hoặc dấu hai chấm, vì điều đó sẽ dẫn đến lỗi thực thi.

  6. Kiểm tra cấu hình cuối cùng:
    npm start

Nếu tất cả các bước được thực hiện chính xác, ứng dụng sẽ khởi chạy thành công ngay cả với một tệp cấu hình rỗng. Trong trường hợp này, chương trình sẽ chỉ đơn giản đóng lại mà không hiển thị bất kỳ đầu ra bổ sung nào. Hành vi này là mong đợi và cho thấy rằng tệp chưa có mã thực thi, nhưng môi trường đã được cài đặt đúng.

Cấu hình Proxy HTTP Tĩnh

Khi sử dụng giải pháp tĩnh, tất cả các yêu cầu đều được định tuyến qua cùng một địa chỉ IP. Cách tiếp cận này phù hợp khi không cần xoay vòng IP.

Để kết nối một proxy HTTPS trong Axios, hãy sử dụng cấu hình sau:

axios.get(URL, {
proxy: {
protocol: 'http',
host: '82.211.7.97',
port: 59100
}
})

Nếu máy chủ trung gian yêu cầu xác thực, hãy thêm một khối auth:

auth: {
username: 'proxyUser',
password: 'proxyPass'
}

Một ví dụ hoàn chỉnh với xử lý yêu cầu tới dịch vụ httpbin.org:

const axios = require('axios');

async function requestThroughProxy() {
try {
const response = await axios.get('https://httpbin.org/ip', {
proxy: {
protocol: 'http',
host: '82.211.7.97',
port: 59100,
auth: {
username: 'proxyUser',
password: 'proxyPass'
}
}
});
console.log('Proxy IP:', response.data);
} catch (error) {
console.error('Request failed:', error.message);
}
}

requestThroughProxy();

Khối try/catch được sử dụng để xử lý các lỗi có thể xảy ra trong quá trình gửi yêu cầu. Trong ví dụ này, yêu cầu được gửi đến https://httpbin.org/ip, dịch vụ này trả về địa chỉ IP hiện tại của client. Nếu proxy không khả dụng hoặc yêu cầu thất bại, khối catch sẽ chặn ngoại lệ và hiển thị thông báo lỗi.

Sử dụng Axios Với Danh Sách Proxy

Khi nhiều yêu cầu đi qua cùng một IP, nguy cơ bị chặn bởi tài nguyên đích sẽ tăng lên. Để tránh điều này, các proxy dân cư hỗ trợ xoay vòng IP thường được sử dụng. Những giải pháp này cung cấp mức độ ẩn danh cao hơn và cho phép phân phối tải đồng đều. Trên thực tế, điều này được thực hiện bằng cách tạo một tập hợp địa chỉ IP được cấu hình sẵn và triển khai cơ chế chọn proxy ngẫu nhiên hoặc tuần tự trong mã.

Dưới đây là ví dụ chọn IP ngẫu nhiên bằng gói http-proxy-agent:

const axios = require('axios');
const HttpProxyAgent = require('http-proxy-agent');

// Danh sách proxy có xác thực
const proxyList = [
'http://user1:pass1@82.211.7.97:59100',
'http://user2:pass2@82.211.7.97:59101',
'http://user3:pass3@82.211.7.97:59102'
];

// Hàm chọn proxy ngẫu nhiên
function getRandomProxy() {
const index = Math.floor(Math.random() * proxyList.length);
return proxyList[index];
}

// Gửi nhiều yêu cầu với xoay vòng IP
(async () => {
for (let i = 0; i < 5; i++) {
const proxy = getRandomProxy();
const agent = new HttpProxyAgent(proxy);

try {
const response = await axios.get('https://api.ipify.org?format=json', {
httpAgent: agent,
httpsAgent: agent,
timeout: 3000
});
console.log(`Đã dùng proxy ${proxy} -- IP:`, response.data.ip);
} catch (err) {
console.error(`Proxy ${proxy} thất bại:`, err.message);
}
}
})();

Trong ví dụ này, mỗi yêu cầu của Axios sử dụng một địa chỉ proxy được chọn ngẫu nhiên từ danh sách đã chỉ định. Dịch vụ https://api.ipify.org?format=json trả về IP bên ngoài, cho phép xác minh rằng kết nối đã được thiết lập chính xác. Trong trường hợp lỗi (chẳng hạn như máy chủ không khả dụng hoặc thông tin xác thực sai), khối catch sẽ chặn ngoại lệ và hiển thị thông báo lỗi.

Cấu hình Proxy SOCKS5 trong Axios

Việc sử dụng SOCKS5 là hợp lý khi cần vượt qua các bộ lọc mạng, làm việc với API bị hạn chế, và trong các kịch bản yêu cầu truyền tải lưu lượng không chuẩn, bao gồm cả các yêu cầu DNS.

Để làm việc với proxy socks5 trong Axios, khuyến nghị sử dụng gói socks-proxy-agent. Gói này hỗ trợ loại trung gian này thông qua một proxy agent tích hợp liền mạch với thư viện.

Cài đặt agent proxy cho Axios:

npm install axios socks-proxy-agent

Cấu hình proxy trong Axios:

const axios = require('axios');
const { SocksProxyAgent } = require('socks-proxy-agent');

// Tham số máy chủ trung gian
const proxy = {
host: '45.192.135.68',// Địa chỉ IP
port: 50101,// Cổng
username: 'Username',// Tên đăng nhập (nếu cần)
password: 'Password'// Mật khẩu (nếu cần)
};

// Xây dựng URL proxy với xác thực
const proxyUrl = `socks5://${proxy.username}:${proxy.password}@${proxy.host}:${proxy.port}`;

// Tạo SOCKS5 agent
const agent = new SocksProxyAgent(proxyUrl);

// Gửi yêu cầu qua proxy trong Axios
axios.get('https://api.ipify.org/?format=json', { httpsAgent: agent })
.then(response => {
console.log('IP của bạn:', response.data);
})
.catch(error => {
console.error('Lỗi kết nối:', error.message);
});

Quan trọng: Nếu máy chủ trung gian không yêu cầu xác thực, bạn nên xây dựng proxyUrl mà không có tên đăng nhập và mật khẩu:

const proxyUrl = `socks5://${proxy.host}:${proxy.port}`;

Cách Kiểm thử Proxy HTTP(S) và SOCKS trong Axios?

Để kiểm tra xem mọi thứ có hoạt động đúng hay không, bạn có thể gửi một yêu cầu đến dịch vụ trả về địa chỉ IP bên ngoài, ví dụ:

axios.get('https://api.ipify.org?format=json', { httpsAgent: agent })
.then(response => {
console.log('IP của bạn:', response.data.ip);
})
.catch(error => {
console.error('Lỗi kết nối:', error.message);
});

Điều này cho phép bạn xác nhận rằng các yêu cầu đang được định tuyến qua proxy một cách chính xác.

Khuyến nghị cấu hình Proxy trong Axios

Việc sử dụng hiệu quả Axios với máy chủ trung gian đòi hỏi cấu hình cẩn thận, cần xem xét các khía cạnh chính sau:

  • Timeout của yêu cầu. Giá trị timeout phù hợp giúp tránh treo khi kết nối không ổn định và cho phép chuyển nhanh sang các tuyến thay thế.
  • Logic thử lại (retry). Nếu IP chính không khả dụng, việc cấu hình thử lại hoặc chuyển sang địa chỉ dự phòng là quan trọng. Điều này giúp tránh thời gian chết.
  • Lựa chọn giao thức. HTTP/HTTPS được áp dụng trong hầu hết các trường hợp: web scraping, yêu cầu API, tích hợp. Proxy SOCKS5 được ưu tiên khi làm việc với lưu lượng phi chuẩn (bao gồm luồng TCP và yêu cầu DNS), vượt qua hạn chế mạng hoặc khi cần cấu trúc gói tin tối thiểu.
  • Xử lý lỗi. Mã cần triển khai xử lý lỗi cho cả lỗi ở cấp độ mạng và cấp độ HTTP. Bao gồm lỗi kết nối, thử lại với backoff lũy thừa và chuyển sang máy chủ thay thế khi cần.

Thực hiện theo các khuyến nghị này đảm bảo hoạt động ổn định của proxy trong Axios, ngay cả khi tải nặng.

Xử lý sự cố

Proxy trong Axios có thể thất bại vì nhiều lý do khác nhau, chủ yếu do đặc thù khi làm việc với proxy trong Node.js, nơi cấu hình đúng và tương thích giao thức là yếu tố then chốt.

ECONNREFUSED – Kết nối bị từ chối

Nguyên nhân: Địa chỉ IP hoặc cổng không chính xác, máy chủ proxy không khả dụng hoặc kết nối bị chặn ở cấp độ mạng bởi tường lửa hoặc hệ thống host.

Giải pháp:

  1. Xác minh rằng địa chỉ IP và cổng là chính xác.
  2. Nếu kết nối bị ngắt, hãy liên hệ với nhà cung cấp hoặc thay thế nó.
  3. Chạy lệnh curl để kiểm tra IP:
    curl -x http://username:password@proxy-host:port https://api.ipify.org
  4. Thêm khối try/catch với logic xử lý ngoại lệ và chuyển sang IP khác trong trường hợp thất bại:
    try {
    await axios.get(url, { httpAgent });
    } catch (err) {
    if (err.code === 'ECONNREFUSED') {
    // Chuyển sang IP khác
    }
    }

ERR_BAD_RESPONSE hoặc 502 Bad Gateway

Nguyên nhân: Máy chủ trung gian trả về phản hồi không hợp lệ từ tài nguyên đích do:

  • quá tải hoặc vượt quá giới hạn kết nối đồng thời;
  • kết nối không ổn định giữa proxy và máy chủ đích;
  • lọc hoặc chặn lưu lượng (ví dụ: do bảo vệ chống bot, lọc địa lý hoặc hạn chế header).

Giải pháp:

  • Kiểm tra thủ công IP gặp sự cố bằng curl hoặc công cụ tương tự để xác minh xem nó có thực sự trả về lỗi hay không.
  • Nếu lỗi vẫn còn, tạm thời loại bỏ địa chỉ IP này khỏi pool.
  • Đảm bảo danh sách bao gồm địa chỉ dự phòng và cấu hình cơ chế failover/thử lại tự động.
  • Sử dụng thư viện axios-retry, thư viện này thêm các lần thử lại với khoảng thời gian tăng dần.

Không thể thiết lập tunneling socket

Nguyên nhân: Máy chủ trung gian sử dụng SOCKS5, trong khi kết nối được thiết lập qua HTTP hoặc HTTPS agent. Axios không hỗ trợ trực tiếp proxy, vì vậy yếu tố then chốt trong cấu hình là chọn đúng agent.

Giải pháp:

Kết nối agent phù hợp (http-proxy-agent, https-proxy-agent, socks-proxy-agent) tùy thuộc vào loại giao thức đang được sử dụng.

const HttpsProxyAgent = require('https-proxy-agent');
const agent = new HttpsProxyAgent('http://user:pass@ip:port');

Đối với SOCKS5:

const { SocksProxyAgent } = require('socks-proxy-agent');
const agent = new SocksProxyAgent('socks5://user:pass@ip:port');

407 Proxy Authentication Required – lỗi xác thực

Nguyên nhân: Sai tên người dùng hoặc mật khẩu, thiếu header Proxy-Authorization, hoặc định dạng chuỗi kết nối không đúng.

Giải pháp:

Kiểm tra cú pháp của chuỗi kết nối: http://user:pass@ip:port. Đảm bảo rằng agent truyền đúng các tham số xác thực.

const HttpsProxyAgent = require('https-proxy-agent');

const proxyUrl = 'http://username:password@82.211.9.160:50100';
const agent = new HttpsProxyAgent(proxyUrl);

Kết luận

Cấu hình proxy trong Axios là một bước thiết yếu để làm việc với tính ẩn danh, cân bằng tải và vượt qua hạn chế. Độ tin cậy của yêu cầu được đảm bảo thông qua cấu hình đúng agent proxy, lựa chọn giao thức tương thích và xử lý lỗi được thiết kế hợp lý. Đồng thời, chất lượng của máy chủ proxy ảnh hưởng trực tiếp đến hiệu quả của công cụ. Proxy miễn phí thường không ổn định, dễ bị chặn và nhanh chóng gây ra sự cố.

Đối với môi trường sản xuất, nên dựa vào các giải pháp trả phí từ nhà cung cấp uy tín, cung cấp pool IP lớn, hỗ trợ xoay vòng và uptime cao.

FAQ

Có thể cấu hình Axios proxy toàn cục thông qua biến môi trường không?

Có, Axios hoàn toàn có thể được cấu hình toàn cục để sử dụng máy chủ proxy với các biến môi trường: HTTP_PROXY, HTTPS_PROXY và NO_PROXY. Các biến này có thể được thiết lập thông qua thuộc tính hệ thống. Để thực hiện, mở System Properties → Environment Variables, tạo một biến mới (ví dụ: HTTP_PROXY) và chỉ định địa chỉ máy chủ proxy làm giá trị của nó.

Có cần xác thực cho proxy dân cư không?

Axios không phân biệt giữa các loại proxy khác nhau: dân cư, di động hay trung tâm dữ liệu — cấu hình xác thực là như nhau. Yêu cầu chính là định dạng URL chính xác hoặc một khối proxy.auth được định nghĩa đúng.

Những lựa chọn thay thế cho Axios khi làm việc với máy chủ trung gian là gì?

Các lựa chọn thay thế chính cho việc sử dụng proxy trong Axios với Node.js là node-fetch và Got. Cả hai thư viện đều hỗ trợ proxy HTTP/HTTPS thông qua biến môi trường cũng như cấu hình rõ ràng trong mã. Khi có thể, Got cung cấp các tùy chọn linh hoạt hơn cho timeout, retry và tùy chỉnh yêu cầu, trong khi node-fetch có cú pháp quen thuộc hơn với lập trình viên frontend. Lựa chọn phụ thuộc vào nhu cầu cụ thể và sự tiện lợi của bạn.

Bình luận:

0 Bình luận