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!
Apache NiFi proxy: InvokeHTTP và Proxy Configuration Service

Apache NiFi proxy: InvokeHTTP, Proxy Configuration Service và JVM

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

Apache NiFi proxy là cách cho flow NiFi gọi HTTP ra ngoài qua máy chủ proxy, chủ yếu ở processor InvokeHTTP. NiFi có hai tầng proxy: Controller Service gắn vào từng processor và tham số proxy của cả JVM. ProxyVN đọc tài liệu NiFi 2.12.0, mã nguồn InvokeHTTP và OkHttp, rồi chạy thử proxy JVM trên Java 8 để chỉ ra tầng nào áp dụng cho đâu.

Apache NiFi proxy: tác vụ cụ thể và ranh giới với bài đã có

Việc bài này giải quyết

Một flow NiFi hay gặp là lấy danh sách URL từ hàng đợi, gọi API hoặc tải trang bằng InvokeHTTP, rồi đẩy kết quả sang bước xử lý tiếp. Khi máy NiFi chỉ ra Internet qua proxy, hoặc khi cần IP cố định để nguồn dữ liệu cho phép, request phải đi qua proxy. Mật khẩu proxy cũng phải được giữ kín, không nằm trong tệp flow xuất ra.

Bài này trả lời ba câu. Đặt proxy cho InvokeHTTP ở đâu. Giữ mật khẩu proxy thế nào. Vì sao đặt proxy cho JVM không làm mọi processor đi qua proxy giống nhau.

Đầu ra cần có: một flow thử gọi endpoint có kiểm soát, một bảng đọc relationship theo từng lỗi, và cách xác minh proxy bằng log phía proxy.

Ranh giới với các bài khác

Bài proxy cho Apache Airflow nói về proxy trong DAG Python. NiFi là công cụ khác: luồng dữ liệu vẽ trên giao diện, mỗi processor là một thành phần Java có thuộc tính riêng. Bài này không lặp lại cách đặt biến môi trường cho Python, chỉ nói về Controller Service, Parameter Context và tham số JVM của NiFi.

Proxy ở đây là proxy chiều ra cho request của flow. Bài không nói về đặt NiFi sau reverse proxy như Nginx để người dùng vào giao diện.

Phạm vi kiểm thử

Máy lab chỉ có Java 8u401, trong khi NiFi 2.x cần Java 21, nên bài không chạy NiFi. Thông tin về InvokeHTTP lấy từ trang tài liệu InvokeHTTP bản 2.12.0 và mã nguồn trên nhánh main ngày 29/10/2026: InvokeHTTP.java, ProxyAuthenticator.java, ProxyConfiguration.java, ProxySpec.java, cùng các tệp ConnectPlan.kt, RealRoutePlanner.kt, RouteSelector.kt của OkHttp. NiFi main khai báo OkHttp 5.5.1.

Phần chạy thật là proxy mức JVM: script jjs trên Java 8u401 gọi ProxySelector và HttpURLConnection qua một proxy HTTP tự dựng có tài khoản user1, mật khẩu p@ss#2026, cổng 9474.

Thiết lập Apache NiFi proxy cho InvokeHTTP bằng Proxy Configuration Service

Proxy Configuration Service gắn vào InvokeHTTP

Proxy Configuration Service gắn vào InvokeHTTP

Từ NiFi 2.x, InvokeHTTP không còn thuộc tính Proxy Host riêng. Proxy được khai báo trong một Controller Service rồi gắn vào processor.

Tạo StandardProxyConfigurationService

Theo tài liệu StandardProxyConfigurationService, service này có năm thuộc tính: Proxy Type, Proxy Server Host, Proxy Server Port, Proxy User Name, Proxy User Password, thêm SOCKS Version khi chọn SOCKS. Proxy Type có ba giá trị DIRECT, HTTP và SOCKS, mặc định DIRECT.

