Ruby proxy: Net::HTTP, Faraday và HTTParty qua proxy
Ruby proxy là cách cho chương trình Ruby gửi yêu cầu HTTP qua máy chủ proxy. Người viết Ruby cần proxy khi thu thập dữ liệu web, gọi API từ máy chủ trong mạng kín, kiểm thử ứng dụng Rails qua IP vùng khác, hoặc đơn giản là cài gem trong mạng công ty có proxy. Mỗi thư viện HTTP của Ruby có cách đặt proxy riêng: Net::HTTP của thư viện chuẩn nhận proxy qua tham số hoặc biến môi trường, Faraday nhận tuỳ chọn proxy, HTTParty có các tuỳ chọn http_proxyaddr, Mechanize có set_proxy. SOCKS5 cần thêm gem. Bài này ProxyVN hướng dẫn từng thư viện, cách dùng biến môi trường, SOCKS5, cài gem và bundler sau proxy, cùng các lỗi thường gặp. Xem thêm dịch vụ tại ProxyVN.
Tổng quan về proxy trong Ruby
Các thư viện HTTP phổ biến

Các thư viện gửi yêu cầu HTTP
Thư viện |
Đặc điểm |
Đặt proxy |
|---|---|---|
Net::HTTP |
Thư viện chuẩn, không cần cài |
Tham số khi tạo kết nối hoặc biến môi trường |
Faraday |
Lớp trừu tượng, nhiều bộ chuyển đổi |
Tuỳ chọn proxy |
HTTParty |
Cú pháp gọn, phổ biến |
Tuỳ chọn http_proxyaddr, http_proxyport |
Mechanize |
Mô phỏng trình duyệt, giữ cookie, điền biểu mẫu |
set_proxy |
RestClient |
Đơn giản |
Thuộc tính proxy toàn cục |
Định dạng địa chỉ proxy
http://203.0.113.10:8080
http://user01:matkhau01@203.0.113.10:8080
socks5://203.0.113.10:1080
Mật khẩu có ký tự đặc biệt cần mã hoá kiểu URL. Định dạng proxy theo từng công cụ có trong bài định dạng proxy.
Proxy với Net::HTTP
Truyền proxy khi tạo kết nối
Net::HTTP.new nhận địa chỉ, cổng của máy đích, rồi địa chỉ, cổng, tài khoản, mật khẩu của proxy:
require "net/http"
uri = URI("https://api.ipify.org?format=json")
http = Net::HTTP.new(uri.host, uri.port, "203.0.113.10", 8080, "user01", "matkhau01")
http.use_ssl = true
res = http.get(uri.request_uri)
puts res.body
Tài liệu đầy đủ của lớp Net::HTTP có tại trang tài liệu Ruby về Net::HTTP.
Dùng Net::HTTP.start
Net::HTTP.start(uri.host, uri.port, "203.0.113.10", 8080, "user01", "matkhau01", use_ssl: true) do |http|
puts http.get(uri.request_uri).body
end
Theo biến môi trường
Khi không truyền tham số proxy, Net::HTTP mặc định đọc biến môi trường http_proxy (và https_proxy với yêu cầu HTTPS ở các phiên bản Ruby mới), tôn trọng no_proxy. Muốn tắt hẳn việc đọc biến môi trường, truyền nil cho tham số địa chỉ proxy.
Kiểm tra đang dùng proxy
puts http.proxy?
puts http.proxy_address
Proxy với Faraday
Tuỳ chọn proxy
require "faraday"
conn = Faraday.new(
url: "https://api.ipify.org",
proxy: "http://user01:matkhau01@203.0.113.10:8080"
)
puts conn.get("/", format: "json").body
Faraday là lớp trừu tượng, bộ chuyển đổi bên dưới (Net::HTTP, Typhoeus, httpx) thực hiện kết nối. Phần lớn bộ chuyển đổi hỗ trợ proxy HTTP. Tài liệu có tại trang Faraday.
Theo biến môi trường
Faraday đọc biến http_proxy, https_proxy, no_proxy nếu không truyền tuỳ chọn proxy. Truyền proxy: nil hoặc cấu hình tương ứng để tắt khi cần.
Đổi proxy theo từng yêu cầu
Tạo nhiều đối tượng kết nối, mỗi đối tượng một proxy. Đối tượng kết nối của Faraday nên tái sử dụng, không tạo mới cho mỗi yêu cầu.
Proxy với HTTParty
Tuỳ chọn theo từng yêu cầu
require "httparty"
res = HTTParty.get("https://api.ipify.org?format=json",
http_proxyaddr: "203.0.113.10",
http_proxyport: 8080,
http_proxyuser: "user01",
http_proxypass: "matkhau01")
puts res.body
Đặt cho cả lớp
class ApiClient
include HTTParty
base_uri "https://api.example.com"
http_proxy "203.0.113.10", 8080, "user01", "matkhau01"
end
Mọi yêu cầu qua lớp ApiClient đi qua proxy. Mã nguồn và tài liệu tại kho HTTParty.
Proxy với Mechanize
Mechanize mô phỏng trình duyệt: giữ cookie, theo chuyển hướng, điền biểu mẫu. Hợp với thu thập trang cần đăng nhập đơn giản.
require "mechanize"
agent = Mechanize.new
agent.set_proxy("203.0.113.10", 8080, "user01", "matkhau01")
agent.user_agent_alias = "Windows Chrome"
page = agent.get("https://api.ipify.org")
puts page.body
Mechanize xây trên net-http-persistent, giữ kết nối tới proxy để tái sử dụng. Mã nguồn tại kho Mechanize.
Proxy qua biến môi trường

