[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog:post:vi:cau-hinh-proxy-cho-k6-load-testing-tranh-chan-ip":3},{"slug":4,"lang":5,"title":6,"summary":7,"date":8,"tags":9,"tag_slugs":14,"thumbnail_url":15,"translations":16,"body":17,"asset_base":18},"cau-hinh-proxy-cho-k6-load-testing-tranh-chan-ip","vi","Cấu hình proxy cho k6 để load testing và tránh chặn IP","Hướng dẫn chi tiết cách tích hợp proxy vào脚本 k6 để thực hiện load testing phân tán, tránh bị chặn IP và lấy kết quả chính xác.","2026-07-13",[10,11,12,13],"proxy","k6","load-testing","testing",[10,11,12,13],"https://blog-api.ro-proxy.com/api/blog/posts/cau-hinh-proxy-cho-k6-load-testing-tranh-chan-ip/thumbnail.svg?lang=vi",[5],"## Giới thiệu\n\nLoad 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更真实的用户分布。\n\nBà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á.\n\n## Tại sao cần proxy khi load testing?\n\n- **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.\n- **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ệ).\n- **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).\n- **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.\n\n## Chuẩn bị môi trường\n\n### 1. Cài đặt k6\n\n```bash\n# Trên Ubuntu/Debian\nsudo apt-get update\nsudo apt-get install -y gnupg2\nsudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 379CE192D401AB61\n# Ubuntu versions >=20.04\necho \"deb https://dl.k6.io/deb stable main\" | sudo tee /etc/apt/sources.list.d/k6.list\nsudo apt-get update\nsudo apt-get install k6\n```\n\n### 2. Chuẩn bị danh sách proxy\n\nBạn có thể mua hoặc thử dùng dịch vụ proxy chất lượng như RoProxy cung cấp:\n- Proxy datacenter tốc độ cao.\n- Proxy residential với IP thực từ nhà cung cấp internet.\n- Proxy mobile (3G/4G/5G) nếu cần mô phỏng kết nối di động.\n\nLư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ụ:\n\n```text\n185.199.108.153:3128:user1:passA\n45.77.124.214:8080:user2:passB\n203.0.113.45:1080:user3:passC\n```\n\n### 3. Biến môi trường\n\nĐể 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.\n\n## Cấu hình proxy trong k6 script\n\nk6 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.\n\n### Ví dụ script k6 với proxy xoay\n\nLưu dưới tên `loadtest-with-proxy.js`:\n\n```javascript\nimport http from 'k6/http';\nimport { check, sleep } from 'k6';\n\n// Đọc danh sách proxy từ biến môi trường (JSON array of strings)\nconst proxyList = JSON.parse(__ENV.K6_PROXY_LIST || '[]');\n\n// Hàm trả về một proxy ngẫu nhiên\nfunction getRandomProxy() {\n  if (proxyList.length === 0) {\n    return null; // không dùng proxy\n  }\n  const idx = Math.floor(Math.random() * proxyList.length);\n  return proxyList[idx];\n}\n\n// Hàm wrapper thực hiện request với proxy\nfunction requestWithProxy(method, url, params = {}) {\n  const proxy = getRandomProxy();\n  if (proxy) {\n    // Định dạng proxy mà k6 hiểu: http://username:password@host:port\n    const [hostPort, user, pass] = proxy.split(':');\n    // Nếu chuỗi proxy có format host:port:user:pass\n    const parts = proxy.split(':');\n    let proxyAuth = '';\n    let proxyHost = '';\n    if (parts.length === 4) {\n      [proxyHost, proxyPort, proxyUser, proxyPass] = parts;\n      proxyAuth = `${proxyUser}:${proxyPass}@`;\n    } else if (parts.length === 2) {\n      [proxyHost, proxyPort] = parts;\n    } else {\n      // fallback: chỉ host:port\n      [proxyHost, proxyPort] = proxy.split(':');\n    }\n    const proxyUrl = `http://${proxyAuth}${proxyHost}:${proxyPort}`;\n    // Gán proxy vào params\n    params = Object.assign({}, params, {\n      proxy: {\n        http: proxyUrl,\n        https: proxyUrl,\n      },\n    });\n  }\n  return http.request(method, url, null, params);\n}\n\nexport const options = {\n  stages: [\n    { duration: '2m', target: 20 },   // ramp-up\n    { duration: '5m', target: 20 },   // steady\n    { duration: '2m', target: 0 },    // ramp-down\n  ],\n  thresholds: {\n    http_req_failed: ['rate\u003C0.01'],   // lỗi \u003C1%\n    http_req_duration: ['p(95)\u003C500'], // 95% request dưới 500ms\n  },\n};\n\nexport default function () {\n  const res = requestWithProxy('GET', 'https://httpbin.org/ip');\n  check(res, {\n    'status is 200': (r) => r.status === 200,\n    'IP returned': (r) => r.body.length > 0,\n  });\n  sleep(1);\n}\n```\n\n#### Giải thích script\n\n- `__ENV.K6_PROXY_LIST` là 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\\\n","https://blog-api.ro-proxy.com/api/blog/posts/cau-hinh-proxy-cho-k6-load-testing-tranh-chan-ip/assets"]