Các bước trên giao diện NiFi 2.x như sau.

  • Mở menu của Process Group chứa flow, chọn Controller Services.
  • Bấm dấu cộng, tìm StandardProxyConfigurationService và thêm vào.
  • Mở cấu hình, đặt Proxy Type là HTTP, Proxy Server Host và Proxy Server Port theo thông tin nhà cung cấp.
  • Đặt Proxy User Name, còn Proxy User Password để ở bước Parameter Context bên dưới.
  • Bật service bằng Enable.
  • Mở cấu hình InvokeHTTP, chọn service vừa tạo ở thuộc tính Proxy Configuration Service.

Service đặt ở Process Group thì mọi processor trong nhóm đó chọn được. Một service có thể dùng chung cho nhiều InvokeHTTP, đổi proxy chỉ cần sửa ở một chỗ.

InvokeHTTP dùng service ra sao

Hàm setUpClient của InvokeHTTP chạy khi processor được bật. Nó lấy cấu hình từ service, tạo đối tượng java.net.Proxy, gắn vào OkHttpClient. Nếu service có tài khoản, processor gắn thêm ProxyAuthenticator, lớp này trả về tiêu đề Proxy-Authorization dạng Basic.

Hàm createProxy tạo địa chỉ proxy bằng InetSocketAddress từ tên máy và cổng. Lớp này phân giải tên ngay khi tạo. Proxy đổi IP sau tên miền thì cần dừng rồi bật lại processor để phân giải lại.

Đổi cấu hình service khi processor đang chạy chưa đủ, phải dừng và bật lại InvokeHTTP vì client chỉ được dựng trong setUpClient.

HTTP và SOCKS

InvokeHTTP khai báo hai kiểu hỗ trợ là HTTP_AUTH và SOCKS. Hàm validateProxySpec trong ProxyConfiguration.java so kiểu của service với danh sách này. Chọn SOCKS kèm tên người dùng thì processor không hợp lệ với thông báo Proxy type SOCKS with Authentication is not supported.

Tài liệu InvokeHTTP cũng ghi với SOCKS, không bảo đảm phiên bản SOCKS đã chọn được processor dùng. Proxy SOCKS5 có tài khoản vì vậy không dùng được với InvokeHTTP. Dùng cổng HTTP của nhà cung cấp.

Thuộc tính cũ từ NiFi 1.x

Flow cũ của NiFi 1.x có các thuộc tính Proxy Host, Proxy Port, Proxy Type, invokehttp-proxy-user và invokehttp-proxy-password ngay trên InvokeHTTP. Hàm migrateProperties trong mã nguồn tự tạo một StandardProxyConfigurationService từ các giá trị đó khi nạp flow vào NiFi 2.x, rồi xóa thuộc tính cũ.

Sau khi nâng cấp, mở Controller Services để thấy service mới sinh ra. Mỗi InvokeHTTP cũ có thể sinh một service riêng, nên gom lại thành một service dùng chung cho dễ quản lý.

Quản lý thuộc tính nhạy cảm của Apache NiFi proxy bằng Parameter Context

Mật khẩu proxy là thuộc tính nhạy cảm. NiFi mã hóa nó trong tệp flow, nhưng cách đưa giá trị vào vẫn quyết định ai nhìn thấy.

Thuộc tính nhạy cảm hoạt động ra sao

Proxy User Password được đánh dấu sensitive. Giao diện không hiện lại giá trị sau khi lưu, chỉ hiện dòng báo đã đặt. Trong tệp flow.json.gz, NiFi mã hóa giá trị bằng khóa trong thuộc tính nifi.sensitive.props.key của nifi.properties.

Tệp flow chép sang máy khác có khóa khác sẽ không giải mã được mật khẩu. Đây là chuyện hay gặp khi chuyển flow giữa môi trường thử và môi trường chạy thật.

Dùng Parameter Context