Biến môi trường proxy
Đặt biến
export http_proxy=http://user01:matkhau01@203.0.113.10:8080
export https_proxy=$http_proxy
export no_proxy=localhost,127.0.0.1,.noibo.local
ruby thu_thap.rb
Trên Windows dùng set trong Command Prompt hoặc $env: trong PowerShell.
Thư viện nào đọc biến
Net::HTTP, Faraday, RestClient, gem install, bundler đọc biến môi trường. HTTParty dùng Net::HTTP bên dưới nên cũng chịu ảnh hưởng khi không đặt tuỳ chọn riêng. Biến no_proxy giúp các địa chỉ nội bộ đi thẳng, cách viết có trong bài no_proxy là gì.
Đặt trong ứng dụng Rails
Đặt biến trong tệp cấu hình môi trường của máy chủ hoặc dịch vụ chạy ứng dụng, không ghi cứng trong mã. Tách proxy theo môi trường phát triển, thử nghiệm, sản xuất.
Proxy SOCKS5 trong Ruby

SOCKS5 cho Ruby
Net::HTTP không hỗ trợ SOCKS trực tiếp
Net::HTTP chỉ hỗ trợ proxy HTTP. Muốn dùng SOCKS5, cần gem bổ sung.
Dùng gem socksify
require "socksify/http"
uri = URI("https://api.ipify.org")
Net::HTTP.socks_proxy("203.0.113.10", 1080).start(uri.host, uri.port, use_ssl: true) do |http|
puts http.get(uri.request_uri).body
end
socksify thay thế cách mở socket để đi qua SOCKS. Có thể đặt toàn cục cho mọi kết nối TCP:
require "socksify"
TCPSocket.socks_server = "203.0.113.10"
TCPSocket.socks_port = 1080
Đặt toàn cục ảnh hưởng mọi thư viện trong tiến trình, kể cả kết nối cơ sở dữ liệu, dùng cẩn thận.
Thư viện hỗ trợ SOCKS sẵn
Một số thư viện HTTP mới như httpx có hỗ trợ SOCKS qua tuỳ chọn, không cần socksify. Faraday với bộ chuyển đổi httpx có thể dùng SOCKS5.
Xác thực SOCKS5
Khả năng xác thực tên, mật khẩu SOCKS5 tuỳ phiên bản gem. Nếu gặp khó, dùng proxy HTTP có xác thực hoặc SOCKS5 xác thực bằng IP whitelist.
Cài gem và bundler sau proxy công ty

