Ngiêm cấm sử đụng PROXY và VPS vào mục đích trái pháp luật bạn sẽ phải chịu toàn bộ trách nhiệm trước pháp luật khi sử dụng dịch vụ của chúng tôi tks!
Ruby proxy: Net::HTTP, Faraday và HTTParty qua proxy

Ruby proxy: Net::HTTP, Faraday và HTTParty qua proxy

Chuyên viên Kỹ thuật ProxyVN 08-24-2026 Đang tính... phút đọc

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

Các thư viện gửi yêu cầu HTTP

Bảng: Các thư viện HTTP phổ biến

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

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

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

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

Bảng: 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

Bảng: 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

Bảng: 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.

TIN TỨC LIÊN QUAN