Theo User Guide của NiFi, Parameter Context là bộ tham số gắn vào Process Group. Tham số đánh dấu sensitive chỉ được tham chiếu từ thuộc tính sensitive, theo cú pháp #{tên_tham_số}. Cách này tách giá trị bí mật ra khỏi định nghĩa flow.

  • Mở menu Parameter Contexts, tạo context mới, ví dụ proxy-lab.
  • Thêm tham số proxy_user, không sensitive.
  • Thêm tham số proxy_password, bật Sensitive Value, nhập mật khẩu.
  • Gán context cho Process Group chứa flow.
  • Trong StandardProxyConfigurationService, đặt Proxy User Name là #{proxy_user} và Proxy User Password là #{proxy_password}.

Khi xuất flow sang NiFi Registry hoặc tải định nghĩa flow về, giá trị tham số sensitive không đi theo. Người nhận flow phải tự nhập lại mật khẩu ở môi trường của họ, đúng điều anh em muốn.

Lấy bí mật từ ngoài NiFi

NiFi 2.x có các Parameter Provider đọc tham số từ biến môi trường, HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, GCP Secret Manager hay Kubernetes Secret. Danh sách này có trong trang tài liệu thành phần của NiFi. Dùng provider thì mật khẩu proxy nằm ở kho bí mật của công ty, NiFi chỉ đọc khi cần.

Tài liệu StandardProxyConfigurationService ghi Proxy Server Host, Port, User Name và User Password hỗ trợ Expression Language ở phạm vi biến môi trường và system property của JVM. Viết ${PROXY_HOST} sẽ đọc biến môi trường đó khi service được bật.

Những gì không nên làm

Không đặt mật khẩu proxy vào dynamic property của InvokeHTTP để tự ghép tiêu đề Proxy-Authorization. Dynamic property được gửi như tiêu đề HTTP tới đích. Với URL https, tiêu đề này đi bên trong tunnel tới máy chủ đích chứ không tới proxy, tức là lộ mật khẩu proxy cho bên thứ ba.

Không ghi mật khẩu vào thuộc tính FlowFile. Thuộc tính FlowFile hiện trong Data Provenance, ai có quyền xem provenance đều đọc được.

Chuyển flow giữa môi trường

Khi đưa flow từ máy thử sang máy chạy thật qua NiFi Registry hay một kho Git, định nghĩa flow mang theo tên tham số chứ không mang giá trị sensitive. Ở máy đích, anh em tạo Parameter Context cùng tên tham số và nhập mật khẩu của môi trường đó.

Cách này cho phép máy thử dùng tài khoản proxy thử, máy chạy thật dùng tài khoản khác, mà flow không đổi một dòng nào. Nếu hai môi trường dùng chung một mật khẩu proxy, một người có quyền ở máy thử sẽ biết luôn mật khẩu của máy chạy thật, nên tách tài khoản là cách an toàn hơn.

Apache NiFi proxy ở mức JVM và vì sao không áp dụng giống nhau cho mọi processor

Proxy JVM khác service của processor

Proxy JVM khác service của processor

NiFi chạy trong một JVM. Tham số proxy của JVM ảnh hưởng tới nhiều thư viện cùng lúc, nhưng mỗi thư viện xử lý theo cách riêng.

Đặt tham số JVM trong bootstrap.conf

Tệp conf/bootstrap.conf có các dòng java.arg.N để truyền tham số cho JVM, mô tả trong Administration Guide của NiFi. Thêm dòng như sau rồi khởi động lại NiFi.

java.arg.20=-Dhttp.proxyHost=proxy.example.com
java.arg.21=-Dhttp.proxyPort=3128
java.arg.22=-Dhttps.proxyHost=proxy.example.com
java.arg.23=-Dhttps.proxyPort=3128
java.arg.24=-Dhttp.nonProxyHosts=localhost|127.*|*.internal

Số thứ tự sau java.arg phải không trùng các dòng đã có. Tham số này áp dụng cho cả tiến trình NiFi, kể cả những kết nối anh em không muốn đi qua proxy.

InvokeHTTP không có service thì sao

