[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog:post:vi:cau-hinh-proxy-cho-locust-load-testing-va-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-locust-load-testing-va-tranh-chan-ip","vi","Cấu hình proxy cho Locust load testing và tránh chặn IP","Hướng dẫn chi tiết cách thiết lập proxy trong công cụ Locust để thực hiện load testing ổn định, tránh bị chặn IP và tối ưu hiệu suất.","2026-07-18",[10,11,12,13],"locust","load-testing","proxy","performance",[10,11,12,13],"https://blog-api.ro-proxy.com/api/blog/posts/cau-hinh-proxy-cho-locust-load-testing-va-tranh-chan-ip/thumbnail.svg?lang=vi",[5],"## Giới thiệu về Locust và tại sao cần proxy\n\nLocust là công cụ kiểm tra hiệu suất mã nguồn mở, cho phép mô phifflng hàng nghìn người dùng ảo bằng Python. Khi chạy thử nghiệm tải trọng lớn, việc gửi nhiều request từ cùng một địa chỉ IP dễ dẫn đến bị chặn, giới hạn tốc độ hoặc nhận được phản hồi sai do cơ chế bảo vệ của máy chủ đích. Việc sử dụng proxy giúp\n\n- Phân tán lưu lượng ra nhiều IP khác nhau.\n- Giảm nguy cơ bị chặn do Rate Limiting hoặc anti‑bot.\n- Mô phỏng truy cập từ các vị trí địa lý khác nhau (nếu proxy có thể chọn theo quốc gia).\n- Bảo vệ IP thực của máy kiểm tra khỏi bị ghi log hoặc tấn công násled.\n\n## Chuẩn bị môi trường\n\nTrước khi bắt đầu, cần cài đặt Locust và một số thư viện hỗ trợ\n\n```bash\npip install locust requests\n```\n\nTạo thư mục dự án và file `locustfile.py` chứa kịch bản kiểm tra cơ bản.\n\n## Kịch bản kiểm tra đơn giản\n\nDưới đây là ví dụ một `HttpUser` truy cập trang chủ của một website mục tiêu\n\n```python\nfrom locust import HttpUser, task, between\n\nclass BrowseUser(HttpUser):\n    wait_time = between(1, 3)\n\n    @task\n    def load_homepage(self):\n        self.client.get('/')\n```\n\n## Truyền proxy qua tham số dòng lệnh\n\nLocust cho phép chỉ định proxy cho toàn bộ quá trình chạy bằng cách sử dụng biến môi trường `HTTP_PROXY` và `HTTPS_PROXY` hoặc tham số `--proxy`. Ví dụ\n\n```bash\nlocust -f locustfile.py --headless -u 200 -r 20 --run-time 5m --proxy http://user:pass@proxy.roproxy.com:3128\n```\n\nTrong lệnh trên\n\n- `--headless` chạy không giao diện.\n- `-u 200` mô phỏng 200 người dùng ảo.\n- `-r 20` tăng 20 người dùng mỗi giây.\n- `--run-time 5m` chạy trong 5 phút.\n- `--proxy` chỉ định địa chỉ proxy mà tất cả request sẽ đi qua.\n\n## Cấu hình proxy trong code (tùy chỉnh hơn)\n\nNếu muốn mỗi người dùng hoặc mỗi request sử dụng proxy khác nhau, chúng ta có thể overriding session của `HttpUser`. Dưới đây là cách tạo danh sách proxy và chọn ngẫu nhiên cho mỗi user\n\n```python\nimport random\nfrom locust import HttpUser, task, between\n\nPROXIES = [\n    'http://user1:pass1@proxy1.roproxy.com:3128',\n    'http://user2:pass2@proxy2.roproxy.com:3128',\n    'http://user3:pass3@proxy3.roproxy.com:3128',\n]\n\nclass ProxyUser(HttpUser):\n    wait_time = between(1, 2)\n\n    def on_start(self):\n        # chọn một proxy ngẫu nhiên khi user khởi động\n        proxy = random.choice(PROXIES)\n        self.client.proxies = {\n            'http': proxy,\n            'https': proxy,\n        }\n\n    @task\n    def load_api(self):\n        self.client.get('/api/items')\n```\n\n## Luân phiên proxy theo mỗi request (rotating proxy)\n\nMột số trường hợp cần thay đổi proxy cho mỗi request để tránh việc một IP được sử dụng quá nhiều. Ta có thể override phương thức `request` của session hoặc sử dụng hook events. Dưới đây là cách dùng `request_event` để thay đổi proxy trước mỗi request\n\n```python\nfrom locust import HttpUser, task, between, events\nimport random\n\nPROXIES = [\n    'http://user1:pass1@proxy1.roproxy.com:3128',\n    'http://user2:pass2@proxy2.roproxy.com:3128',\n    'http://user3:pass3@proxy3.roproxy.com:3128',\n]\n\nclass RotatingProxyUser(HttpUser):\n    wait_time = between(1, 2)\n\n    @events.init.add_listener\n    def on_locust_init(environment, **kwargs):\n        # lưu danh sách proxy vào environment để mọi user truy cập\n        environment.parsed_options.proxies = PROXIES\n\n    def setup_proxy(self):\n        proxy = random.choice(self.environment.parsed_options.proxies)\n        self.client.proxies = {'http': proxy, 'https': proxy}\n\n    @events.request.add_listener\n    def _on_request(self, request_type, name, response, **kwargs):\n        # thay đổi proxy sau mỗi request thành công\n        self.setup_proxy()\n\n    @task\n    def call_endpoint(self):\n        self.setup_proxy()   # đảm bảo première request dùng proxy\n        self.client.get('/endpoint')\n```\n\n> Lưu ý Cách trên thay đổi proxy sau mỗi request nhưng có thể làm tăng overhead do tạo kết nối TCP mới. Nếu mục tiêu là mô phỏng nhiều người dùng thực tế với IP-fixed trong thời gian ngắn hãy cân đối giữa rotating và sticky.\n\n## Kiểm tra và debug proxy\n\nĐể đảm bảo proxy đang hoạt động đúng chúng ta có thể ghi log địa chỉ IP mà request thấy được từ phía server. Giả sử endpoint `/ip` trả về IP công cộng của requester\n\n```python\n    @task\n    def check_ip(self):\n        with self.client.get('/ip', catch_response=True) as resp:\n            if resp.status_code == 200:\n                ip = resp.text.strip()\n                self.environment.events.request.fire(\n                    request_type='GET',\n                    name='check_ip',\n                    response_time=resp.elapsed.total_seconds()*1000,\n                    response_length=len(resp.text),\n                    exception=None,\n                    context={},\n                    extra={'detected_ip': ip}\n                )\n            else:\n                resp.failure(f'Status code {resp.status_code}')\n```\n\nTrong log Locust sẽ xuất hiện trường `detected_ip` giúp chúng ta xác nhận proxy đang được sử dụng.\n\n## Tối ưu hiệu suất khi dùng proxy\n\n1. Chọn proxy gần đích – latency thấp giúp tăng throughput và giảm thời gian chờ.\n2. Giới hạn số kết nối đồng thời – một số proxy service có giới hạn kết nối; cấu hình `-w` (số worker) trong Locust để không vượt quá.\n3. Sử dụng keep‑alive – đảm bảo `requests` session reuse kết nối để giảm tải handshake TLS.\n4. Giám sát lỗi proxy – theo dõi sự kiện `request_failure` để phát hiện proxy die và tự động loại bỏ khỏi danh sách.\n5. Throttle tốc độ – nếu mục tiêu có Rate Limiting nghiêm ngặt điều chỉnh spawn rate (`-r`) và wait time giữa các task.\n\n## Lưu ý pháp lý và ethics\n\n- Chỉ chạy thử nghiệm trên hệ thống mà bạn có quyền hoặc đã nhận được permiso explícito từ chủ sở hữu.\n- Tránh gửi lượng request quá lớn có thể làm ngừng dịch vụ (DoS) mà không có sự đồng ý.\n- Tuân thủ các quy định về bảo vệ dữ liệu và riêng tư khi thu thập thông qua proxy.\n- Chọn nhà cung cấp proxy uy tín như RoProxy để đảm bảo IP sạch, không bị blacklist và có chính sách sử dụng rõ ràng.\n\n## Kết luận\n\nViệc tích hợp proxy vào quy trình load testing với Locust giúp bạn mô phỏng truy cập thực tế từ nhiều nguồn IP tránh bị chặn và thu được kết quả đo lường chính xác hơn. Bắt đầu bằng cấu hình đơn giản qua tham số `--proxy` sau đó nâng cao tới rotating proxy hoặc sticky session tùy thuộc vào mục tiêu kiểm tra. Hãy luôn giám sát tối ưu latency và tuân thủ nguyên tắc ethics để kiểm tra hiệu suất thành công và bền vững.\n","https://blog-api.ro-proxy.com/api/blog/posts/cau-hinh-proxy-cho-locust-load-testing-va-tranh-chan-ip/assets"]