Gắn proxy tĩnh vào Apache JMeter (HTTP Request Defaults và CSV credentials)

Khi bạn load-test hoặc regression HTTP bằng Apache JMeter nhưng server chỉ mở cho IP Việt Nam đã whitelist, toàn bộ thread group cần đi ra một proxy tĩnh ổn định. Bài này hướng dẫn cấu hình HTTP Request Defaults / HTTP Request với proxy host–port, lấy user/pass từ CSV Data Set, verify exit IP, và tránh lộ credential trong file .jmx commit lên git.

Khi nào JMeter cần proxy tĩnh?

  • API staging/production chỉ accept vài IP nguồn.
  • Thread group lớn: nếu dùng IP xoay, log phía server phân tán khó đối chiếu.
  • So sánh latency cảm nhận từ IP dân cư VN với IP văn phòng.
  • Smoke + soak test cần cùng exit IP giữa các lần chạy nightly.

IP xoay vẫn hợp lý khi giả lập nhiều ISP. Với whitelist B2B, một IP cố định thường đơn giản hơn.

Thông số đã xác nhận

Proxy tĩnh dân cư Việt Nam: 1.000đ/ngày hoặc 30.000đ/30 ngày; Viettel / VNPT / FPT; HTTP hoặc SOCKS5; mạng dân cư thật, IP sạch. Chi tiết: xem bảng giá. Checker: check-proxy.

Smoke-test trước khi mở JMeter

bash
curl -x "http://USER:PASS@HOST:PORT" --max-time 25 https://api.ipify.org echo

Ghi IP kỳ vọng. Đảm bảo máy chạy JMeter không còn VPN khác.

Cấu hình HTTP Request Defaults

  1. Thêm Config Element → HTTP Request Defaults vào Test Plan hoặc Thread Group.
  2. Tab Advanced (tên tab có thể khác nhẹ theo version):
    • Proxy Server: HOST
    • Port: PORT
    • Username / Password: để trống nếu bạn inject từ biến (khuyến nghị).
  3. Mọi HTTP Request con kế thừa proxy trừ khi override.

Hoặc set từng HTTP Request → Advanced → Proxy nếu chỉ một số sampler cần đi qua proxy.

Biến hóa credential bằng User Defined Variables + CSV

User Defined Variables (không commit giá trị thật):

PROXY_HOST ${__P(PROXY_HOST,)} PROXY_PORT ${__P(PROXY_PORT,8080)} PROXY_USER ${__P(PROXY_USER,)} PROXY_PASS ${__P(PROXY_PASS,)} EXPECTED_IP ${__P(EXPECTED_IP,)}

Chạy non-GUI:

bash
jmeter -n -t api-smoke.jmx \ -JPROXY_HOST=host.example \ -JPROXY_PORT=8080 \ -JPROXY_USER=user \ -JPROXY_PASS=secret \ -JEXPECTED_IP=x.x.x.x \ -l results.jtl -j jmeter.log

Trong HTTP Request Defaults / HTTP Request, Username = PROXYUSER</code>,Password=<code>{PROXY_USER}</code>, Password = <code>{PROXY_PASS}, Server = PROXYHOST</code>,Port=<code>{PROXY_HOST}</code>, Port = <code>{PROXY_PORT}.

CSV Data Set Config (khi xoay nhiều credential proxy — vẫn mỗi dòng một user:pass tĩnh):

proxy_user,proxy_pass user1,pass1

Filename ngoài repo; Variable Names proxy_user,proxy_pass; gắn vào field proxy auth.

Sampler verify exit IP (đặt đầu Thread Group)

  1. HTTP Request: GET https://api.ipify.org (hoặc ?format=json).
  2. JSON Extractor / Regular Expression Extractor → exit_ip.
  3. Response Assertion hoặc JSR223 Assertion:
groovy
def expected = props.get('EXPECTED_IP') ?: '' def actual = vars.get('exit_ip')?.trim() if (expected && actual != expected) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("Exit IP lệch: ${actual}") }

Fail sớm nếu IP không khớp panel — tránh chạy hàng nghìn sampler sai đường.

HTTP vs SOCKS5 trong JMeter

  • Proxy HTTP/HTTPS trong HTTP Request là lựa chọn phổ biến (CONNECT cho HTTPS đích).
  • SOCKS: một số version/plugin hỗ trợ qua JVM system props (socksProxyHost) — ảnh hưởng cả process; cân nhắc tách JVM chỉ cho test cần SOCKS.
  • Ưu tiên cổng HTTP của gói tĩnh nếu đủ dùng.

Ví dụ JVM (cẩn thận scope toàn process):

bash
export JVM_ARGS="-Dhttps.proxyHost=HOST -Dhttps.proxyPort=PORT -Dhttp.proxyHost=HOST -Dhttp.proxyPort=PORT" # Auth JVM proxy phức tạp hơn — ưu tiên field proxy trong HTTP Request

Checklist vận hành

  1. Không lưu mật khẩu proxy trong .jmx trên git — dùng -J hoặc CSV ngoài repo.
  2. Verify IP ở sampler đầu; gắn Assertion.
  3. Timeout connect/response hợp lý (20–30s) để phân biệt proxy chết và API chậm.
  4. Phân biệt 407 (proxy auth) với 5xx đích trong Listener.
  5. Distributed JMeter: mỗi engine cần cấu hình proxy riêng nếu enginge không cùng NAT.
  6. Sau rotate credential panel → cập nhật CI secret và chạy smoke 1 thread.

Lỗi thường gặp

Triệu chứng Hướng xử lý
Non-HTTP response code / connection reset Host/port sai; proxy down — chạy check-proxy
407 Sai user/pass hoặc biến ${PROXY_USER} chưa resolve
IP lệch Defaults chưa apply; sampler override; còn proxy hệ thống OS
HTTPS fail Thiếu CONNECT qua proxy HTTP; thử lại curl -x
CSV không đọc Đường dẫn relative khác khi -n từ directory khác

Kết luận

HTTP Request Defaults + biến -J / CSV giúp gắn proxy tĩnh vào JMeter sạch sẽ, phù hợp whitelist IP dân cư VN cố định. Xem thông số và xem bảng giá, rồi xác nhận live bằng check-proxy trước khi chạy soak overnight.