Đọc mã nguồn cho thấy một chi tiết dễ bỏ sót. Khi InvokeHTTP không chọn Proxy Configuration Service, ProxyConfiguration.getConfiguration trả về cấu hình DIRECT, createProxy trả về Proxy.NO_PROXY, và InvokeHTTP không gắn proxy vào OkHttpClient.

Trong OkHttp, client không có proxy gắn sẵn sẽ hỏi ProxySelector.getDefault() của JVM. Vì vậy InvokeHTTP không có service vẫn đi qua proxy JVM ở bootstrap.conf. Nhưng OkHttp mặc định không có proxyAuthenticator, nên proxy đòi tài khoản sẽ trả 407.

Kết quả lab proxy JVM trên Java 8u401

Script jjs gọi ProxySelector.getDefault().select() với bốn URL rồi gửi request bằng HttpURLConnection. Đây là thư viện chuẩn của JDK, khác OkHttp, đọc các tham số trong tài liệu proxy mạng của Java 8.

Bảng: Kết quả lab proxy JVM trên Java 8u401

Ca

Tham số

Kết quả

A

Chỉ http.proxyHost

URL https đi DIRECT, URL http qua proxy và nhận 407

A

localhost

DIRECT vì danh sách bỏ qua mặc định có localhost

B

Thêm https.proxyHost và nonProxyHosts có *.internal

db.internal đi DIRECT, api.example.com qua proxy

B

Authenticator của JDK, URL http

Proxy ghi 407 rồi 200, lần thứ hai có user1

D

Chỉ gọi URL https, mặc định

CONNECT không có tài khoản, kết quả 407

E

jdk.http.auth.tunneling.disabledSchemes rỗng

CONNECT 407 rồi CONNECT có user1, tunnel mở

Ca D là điểm cần nhớ. Tệp lib/net.properties của Java 8u401 có dòng jdk.http.auth.tunneling.disabledSchemes=Basic. JDK không gửi Basic khi dựng tunnel CONNECT cho URL https, dù đã có Authenticator. Thay đổi này có từ bản Java 8u111.

Proxy HTTP dùng Basic sẽ chặn mọi request https của thư viện JDK nếu không đổi tham số này. Đổi thành rỗng thì phải chấp nhận Basic đi trên đoạn mạng tới proxy, nên chỉ làm khi đoạn mạng đó tin cậy được.

Một quan sát phụ trong lab

Ở ca B, script gọi URL http trước rồi mới gọi https trong cùng tiến trình. Lần CONNECT sau đó gửi luôn tài khoản user1 dù disabledSchemes vẫn là Basic. JDK đã lưu thông tin xác thực của proxy từ request http trước. Hành vi phụ thuộc thứ tự request như vậy rất khó đoán trong một NiFi chạy nhiều flow, đừng dựa vào nó.

Vì sao mỗi processor một kiểu

InvokeHTTP dùng OkHttp với Controller Service. Thành phần dùng HttpURLConnection của JDK theo tham số JVM, chịu luật disabledSchemes ở trên. Processor của các SDK đám mây thường có cấu hình proxy riêng trong SDK. Processor đọc tệp hay cơ sở dữ liệu nội bộ không cần proxy.

Vì vậy, đừng coi một dòng trong bootstrap.conf là đã xong proxy cho NiFi. Kiểm từng processor có gọi mạng ra ngoài, xem nó có thuộc tính Proxy Configuration Service không, và thử bằng log phía proxy.

Cách liệt kê processor gọi ra ngoài

Mở Summary trong menu chính của NiFi, tab Processors liệt kê mọi processor kèm loại và trạng thái. Lọc theo tên loại có chữ HTTP, S3, Azure, GCS hay Elasticsearch, đó là nhóm thường gọi mạng ra ngoài. Với mỗi loại, mở trang tài liệu thành phần và tìm thuộc tính Proxy Configuration Service.

Loại nào có thuộc tính đó thì gắn service. Loại nào không có thì ghi lại để kiểm riêng: nó dùng proxy JVM, dùng cấu hình proxy của SDK, hay không đi qua proxy được.

