Cấu hình proxy cho k6 để load testing và tránh chặn IP
13 tháng 7, 2026
Giới thiệu
Load testing là bước không thể thiếu trong quá trình phát triển ứng dụng web và API. Khi mô phỏng hàng nghìn truy cập đồng thời, một địa chỉ IP duy nhất thường bị hệ thống đích đánh dấu là lưu lượng bất thường và có thể bị chặn, làm sai kết quả thử nghiệm. Việc sử dụng proxy giúp phân tán lưu lượng qua nhiều IP khác nhau, giảm nguy cơ bị chặn và mô phỏng更真实的用户分布。
Bài viết này sẽ hướng dẫn bạn cấu hình proxy cho công cụ k6 – một framework load testing mã nguồn mở dựa trên Go và JavaScript – để thực hiện thử nghiệm hiệu quả, ổn định và không bị chặn IP. Các bước được minh hoạ bằng ví dụ thực tế, kèm script k6 và các mẹo tối ưu hoá.
Tại sao cần proxy khi load testing?
- Tránh chặn IP: Nhiều dịch vụ áp dụng giới hạn tốc độ (rate limit) hoặc tường lửa dựa trên IP. Khi tất cả các VU (virtual users) của k6 sử dụng cùng một IP, khả năng triggering các biện pháp chống lạm dụng rất cao.
- Mô phỏng người dùng thực: Các truy cập từ các vị trí địa lý khác nhau giúp kiểm tra tính toàn cầu của ứng dụng, đặc biệt khi ứng dụng có chức năng dựa trên IP geolocation (ví dụ: hiển thị nội dung địa phương, giá tiền tệ).
- Kiểm tra tính chịu lỗi: Thay đổi proxy giữa các đợt test giúp bạn xem ứng dụng có xử lý tốt khi IP thay đổi đột ngột không (như khi người dùng di chuyển mạng).
- Tăng độ tin cậy của kết quả: Khi không bị chặn, các chỉ số như latency, throughput và error rate phản ánh thực sự hiệu năng của hệ thống dưới tải.
Chuẩn bị môi trường
1. Cài đặt k6
# Trên Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y gnupg2
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 379CE192D401AB61
# Ubuntu versions >=20.04
echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6
2. Chuẩn bị danh sách proxy
Bạn có thể mua hoặc thử dùng dịch vụ proxy chất lượng như RoProxy cung cấp:
- Proxy datacenter tốc độ cao.
- Proxy residential với IP thực từ nhà cung cấp internet.
- Proxy mobile (3G/4G/5G) nếu cần mô phỏng kết nối di động.
Lưu danh sách proxy vào một file proxies.txt, mỗi dòng một proxy sous format host:port:username:password (nếu cần xác thực). Ví dụ:
185.199.108.153:3128:user1:passA
45.77.124.214:8080:user2:passB
203.0.113.45:1080:user3:passC
3. Biến môi trường
Để script k6 linh hoạt, chúng ta sẽ đọc proxy từ biến môi trường K6_PROXY_LIST (một chuỗi JSON) hoặc trực tiếp từ file. Điều này giúp bạn không cần thay đổi mã nguồn mỗi khi thay đổi danh sách proxy.
Cấu hình proxy trong k6 script
k6 cho phép thiết lập proxy cho mỗi yêu cầu HTTP qua đối tượng http. Tuy nhiên, để áp dụng proxy cho tất cả các request trong script, chúng ta có thể sử dụng hàm http.setResponseCallback hoặc thiết lập biến môi trường HTTP_PROXY, HTTPS_PROXY. Cách tiếp cận linh hoạt nhất là tạo một hàm wrapper lấy proxy ngẫu nhiên từ danh sách và gán vào mỗi request.
Ví dụ script k6 với proxy xoay
Lưu dưới tên loadtest-with-proxy.js:
import http from 'k6/http';
import { check, sleep } from 'k6';
// Đọc danh sách proxy từ biến môi trường (JSON array of strings)
const proxyList = JSON.parse(__ENV.K6_PROXY_LIST || '[]');
// Hàm trả về một proxy ngẫu nhiên
function getRandomProxy() {
if (proxyList.length === 0) {
return null; // không dùng proxy
}
const idx = Math.floor(Math.random() * proxyList.length);
return proxyList[idx];
}
// Hàm wrapper thực hiện request với proxy
function requestWithProxy(method, url, params = {}) {
const proxy = getRandomProxy();
if (proxy) {
// Định dạng proxy mà k6 hiểu: http://username:password@host:port
const [hostPort, user, pass] = proxy.split(':');
// Nếu chuỗi proxy có format host:port:user:pass
const parts = proxy.split(':');
let proxyAuth = '';
let proxyHost = '';
if (parts.length === 4) {
[proxyHost, proxyPort, proxyUser, proxyPass] = parts;
proxyAuth = `${proxyUser}:${proxyPass}@`;
} else if (parts.length === 2) {
[proxyHost, proxyPort] = parts;
} else {
// fallback: chỉ host:port
[proxyHost, proxyPort] = proxy.split(':');
}
const proxyUrl = `http://${proxyAuth}${proxyHost}:${proxyPort}`;
// Gán proxy vào params
params = Object.assign({}, params, {
proxy: {
http: proxyUrl,
https: proxyUrl,
},
});
}
return http.request(method, url, null, params);
}
export const options = {
stages: [
{ duration: '2m', target: 20 }, // ramp-up
{ duration: '5m', target: 20 }, // steady
{ duration: '2m', target: 0 }, // ramp-down
],
thresholds: {
http_req_failed: ['rate<0.01'], // lỗi <1%
http_req_duration: ['p(95)<500'], // 95% request dưới 500ms
},
};
export default function () {
const res = requestWithProxy('GET', 'https://httpbin.org/ip');
check(res, {
'status is 200': (r) => r.status === 200,
'IP returned': (r) => r.body.length > 0,
});
sleep(1);
}
Giải thích script
__ENV.K6_PROXY_LISTlà biến môi trường truyền vào khi chạy k6. Chúng ta định dạng là một mảng JSON của chuỗi proxy (ví dụ: `["185.199.108.153:3128:user1:passA","45.77.124.214:8080:user2:passB\