Cài thư viện sau proxy công ty
gem install
gem install rails --http-proxy http://user01:matkhau01@10.0.0.5:3128
Hoặc đặt biến http_proxy, https_proxy trước khi chạy gem.
Bundler
Bundler đọc biến môi trường proxy. Đặt biến rồi chạy bundle install. Với kho gem nội bộ hoặc kho gương, cấu hình bằng bundle config mirror.
Lỗi chứng chỉ với proxy công ty
Proxy công ty giải mã HTTPS bằng chứng chỉ riêng làm gem báo lỗi SSL. Thêm chứng chỉ gốc của công ty vào kho chứng chỉ mà Ruby dùng, hoặc đặt biến SSL_CERT_FILE trỏ tới tệp chứng chỉ có chứng chỉ công ty. Không tắt kiểm tra chứng chỉ.
Xoay proxy khi thu thập dữ liệu
Danh sách proxy
PROXIES = [
["203.0.113.10", 8080], ["203.0.113.11", 8080], ["203.0.113.12", 8080]
]
def lay_trang(url, i)
host, port = PROXIES[i % PROXIES.size]
uri = URI(url)
Net::HTTP.start(uri.host, uri.port, host, port, "user01", "matkhau01", use_ssl: true, open_timeout: 10, read_timeout: 20) do |http|
http.get(uri.request_uri)
end
end
Thử lại và giới hạn tốc độ
- Đặt thời gian chờ kết nối và đọc.
- Gặp lỗi mạng thì thử proxy khác, tối đa vài lần.
- Nghỉ giữa các yêu cầu, tôn trọng robots.txt và điều khoản của trang.
- Gặp mã 429 thì giảm tốc độ.
Khi nào chương trình Ruby cần proxy
Thu thập dữ liệu web
Kịch bản Ruby thu thập giá, tin tức, thông tin sản phẩm gửi nhiều yêu cầu tới một trang. Từ một IP, trang có thể giới hạn tần suất hoặc chặn. Proxy giúp phân tán yêu cầu, và IP theo vùng giúp thấy nội dung đúng như người dùng ở vùng đó. Nguyên tắc vẫn là thu thập có chừng mực, tôn trọng điều khoản của trang, không lấy dữ liệu cá nhân trái quy định.
Gọi API từ máy chủ trong mạng kín
Ứng dụng Rails chạy trong mạng doanh nghiệp, máy chủ không ra Internet trực tiếp mà phải qua proxy. Mọi lời gọi API thanh toán, gửi thư, lưu trữ đám mây từ ứng dụng phải đi qua proxy công ty. Đặt biến môi trường cho dịch vụ chạy ứng dụng là cách gọn nhất.
Gọi API yêu cầu IP cố định
Nhiều đối tác, cổng thanh toán, ngân hàng chỉ cho gọi API từ IP đã đăng ký. Máy chủ đặt trên nền tảng đám mây có IP thay đổi khi triển khai lại. Cho mọi lời gọi tới đối tác đi qua một proxy IP tĩnh giải quyết vấn đề, chỉ cần đăng ký một IP.
Kiểm thử theo vùng
Ứng dụng hiển thị giá, ngôn ngữ, nội dung theo vị trí IP. Kiểm thử tự động bằng Ruby qua proxy ở từng vùng giúp phát hiện lỗi hiển thị trước khi người dùng gặp.
Gỡ lỗi với công cụ chặn bắt
Trỏ chương trình Ruby qua công cụ chặn bắt HTTP chạy tại 127.0.0.1 để xem chính xác yêu cầu, phản hồi. Cách này giúp gỡ lỗi tích hợp API nhanh hơn đọc nhật ký.
Cách Net::HTTP đi qua proxy HTTP
Với trang HTTP
Net::HTTP gửi yêu cầu tới proxy kèm địa chỉ đầy đủ của trang. Proxy đọc được toàn bộ yêu cầu và phản hồi vì không mã hoá. Với dữ liệu nhạy cảm, luôn dùng HTTPS.
Với trang HTTPS
Net::HTTP gửi lệnh CONNECT tới proxy, yêu cầu mở đường hầm tới máy đích cổng 443. Proxy trả lời đồng ý, sau đó Net::HTTP bắt tay TLS trực tiếp với máy đích qua đường hầm. Proxy chỉ chuyển dữ liệu đã mã hoá, không đọc được nội dung.
Xác thực proxy
Tài khoản, mật khẩu proxy gửi trong tiêu đề Proxy-Authorization dạng Basic. Với yêu cầu HTTPS, tiêu đề này nằm trong lệnh CONNECT, không mã hoá trên đường từ máy tới proxy. Dùng proxy ở mạng tin cậy, hoặc xác thực bằng IP whitelist để không phải gửi mật khẩu.
Tổ chức mã Ruby dùng proxy cho gọn
Một nơi cấu hình
Tạo một mô-đun hoặc lớp tạo kết nối HTTP, đọc proxy từ biến môi trường hoặc tệp cấu hình. Mọi phần khác của chương trình gọi qua lớp này. Đổi proxy chỉ sửa một chỗ.
module HttpClient
def self.conn
@conn ||= Faraday.new(proxy: ENV["APP_PROXY"]) do |f|
f.options.timeout = 20
f.options.open_timeout = 10
end
end
end
Không ghi mật khẩu vào mã
Mật khẩu proxy để trong biến môi trường hoặc kho bí mật của ứng dụng như credentials của Rails. Mã đưa lên kho chỉ chứa tên biến.
Ghi nhật ký có chừng mực
Ghi nhật ký proxy đã dùng, thời gian, mã phản hồi để theo dõi chất lượng proxy. Không ghi mật khẩu proxy vào nhật ký, cẩn thận khi in cả chuỗi địa chỉ proxy có chứa mật khẩu.
Proxy trong ứng dụng Rails
Gọi API bên ngoài từ Rails
Ứng dụng Rails gọi API bên ngoài thường qua một lớp dịch vụ riêng, dùng Faraday hoặc HTTParty. Đặt proxy trong lớp dịch vụ đó, đọc từ cấu hình theo môi trường. Môi trường phát triển trên máy lập trình viên có thể không cần proxy, môi trường sản xuất trong mạng doanh nghiệp thì cần.
Active Job và tác vụ nền
Tác vụ nền chạy bằng Sidekiq, Resque có tiến trình riêng. Biến môi trường proxy phải đặt cho cả tiến trình worker, không chỉ tiến trình web. Lỗi hay gặp: web gọi API được, tác vụ nền thì lỗi kết nối, vì worker khởi động thiếu biến môi trường.
Gửi thư qua SMTP
Proxy HTTP không chuyển được kết nối SMTP. Ứng dụng gửi thư từ mạng kín cần máy chủ chuyển tiếp thư nội bộ hoặc dịch vụ gửi thư qua API HTTPS, khi đó API đi qua proxy như mọi lời gọi khác.
Active Storage và dịch vụ lưu trữ đám mây
Thư viện của các dịch vụ lưu trữ đám mây đọc biến môi trường proxy hoặc có tuỳ chọn proxy riêng trong cấu hình. Kiểm tra tài liệu của từng thư viện khi ứng dụng tải tệp lên đám mây từ mạng kín.
Kiểm thử với WebMock, VCR
Kiểm thử tự động thường chặn mọi yêu cầu mạng thật bằng WebMock, ghi lại phản hồi bằng VCR. Khi có proxy trong cấu hình, đảm bảo bộ kiểm thử không vô tình gửi yêu cầu thật qua proxy, vì sẽ làm kiểm thử chậm và phụ thuộc mạng.
Hiệu năng khi dùng proxy trong Ruby
Tái sử dụng kết nối
Mở kết nối mới qua proxy tốn thêm một chặng bắt tay. Với nhiều yêu cầu tới cùng máy đích, giữ kết nối mở và tái sử dụng: dùng Net::HTTP.start với khối lệnh gửi nhiều yêu cầu, hoặc thư viện có bể kết nối như net-http-persistent.
Chạy song song
Ruby có thể gửi nhiều yêu cầu song song bằng luồng, hoặc thư viện như Typhoeus, httpx hỗ trợ gửi đồng thời. Mỗi luồng có thể dùng một proxy khác. Giới hạn số luồng theo khả năng của proxy và để không gây quá tải cho trang đích.
Thời gian chờ
Proxy thêm độ trễ. Đặt open_timeout cho bước kết nối và read_timeout cho bước chờ dữ liệu, vừa đủ để không treo chương trình khi proxy chết, vừa đủ dài để proxy chậm vẫn kịp trả lời.
Theo dõi chất lượng proxy
Ghi lại thời gian phản hồi và tỷ lệ lỗi theo từng proxy. Proxy có tỷ lệ lỗi cao hoặc chậm bất thường nên loại khỏi danh sách xoay, báo nhà cung cấp kiểm tra.
Ví dụ: kịch bản theo dõi giá chạy hằng ngày
Một nhóm phân tích viết kịch bản Ruby theo dõi giá 500 sản phẩm trên vài trang bán hàng Việt Nam, chạy mỗi sáng trên máy chủ thuê ở nước ngoài.
Vấn đề
Chạy từ máy chủ nước ngoài, một số trang hiển thị giá theo vùng khác, một số trang giới hạn tần suất sau vài chục yêu cầu.
Cách làm
- Dùng Faraday với danh sách năm proxy IP Việt Nam, xoay theo vòng.
- Mỗi yêu cầu nghỉ hai giây, mỗi proxy xử lý khoảng 100 sản phẩm.
- Đặt open_timeout 10 giây, timeout 20 giây, thử lại tối đa hai lần với proxy khác.
- Lưu kết quả vào cơ sở dữ liệu, ghi nhật ký proxy và mã phản hồi.
Kết quả
Kịch bản chạy xong trong khoảng 20 phút, giá đúng như người dùng Việt Nam thấy, tỷ lệ lỗi dưới 1%. Nhóm theo dõi nhật ký mỗi tuần để thay proxy kém.
Chọn thư viện HTTP nào khi cần proxy
Net::HTTP cho kịch bản nhỏ
Không cần cài thêm, có sẵn trong Ruby, hỗ trợ proxy HTTP có xác thực. Hợp với kịch bản ngắn, công cụ nội bộ, nơi không muốn thêm phụ thuộc. Nhược điểm là cú pháp dài dòng, phải tự xử lý chuyển hướng, thử lại.
Faraday cho ứng dụng lớn
Faraday có hệ thống middleware cho thử lại, ghi nhật ký, phân tích JSON, xác thực. Đổi bộ chuyển đổi bên dưới mà không sửa mã gọi. Hợp với ứng dụng Rails, thư viện gọi nhiều API. Cấu hình proxy một lần ở đối tượng kết nối.
HTTParty cho mã gọn
Cú pháp ngắn, đọc dễ, hợp với lớp gọi API đơn giản. Đặt proxy ở mức lớp tiện cho một API cụ thể. Khi cần middleware phức tạp, chuyển sang Faraday.
Mechanize cho trang cần phiên
Khi phải đăng nhập, giữ cookie, điền biểu mẫu, Mechanize tiện hơn tự xử lý bằng Net::HTTP. Không chạy JavaScript, nên trang dựng bằng JavaScript cần trình duyệt không giao diện.
Trình duyệt không giao diện
Với trang dựng bằng JavaScript, dùng thư viện điều khiển trình duyệt như Ferrum (điều khiển Chrome qua giao thức DevTools) hoặc Selenium cho Ruby. Proxy truyền qua tham số khởi chạy trình duyệt. Proxy có mật khẩu gặp giới hạn giống Chrome thông thường, nên ưu tiên proxy xác thực bằng IP.
Bảng chọn nhanh
Nhu cầu |
Thư viện gợi ý |
|---|---|
Kịch bản nhỏ, không phụ thuộc |
Net::HTTP |
Ứng dụng nhiều API, cần middleware |
Faraday |
Lớp gọi API gọn |
HTTParty |
Trang cần đăng nhập, biểu mẫu |
Mechanize |
Trang dựng bằng JavaScript |
Ferrum, Selenium |
Cần SOCKS5 |
httpx hoặc Net::HTTP với socksify |
Bảo mật khi dùng proxy trong Ruby
Chỉ dùng proxy tin cậy
Proxy thấy được địa chỉ đích, thời điểm, dung lượng, và với HTTP thường thì thấy cả nội dung. Không gửi dữ liệu nhạy cảm qua HTTP thường, không dùng proxy miễn phí cho ứng dụng thật.
Kiểm tra chứng chỉ
Không đặt verify_mode thành bỏ qua kiểm tra chứng chỉ để "sửa" lỗi SSL khi đi qua proxy. Lỗi SSL qua proxy công ty xử lý bằng cách thêm chứng chỉ gốc của công ty vào kho chứng chỉ.
Biến môi trường trong container
Khi chạy ứng dụng Ruby trong container, truyền proxy qua biến môi trường lúc chạy, không đưa vào ảnh container. Ảnh container có thể bị chia sẻ, chứa mật khẩu proxy là lộ.
Gỡ lỗi proxy trong Ruby từng bước
Bước 1: kiểm tra proxy ngoài Ruby
Dùng curl với đúng địa chỉ, tài khoản proxy. curl lỗi thì sửa proxy trước, đừng gỡ lỗi mã Ruby.
Bước 2: in cấu hình thật sự
In ra http.proxy?, http.proxy_address với Net::HTTP, hoặc in tuỳ chọn proxy của đối tượng Faraday. Nhiều khi proxy không được dùng vì biến môi trường viết sai tên, hoặc no_proxy khớp với tên máy đích.
Bước 3: bật nhật ký chi tiết
Net::HTTP có set_debug_output để in toàn bộ trao đổi với máy chủ, gồm lệnh CONNECT gửi tới proxy và phản hồi của proxy:
http.set_debug_output($stdout)
Thấy phản hồi 407 là lỗi xác thực, 403 là proxy chặn đích, không có CONNECT là proxy không được dùng. Tắt dòng này khi chạy thật vì có thể in ra thông tin nhạy cảm.
Bước 4: thử trang đơn giản
Gửi yêu cầu tới trang trả về IP như api.ipify.org. Thành công nghĩa là proxy hoạt động trong Ruby, lỗi còn lại nằm ở trang đích: chặn IP proxy, yêu cầu tiêu đề đặc biệt, giới hạn tần suất.
Bước 5: kiểm tra phiên bản
Phiên bản Ruby, OpenSSL, gem quá cũ có thể không hỗ trợ giao thức TLS mà trang đích yêu cầu. Lỗi bắt tay TLS khi đi qua proxy đôi khi là lỗi phiên bản, không phải lỗi proxy. Cập nhật Ruby và gem lên phiên bản được hỗ trợ.
Proxy cho công cụ dòng lệnh viết bằng Ruby
Nhiều công cụ phổ biến viết bằng Ruby như công cụ triển khai, công cụ tạo trang tĩnh, công cụ quản lý máy chủ. Khi chạy sau proxy công ty, phần lớn đọc biến http_proxy, https_proxy vì dùng Net::HTTP bên dưới. Đặt biến trong tệp cấu hình shell là các công cụ này tự đi qua proxy, không phải cấu hình từng công cụ.
RestClient và các thư viện khác
RestClient là thư viện đơn giản, đặt proxy toàn cục bằng RestClient.proxy = "http://user01:matkhau01@203.0.113.10:8080", hoặc truyền proxy cho từng yêu cầu qua RestClient::Request.execute với tham số proxy. Typhoeus, dựa trên libcurl, nhận tuỳ chọn proxy và proxyuserpwd, hỗ trợ cả SOCKS5 nhờ libcurl. Excon, thư viện HTTP nhanh dùng trong nhiều gem đám mây, nhận tuỳ chọn proxy khi tạo kết nối và đọc biến môi trường. Khi một gem lớn dùng thư viện HTTP riêng bên trong, đọc tài liệu của gem đó để biết nó lấy proxy từ đâu, thường là biến môi trường hoặc một tuỳ chọn cấu hình riêng. Nắm được thư viện nào đứng bên dưới là gỡ được phần lớn rắc rối về proxy trong dự án Ruby.
Kiểm tra IP ra ngoài trong chương trình
Thêm một bước kiểm tra lúc chương trình khởi động: gửi yêu cầu tới trang trả về IP, ghi kết quả vào nhật ký. Với kịch bản chạy định kỳ, bước này giúp phát hiện ngay khi proxy hết hạn hoặc nhà cung cấp đổi IP, thay vì phát hiện sau khi dữ liệu thu được đã sai vùng hoặc toàn lỗi.
Ghi chú về phiên bản Ruby
Cách Net::HTTP đọc biến https_proxy và no_proxy thay đổi qua các phiên bản Ruby. Ở phiên bản cũ, Net::HTTP chỉ đọc http_proxy cho mọi yêu cầu. Dự án chạy trên nhiều phiên bản Ruby khác nhau nên truyền proxy trực tiếp vào mã thay vì phụ thuộc biến môi trường, để hành vi giống nhau ở mọi nơi.
Lỗi thường gặp
Lỗi |
Nguyên nhân hay gặp |
Cách xử lý |
|---|---|---|
Errno::ECONNREFUSED |
Sai địa chỉ, cổng proxy, proxy chết |
Kiểm tra bằng curl |
Net::HTTPProxyAuthenticationRequired (407) |
Thiếu hoặc sai tài khoản proxy |
Truyền đúng tài khoản, mật khẩu |
OpenSSL::SSL::SSLError |
Proxy công ty giải mã HTTPS |
Thêm chứng chỉ gốc vào kho |
Net::OpenTimeout |
Proxy chậm, mạng chặn |
Tăng thời gian chờ, đổi proxy |
Không đi qua proxy dù đã đặt biến |
Biến viết sai, no_proxy khớp, thư viện không đọc biến |
Truyền proxy trực tiếp |
SOCKS không hoạt động |
Net::HTTP không hỗ trợ SOCKS |
Dùng socksify hoặc thư viện hỗ trợ SOCKS |
Kiểm tra proxy độc lập
curl -x http://user01:matkhau01@203.0.113.10:8080 https://api.ipify.org
So sánh với ngôn ngữ khác
Ngôn ngữ |
Cách đặt proxy phổ biến |
|---|---|
Ruby |
Tham số Net::HTTP, tuỳ chọn Faraday, HTTParty |
PHP |
CURLOPT_PROXY trong cURL |
Java |
Đối tượng Proxy, thuộc tính hệ thống |
Rust |
reqwest::Proxy |
Hướng dẫn chi tiết có trong bài PHP cURL proxy, bài Java proxy và bài Rust reqwest proxy.
Chọn proxy cho dự án Ruby
Dự án thu thập dữ liệu, gọi API theo vùng cần proxy ổn định, hỗ trợ HTTP để dùng thẳng với Net::HTTP, Faraday, HTTParty. Anh em cần proxy HTTP, SOCKS5 IP Việt Nam hoặc datacenter Mỹ có thể mua proxy tại ProxyVN.
Câu hỏi thường gặp về Ruby proxy
Net::HTTP đặt proxy thế nào
Truyền địa chỉ, cổng, tài khoản, mật khẩu proxy vào Net::HTTP.new hoặc Net::HTTP.start, hoặc đặt biến http_proxy.
Faraday có đọc biến môi trường không
Có, khi không truyền tuỳ chọn proxy.
Ruby có hỗ trợ SOCKS5 không
Net::HTTP thì không. Dùng gem socksify hoặc thư viện hỗ trợ SOCKS như httpx.
gem install sau proxy công ty thế nào
Dùng tham số --http-proxy hoặc đặt biến http_proxy, https_proxy.
Lỗi SSL khi đi qua proxy công ty
Proxy giải mã HTTPS. Thêm chứng chỉ gốc công ty vào kho chứng chỉ Ruby dùng.
Mechanize đặt proxy ở đâu
Dùng agent.set_proxy(host, port, user, pass).
Tổng kết
Ruby proxy tuỳ thư viện: Net::HTTP nhận proxy qua tham số của Net::HTTP.new hoặc Net::HTTP.start và đọc biến http_proxy, Faraday nhận tuỳ chọn proxy, HTTParty dùng http_proxyaddr, http_proxyport hoặc http_proxy ở mức lớp, Mechanize dùng set_proxy. SOCKS5 cần gem socksify hoặc thư viện như httpx. Cài gem, bundler sau proxy công ty bằng biến môi trường hoặc --http-proxy, thêm chứng chỉ công ty khi gặp lỗi SSL. Khi thu thập dữ liệu, xoay proxy, đặt thời gian chờ, thử lại có giới hạn và tôn trọng trang nguồn. Cần tư vấn về proxy, anh em liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam để được tư vấn.