Chuẩn bị phiên bản, tài khoản và môi trường kiểm thử Apache NiFi proxy

Trước khi dựng flow, ghi rõ phiên bản và chuẩn bị một đích mà anh em kiểm soát được, để đọc kết quả không bị nhiễu bởi hệ thống của người khác.

Ghi phiên bản

Ghi phiên bản NiFi ở menu About, phiên bản Java bằng lệnh java -version, và phiên bản nar chứa InvokeHTTP trong mục Bundle của tài liệu processor. Tài liệu bản 2.12.0 ghi InvokeHTTP thuộc nifi-standard-nar, còn StandardProxyConfigurationService thuộc nifi-proxy-configuration-nar.

Mỗi bản NiFi gói một bản OkHttp riêng. Hành vi xác thực proxy mô tả trong bài lấy từ OkHttp nhánh master và NiFi main ngày 29/10/2026, bản cũ hơn có thể khác.

Endpoint có kiểm soát

Dựng một endpoint nhỏ trả JSON gồm đường dẫn và địa chỉ IP người gọi. Đặt endpoint đó trên một máy chủ của mình có IP công khai, hoặc trong mạng mà proxy nối tới được. Endpoint có ba đường: /ok trả 200, /status/404 trả 404, /status/503 trả 503.

Không dùng trang web của người khác để thử lỗi. Request lặp lại do Retry có thể bị coi là tấn công, và kết quả bị ảnh hưởng bởi hệ thống chống bot của họ.

Tài khoản proxy

Nhà cung cấp thường cấp host, cổng, user và mật khẩu. Bài định dạng proxy chỉ cách tách chuỗi ip:port:user:pass. Với NiFi, mỗi phần đi vào một thuộc tính riêng của service, không cần ghép URL nên không phải mã hóa ký tự đặc biệt trong mật khẩu.

Hỏi nhà cung cấp kiểu xác thực của cổng proxy. ProxyAuthenticator của NiFi chỉ gửi Basic. Proxy công ty dùng NTLM hay Kerberos sẽ không chấp nhận.

Flow lab và routing relationship của Apache NiFi proxy

Flow lab chỉ có ba processor. Mục tiêu là thấy mỗi loại lỗi đi vào relationship nào, rồi đối chiếu với log phía proxy.

Dựng flow

  • GenerateFlowFile: Run Schedule 30 sec, tạo một FlowFile mỗi lần.
  • UpdateAttribute: thêm thuộc tính lab.path với giá trị /ok, đổi tay sang /status/404 hay /status/503 cho từng ca.
  • InvokeHTTP: HTTP Method GET, HTTP URL https://endpoint.example.net${lab.path}, Proxy Configuration Service là service đã tạo, Connection Timeout 5 secs, Socket Read Timeout 15 secs.
  • Nối các relationship Original, Response, Retry, No Retry, Failure của InvokeHTTP vào năm hàng đợi riêng để dễ nhìn.

HTTP URL hỗ trợ Expression Language với thuộc tính FlowFile, nên ${lab.path} được thay bằng giá trị của từng FlowFile. Tài liệu ghi rõ mọi việc mã hóa URL do người dùng tự làm.

Relationship theo tài liệu

Tài liệu InvokeHTTP 2.12.0 mô tả năm relationship. Bảng dưới xếp theo mã trả lời.

Bảng: Relationship theo tài liệu

Kết quả

Relationship

Ghi chú

Mã 200 tới 299

Original và Response

Response chứa thân trả lời

Mã 400 tới 499

No Retry

Có thể bật penalize

Mã 500 tới 599

Retry

Nên nối vòng có giới hạn

Lỗi socket, timeout

Failure

Có thuộc tính tên lớp lỗi Java

Response Generation Required bật

Thêm Response cho mọi mã

Đổi cách định tuyến

Thuộc tính cần đọc

InvokeHTTP ghi invokehttp.status.code, invokehttp.status.message, invokehttp.request.url, invokehttp.request.duration tính bằng mili giây, và invokehttp.response.url là URL cuối sau chuyển hướng. Khi lỗi, nó ghi invokehttp.java.exception.class và invokehttp.java.exception.message.

Mã không phải 2xx thì thân trả lời được ghi vào invokehttp.response.body. Thuộc tính này cho thấy trang lỗi của proxy hay của đích, rất có ích khi chẩn đoán.

Đối chiếu với log proxy

Với URL https, theo mã nguồn OkHttp, client gửi CONNECT tới proxy với tiêu đề Host và Proxy-Connection: Keep-Alive. OkHttp gọi authenticator trước với một thử thách giả tên OkHttp-Preemptive. ProxyAuthenticator của NiFi không xét thử thách, luôn trả tiêu đề Basic, nên CONNECT đầu tiên đã có tài khoản.

Với URL http, không có tunnel. Theo RetryAndFollowUpInterceptor của OkHttp, request đầu không có tài khoản, proxy trả 407, authenticator thêm tài khoản rồi gửi lại. Log proxy sẽ có cặp 407 rồi 200 cho mỗi request http.

Thấy log proxy có một CONNECT kèm tài khoản cho mỗi kết nối mới là InvokeHTTP đang dùng đúng service.

Nếu log proxy trống trong khi InvokeHTTP vẫn nhận 200, request đang đi thẳng hoặc đi qua một proxy khác như proxy JVM.

Đo độ trễ do proxy

Thuộc tính invokehttp.request.duration cho biết thời gian gọi tính bằng mili giây. Chạy flow vài chục lần không có service, rồi chạy cùng số lần có service, so trung vị của hai nhóm. Chênh lệch là phần proxy cộng thêm, gồm bước CONNECT và quãng đường mạng tới proxy.

Lần gọi đầu sau khi bật processor luôn chậm hơn vì phải dựng kết nối và tunnel. Các lần sau dùng lại kết nối nhàn rỗi nên nhanh hơn. Bỏ lần đầu ra khỏi phép so để số liệu không bị lệch.

Đọc lỗi Apache NiFi proxy theo relationship và thuộc tính

Năm relationship của InvokeHTTP

Năm relationship của InvokeHTTP

Phần này nối từng tình huống với nơi FlowFile rơi vào và thông báo cần tìm. Nội dung lấy từ mã nguồn, chưa chạy trên NiFi thật.

Bảng tra lỗi

Bảng: Bảng tra lỗi

Tình huống

Nơi FlowFile rơi vào

Thông báo theo mã nguồn

URL https, sai mật khẩu, proxy đóng kết nối sau 407

Failure

Too many tunnel connections attempted: 21

URL http, sai mật khẩu

Failure

Too many follow-up requests: 21

URL https, proxy từ chối cổng

Failure

Unexpected response code for CONNECT: 403

URL http, không có tài khoản trong service

No Retry

invokehttp.status.code là 407

URL https, không có tài khoản trong service

Failure

Failed to authenticate with proxy

Proxy không nghe ở cổng

Failure

ConnectException

Đích trả 503 qua proxy

Retry

invokehttp.status.code là 503

Sai mật khẩu không báo 407

ProxyAuthenticator của NiFi không giới hạn số lần thử, mỗi lần 407 đều trả lại cùng tài khoản. Giới hạn nằm ở OkHttp. ConnectPlan.kt đặt MAX_TUNNEL_ATTEMPTS là 21 cho tunnel, RetryAndFollowUpInterceptor.kt đặt MAX_FOLLOW_UPS là 20 cho request thường.

Hệ quả là một FlowFile sai mật khẩu có thể sinh tới hơn hai chục lần đăng nhập lỗi ở proxy. Proxy có chính sách khóa tài khoản sau vài lần sai sẽ khóa luôn. Đổi mật khẩu proxy thì dừng InvokeHTTP trước, sửa Parameter Context xong mới bật lại.

Lỗi ở proxy và lỗi ở đích

Lỗi của bước CONNECT đi vào Failure kèm thông báo IOException hay ProtocolException. Lỗi do đích trả mã HTTP đi vào No Retry hoặc Retry kèm status code. Cách tách nhanh là xem FlowFile có invokehttp.status.code hay không.

Có status code thì proxy đã chuyển request tới đích. Chỉ có invokehttp.java.exception.class thì vấn đề nằm ở mạng hoặc ở proxy.

Vòng Retry có giới hạn

Relationship Retry nối ngược lại InvokeHTTP sẽ thử mãi. Đặt một RetryFlowFile trước vòng lặp, giới hạn số lần, quá số lần thì chuyển sang hàng đợi lỗi để người xem. Bật Request Failure Penalization Enabled để FlowFile lỗi 4xx bị phạt thời gian chờ, tránh gọi dồn.

Proxy không làm thay đổi hạn mức của đích. Đích trả 429 vì gọi quá nhanh thì giảm tốc ở Run Schedule hay Concurrent Tasks, không đổi proxy để vượt hạn mức.

Một mẫu hay dùng là đặt ControlRate trước InvokeHTTP để giới hạn số FlowFile mỗi phút. Giới hạn đặt ở NiFi thì dễ đọc và dễ đổi hơn giới hạn ngầm ở proxy hay ở đích, và khi đích đổi chính sách, anh em chỉ cần sửa một thuộc tính.

Chọn proxy cho Apache NiFi proxy

Flow NiFi chạy liên tục, gọi theo lịch. Proxy cho nó cần ổn định hơn là đổi IP nhanh.

Loại proxy và giao thức

InvokeHTTP dùng tốt nhất với proxy HTTP có Basic. Proxy SOCKS có tài khoản không qua được bước kiểm hợp lệ. Nguồn dữ liệu cho phép theo danh sách IP thì cần IP cố định, proxy dân cư tĩnh hoặc datacenter dùng riêng hợp hơn proxy xoay.

InvokeHTTP giữ kết nối nhàn rỗi theo Socket Idle Connections, mặc định 5, trong Socket Idle Timeout, mặc định 5 phút. Proxy xoay đổi IP theo phiên có thể đổi giữa hai request trên cùng kết nối giữ lại hay không, tùy nhà cung cấp, cần thử trước.

Số kết nối đồng thời

Concurrent Tasks của InvokeHTTP quyết định số request song song. Mỗi task có thể mở kết nối riêng tới proxy. Đặt số này thấp hơn giới hạn kết nối đồng thời mà nhà cung cấp cho tài khoản.

ProxyVN có proxy dân cư tĩnh, datacenter Việt Nam và Mỹ, proxy 4G và proxy xoay, hỗ trợ HTTP và SOCKS5, cấp tài khoản user và mật khẩu. Với InvokeHTTP, dùng cổng HTTP và Basic. Cần proxy ổn định cho flow chạy theo lịch, anh em có thể mua proxy tốc độ cao tại trang chủ ProxyVN rồi chạy flow lab ở trên với endpoint của mình.

Danh sách bỏ qua proxy

StandardProxyConfigurationService không có thuộc tính danh sách bỏ qua. InvokeHTTP gọi dịch vụ nội bộ thì không chọn service, hoặc dùng hai processor riêng. Nếu flow cũng phụ thuộc proxy JVM, đặt http.nonProxyHosts, cú pháp khác biến NO_PROXY quen thuộc trong bài no_proxy là gì: dùng dấu | thay dấu phẩy, có dấu * cho tên miền con.

Gỡ cấu hình, quản lý bí mật và checklist Apache NiFi proxy

Flow thử để lại service, tham số và hàng đợi. Dọn gọn để không có FlowFile nào tiếp tục gọi ra ngoài.

Gỡ cấu hình thử

  • Dừng GenerateFlowFile trước, chờ hàng đợi rỗng, rồi dừng InvokeHTTP.
  • Xóa FlowFile còn trong các hàng đợi bằng Empty Queue.
  • Disable rồi xóa StandardProxyConfigurationService thử.
  • Xóa Parameter Context proxy-lab hoặc xóa tham số proxy_password.
  • Gỡ các dòng java.arg về proxy trong bootstrap.conf nếu đã thêm cho lab, rồi khởi động lại NiFi.

Bí mật khi chạy thật

Mật khẩu proxy đặt trong tham số sensitive, tốt nhất đọc từ Parameter Provider. Khóa nifi.sensitive.props.key giữ riêng cho từng môi trường. Quyền xem Data Provenance và quyền sửa Parameter Context chỉ cấp cho người cần.

Kiểm log nifi-app.log trước khi gửi cho người khác. Thông báo lỗi của OkHttp không in mật khẩu, nhưng URL có thể chứa token của đích.

Checklist dùng thật

Checklist proxy cho flow NiFi

Checklist proxy cho flow NiFi

  • Ghi phiên bản NiFi, Java và nar của InvokeHTTP.
  • Mỗi InvokeHTTP gọi ra ngoài đã chọn Proxy Configuration Service.
  • Proxy Type là HTTP, không dùng SOCKS có tài khoản.
  • Mật khẩu proxy nằm trong tham số sensitive.
  • Đã thử với endpoint của mình và thấy CONNECT trong log proxy.
  • Vòng Retry có giới hạn, 4xx có penalize.
  • Concurrent Tasks thấp hơn giới hạn kết nối của tài khoản proxy.
  • Thành phần dùng proxy JVM đã được kiểm riêng, kể cả luật disabledSchemes.

Kiểm sau khi gỡ

Xem log proxy hoặc trang quản lý của nhà cung cấp để thấy không còn request từ máy NiFi. Nếu mật khẩu từng nằm trong thuộc tính không sensitive ở bản thử, đổi mật khẩu proxy.

Câu hỏi thường gặp về Apache NiFi proxy

InvokeHTTP có đọc biến HTTPS_PROXY không?

Mã nguồn InvokeHTTP không đọc biến này. Khi không có service, OkHttp hỏi ProxySelector của JVM, và JVM dùng tham số -D chứ không dùng biến HTTPS_PROXY. Có thể đưa biến vào service bằng Expression Language, ví dụ ${PROXY_HOST}.

Có dùng được một service cho nhiều Process Group không?

Service đặt ở Process Group cha thì Process Group con dùng được. Đặt ở cấp cao nhất của canvas thì mọi flow đều chọn được.

NiFi 1.x có khác không?

NiFi 1.x có thuộc tính proxy ngay trên InvokeHTTP và cũng có service. Khi lên 2.x, hàm migrateProperties chuyển thuộc tính cũ sang service. Bài không thử bản 1.x.

Vì sao request http bị gửi hai lần?

Theo mã nguồn OkHttp, request http qua proxy không gửi tài khoản trước, nhận 407 rồi mới gửi lại. Log proxy có hai dòng cho một request là hành vi bình thường.

Giới hạn của bài

Bài không chạy NiFi. Hành vi InvokeHTTP và OkHttp lấy từ mã nguồn nhánh main ngày 29/10/2026 và tài liệu NiFi 2.12.0. Phần chạy thật chỉ là proxy JVM bằng jjs trên Java 8u401, NiFi 2.x chạy Java 21 có thể có tệp net.properties khác.

Apache NiFi proxy và những điều cần nhớ

Apache NiFi proxy cho InvokeHTTP nên đặt bằng StandardProxyConfigurationService với cổng HTTP và Basic, mật khẩu để trong tham số sensitive. Proxy JVM ở bootstrap.conf không thay được service, và JDK mặc định chặn Basic khi CONNECT. Cần proxy HTTP ổn định cho Apache NiFi proxy, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam.

TIN TỨC LIÊN QUAN