Việc kiểm thử các API localhost cần nhận webhook hoặc callback từ các dịch vụ bên ngoài yêu cầu tạm thời phơi bày máy chủ phát triển cục bộ của bạn ra internet. Các dịch vụ tạo đường hầm (tunneling services) như ngrok, NPort, Cloudflare Tunnel và các dịch vụ khác tạo kết nối an toàn để cấp cho localhost của bạn một URL công khai.
Tại sao bạn cần tạo đường hầm localhost
Bạn đang xây dựng một API tích hợp với các dịch vụ của bên thứ ba. Mọi thứ hoạt động trên máy tính xách tay của bạn—các điểm cuối phản hồi chính xác, dữ liệu luân chuyển trơn tru. Sau đó, bạn cố gắng kiểm thử các callback webhook từ Stripe, GitHub, Twilio hoặc bất kỳ dịch vụ bên ngoài nào.
Vấn đề: Các dịch vụ bên ngoài không thể truy cập localhost:3000. Máy chủ phát triển của bạn không thể truy cập được từ internet.
Các tình huống phổ biến gây gián đoạn quy trình làm việc của bạn:
1. Kiểm thử Webhook
Các dịch vụ như Stripe gửi xác nhận thanh toán, GitHub gửi các sự kiện kho lưu trữ, Slack gửi các sự kiện tương tác—tất cả dưới dạng yêu cầu POST đến API của bạn. Trong quá trình phát triển, các dịch vụ này cần một URL công khai để gửi webhook đến.

2. URL callback OAuth
Khi triển khai "Đăng nhập bằng Google", "Đăng nhập bằng GitHub" hoặc bất kỳ luồng OAuth nào, nhà cung cấp xác thực sẽ chuyển hướng người dùng trở lại ứng dụng của bạn bằng một mã ủy quyền. URL chuyển hướng phải có thể truy cập công khai và khớp với những gì bạn đã đăng ký với nhà cung cấp.

3. Tích hợp API của bên thứ ba
Một số API yêu cầu URL callback cho các hoạt động bất đồng bộ. Ví dụ, các dịch vụ chuyển mã video thông báo cho API của bạn khi quá trình xử lý hoàn tất, hoặc các bộ xử lý thanh toán xác nhận giao dịch.
4. Phát triển ứng dụng di động
Kiểm thử API của bạn từ thiết bị di động trên cùng một mạng thường thất bại vì ứng dụng di động không thể phân giải localhost. Một đường hầm cung cấp cho bạn một URL hoạt động từ bất kỳ thiết bị nào.
5. Demo cho khách hàng
Đôi khi bạn cần trình diễn công việc đang tiến hành cho khách hàng hoặc các bên liên quan. Triển khai lên môi trường staging cho mỗi thay đổi nhỏ làm chậm quá trình lặp lại. Một URL công khai tạm thời cho phép khách hàng kiểm thử môi trường phát triển của bạn.
Cách tạo đường hầm localhost hoạt động
Các dịch vụ tạo đường hầm tạo một kết nối an toàn giữa máy chủ đám mây của họ và máy cục bộ của bạn:
Dịch vụ bên ngoài → Dịch vụ tạo đường hầm (URL công khai) → Kết nối an toàn → Localhost:3000 của bạn
Quy trình:
- Bạn khởi động một ứng dụng khách đường hầm trên máy của mình, trỏ đến cổng cục bộ của bạn
- Ứng dụng khách kết nối đến cơ sở hạ tầng đám mây của dịch vụ tạo đường hầm
- Dịch vụ gán một URL công khai (ví dụ:
https://abc123.ngrok.io) - Các yêu cầu đến URL công khai đó được chuyển tiếp qua kết nối được mã hóa đến localhost của bạn
- Máy chủ cục bộ của bạn nhận được yêu cầu như thể nó đến trực tiếp từ ứng dụng khách
- Các phản hồi chảy ngược lại qua đường hầm đến người yêu cầu
Điều này diễn ra một cách minh bạch. Máy chủ cục bộ của bạn không cần biết nó đang ở phía sau một đường hầm.
So sánh các dịch vụ tạo đường hầm phổ biến
Dưới đây là các lựa chọn phổ biến nhất vào năm 2026, với những ưu điểm và hạn chế của chúng:
ngrok (Phổ biến nhất)
Tốt nhất cho: Các dự án đã có, các nhóm muốn độ tin cậy
ngrok http 3000

Ưu điểm:
- Tiêu chuẩn ngành với tài liệu phong phú
- Giao diện người dùng trình kiểm tra web để xem tất cả các yêu cầu
- Tên miền tùy chỉnh trên các gói trả phí
- Chức năng phát lại yêu cầu
- Chấm dứt TLS
Nhược điểm:
- Gói miễn phí có giới hạn phiên 2 giờ
- URL ngẫu nhiên trên gói miễn phí (thay đổi mỗi phiên)
- Giá bắt đầu từ 10 USD/tháng cho các URL cố định
Gói miễn phí:
- 1 tác nhân trực tuyến
- 40 kết nối/phút
- URL ngẫu nhiên sẽ hết hạn
Các gói trả phí: 8-20 USD/tháng

NPort (Giải pháp thay thế miễn phí đang nổi lên)
Tốt nhất cho: Các nhà phát triển muốn tránh chi phí đăng ký

nport start 3000
Ưu điểm:
- Hoàn toàn miễn phí và mã nguồn mở
- Không giới hạn thời gian phiên
- Tên miền phụ tùy chỉnh có sẵn
- Tùy chọn tự host
- Bộ tính năng tương tự như gói miễn phí của ngrok
Nhược điểm:
- Cộng đồng nhỏ hơn (ít hướng dẫn hơn)
- Kém trưởng thành hơn (ra mắt năm 2025)
- Không có hỗ trợ thương mại
Gói miễn phí:
- Không giới hạn đường hầm
- Không giới hạn thời gian
- Tên miền phụ tùy chỉnh

Đây là công cụ đang thu hút sự chú ý trên Dev.to khi các nhà phát triển tìm kiếm các giải pháp thay thế ngrok mà không phải trả chi phí liên tục.
Cloudflare Tunnel (Tốt nhất cho môi trường gần với sản phẩm)
Tốt nhất cho: Các nhóm đã sử dụng Cloudflare, đường hầm chạy dài hạn

cloudflared tunnel --url http://localhost:3000
Ưu điểm:
- Cơ sở hạ tầng cấp doanh nghiệp
- Bảo vệ DDoS được bao gồm
- Tích hợp với Cloudflare Zero Trust
- Không giới hạn băng thông
- Miễn phí cho hầu hết các trường hợp sử dụng
Nhược điểm:
- Thiết lập phức tạp hơn
- Yêu cầu tài khoản Cloudflare
- Quá mức cần thiết cho việc kiểm thử webhook đơn giản
Gói miễn phí:
- Không giới hạn băng thông
- Không giới hạn đường hầm
- Bảo vệ DDoS
Localtunnel (Đơn giản nhất)
Tốt nhất cho: Kiểm thử nhanh chóng một lần, không cần cài đặt
npx localtunnel --port 3000
Ưu điểm:
- Không cần đăng ký
- Không cần cấu hình
- Không cần cài đặt (chạy qua npx)
- Mã nguồn mở
Nhược điểm:
- Không đáng tin cậy (thường xuyên bị sập)
- Không có chức năng kiểm tra yêu cầu
- Chỉ có URL ngẫu nhiên
- Tài liệu tối thiểu

Gói miễn phí:
- Mọi thứ đều miễn phí
- Không giới hạn tính năng
Tailscale Funnel (Tốt nhất cho các nhóm)
Tốt nhất cho: Chia sẻ nhóm riêng tư, demo an toàn

tailscale serve https / http://localhost:3000
tailscale funnel 443 on
Ưu điểm:
- Dựa trên WireGuard (nhanh, an toàn)
- Mặc định riêng tư (chỉ hiển thị với mạng Tailscale của bạn)
- Có thể phơi bày công khai khi cần
- Tuyệt vời cho cộng tác nhóm
Nhược điểm:
- Yêu cầu thiết lập Tailscale
- Đường cong học tập dốc hơn
- Chủ yếu được thiết kế cho mạng riêng tư
Gói miễn phí:
- Lên đến 100 thiết bị
- Không giới hạn băng thông

Bảng so sánh
| Tính năng | ngrok | NPort | Cloudflare Tunnel | Localtunnel | Tailscale |
|---|---|---|---|---|---|
| Giá | Miễn phí/10$+ | Miễn phí | Miễn phí | Miễn phí | Miễn phí/Trả phí |
| Giới hạn phiên | 2 giờ | Không | Không | Không | Không |
| Tên miền tùy chỉnh | Trả phí | Miễn phí | Có | Không | Có |
| Trình kiểm tra yêu cầu | Có | Cơ bản | Không | Không | Không |
| Độ phức tạp thiết lập | Thấp | Thấp | Trung bình | Rất thấp | Trung bình |
| Độ tin cậy | Tuyệt vời | Tốt | Tuyệt vời | Kém | Tuyệt vời |
| Tốt nhất cho | Kiểm thử sản phẩm | Nhà phát triển chú trọng chi phí | Doanh nghiệp | Kiểm thử nhanh | Chia sẻ nhóm |
Thiết lập đường hầm localhost đầu tiên của bạn
Hãy cùng tìm hiểu cách thiết lập với các công cụ phổ biến nhất. Chúng ta sẽ sử dụng API Node.js Express làm ví dụ, nhưng điều này hoạt động với bất kỳ máy chủ cục bộ nào.
Ví dụ: Máy chủ API cục bộ
// server.js
const express = require('express');
const app = express();
app.use(express.json());
app.post('/webhook', (req, res) => {
console.log('Webhook received:', req.body);
res.json({ received: true });
});
app.get('/health', (req, res) => {
res.json({ status: 'healthy' });
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
Tùy chọn 1: Sử dụng ngrok
Bước 1: Cài đặt ngrok
# macOS
brew install ngrok
# Windows (qua Chocolatey)
choco install ngrok
# Linux
curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | \
sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null && \
echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | \
sudo tee /etc/apt/sources.list.d/ngrok.list && \
sudo apt update && sudo apt install ngrok
Bước 2: Xác thực (tùy chọn nhưng được khuyến nghị)
ngrok config add-authtoken YOUR_AUTH_TOKEN
Bước 3: Khởi động đường hầm
ngrok http 3000
Đầu ra:
Trạng thái phiên trực tuyến
Tài khoản you@example.com (Gói: Miễn phí)
Phiên bản 3.5.0
Khu vực Hoa Kỳ (us)
Chuyển tiếp https://abc123.ngrok.io -> http://localhost:3000
API của bạn hiện có thể truy cập được tại https://abc123.ngrok.io.
Bước 4: Kiểm thử nó
curl https://abc123.ngrok.io/health
# {"status":"healthy"}
Tùy chọn 2: Sử dụng NPort (Giải pháp thay thế miễn phí)
Bước 1: Cài đặt NPort
npm install -g nport-cli
# hoặc
curl -sSL https://nport.io/install.sh | bash
Bước 2: Khởi động đường hầm
nport start 3000 --subdomain myapi
Đầu ra:
✓ Đường hầm đã khởi động thành công
URL công khai: https://myapi.nport.io
URL cục bộ: http://localhost:3000
Bước 3: Kiểm thử nó
curl https://myapi.nport.io/health
# {"status":"healthy"}
Tùy chọn 3: Sử dụng Cloudflare Tunnel
Bước 1: Cài đặt cloudflared
# macOS
brew install cloudflare/cloudflare/cloudflared
# Linux
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
Bước 2: Đường hầm nhanh (không cần đăng ký)
cloudflared tunnel --url http://localhost:3000
Đầu ra:
2026-01-27T12:00:00Z INF Đường hầm nhanh của bạn là: https://xyz789.trycloudflare.com
Đối với các đường hầm cố định (yêu cầu tài khoản Cloudflare):
# Đăng nhập
cloudflared tunnel login
# Tạo đường hầm
cloudflared tunnel create myapi
# Cấu hình và chạy
cloudflared tunnel --config config.yml run myapi
Kiểm thử Webhook với Apidog
Bây giờ localhost của bạn đã có thể truy cập công khai, hãy kiểm thử webhook một cách có hệ thống bằng cách sử dụng Apidog.
Tại sao nên kết hợp Tunneling + Apidog?
Tạo đường hầm giải quyết vấn đề truy cập; Apidog giải quyết vấn đề xác minh:
- Dịch vụ tạo đường hầm giúp localhost của bạn có thể truy cập được
- Apidog kiểm thử phản hồi API của bạn, xác thực dữ liệu, tự động hóa các tình huống
Thiết lập kiểm thử Webhook trong Apidog
Bước 1: Nhập hoặc Tạo API của bạn
- Mở Apidog

2. Tạo một dự án mới

3. Thêm điểm cuối webhook của bạn:

- Phương thức: POST
- URL:
{{base_url}}/webhook - Tiêu đề:
Content-Type: application/json
Bước 2: Cấu hình biến môi trường
Thiết lập hai môi trường:
Phát triển (Được tạo đường hầm):
{
"base_url": "https://abc123.ngrok.io"
}
Sản xuất:
{
"base_url": "https://api.yourapp.com"
}
Điều này cho phép bạn kiểm thử cùng một điểm cuối cục bộ và trong môi trường sản xuất chỉ với một cú nhấp chuột.
Bước 3: Tạo kịch bản kiểm thử
Kiểm thử điều gì xảy ra khi webhook đến:
Ví dụ: Kiểm thử Webhook thanh toán Stripe
// Nội dung yêu cầu
{
"type": "payment_intent.succeeded",
"data": {
"object": {
"id": "pi_test123",
"amount": 2000,
"currency": "usd",
"status": "succeeded"
}
}
}
Các xác nhận trong Apidog:
- Mã trạng thái bằng 200
- Phản hồi chứa
received: true - Thời gian phản hồi < 1000ms
- Content-Type là
application/json
Bước 4: Mô phỏng dịch vụ bên thứ ba
Thay vì kích hoạt webhook thực từ Stripe hoặc GitHub, hãy mô phỏng chúng trong Apidog:
- Sao chép ví dụ tải trọng webhook từ tài liệu dịch vụ
- Tạo các trường hợp kiểm thử với nhiều kịch bản khác nhau (thành công, thất bại, các trường hợp biên)
- Chạy tất cả các kịch bản đối với localhost đã tạo đường hầm của bạn
- Xác minh API của bạn xử lý từng trường hợp một cách chính xác
Kiểm thử callback OAuth
Tình huống: Bạn đang triển khai "Đăng nhập bằng Google"
Bước 1: Khởi động đường hầm với tên miền phụ tùy chỉnh
ngrok http 3000 --subdomain myapp
# URL: https://myapp.ngrok.io
Bước 2: Cấu hình chuyển hướng OAuth trong Google Console
Đặt URL callback: https://myapp.ngrok.io/auth/google/callback
Bước 3: Kiểm thử luồng trong Apidog
- Thực hiện yêu cầu đến
/auth/googleđể lấy URL ủy quyền - Thực hiện chuyển hướng thủ công hoặc theo chương trình
- Xác minh callback nhận được mã ủy quyền
- Xác nhận trao đổi mã thông báo hoạt động chính xác
Bước 4: Xác thực lưu trữ mã thông báo
Sử dụng Apidog để:
- Xác minh mã thông báo được lưu trữ an toàn
- Kiểm thử luồng làm mới mã thông báo
- Đảm bảo các mã thông báo đã hết hạn được xử lý
Các trường hợp sử dụng phổ biến
1. Kiểm thử Webhook thanh toán (Stripe, PayPal)
Thách thức: Các nhà cung cấp thanh toán gửi webhook cho các sự kiện như giao dịch thành công, hoàn tiền, tranh chấp.
Giải pháp:
# Khởi động đường hầm
ngrok http 3000
# Cấu hình URL webhook trong bảng điều khiển Stripe
# https://abc123.ngrok.io/webhook/stripe
# Sử dụng Stripe CLI để chuyển tiếp webhook kiểm thử
stripe listen --forward-to localhost:3000/webhook/stripe
# Kích hoạt các sự kiện kiểm thử
stripe trigger payment_intent.succeeded
Kiểm thử với Apidog:
- Tạo các trường hợp kiểm thử cho từng loại sự kiện
- Xác minh tính bất biến (xử lý các webhook trùng lặp)
- Kiểm thử xác minh chữ ký
- Đảm bảo cập nhật cơ sở dữ liệu diễn ra chính xác
2. Kiểm thử lệnh Bot Slack/Discord
Thách thức: Các nền tảng trò chuyện gửi các sự kiện tương tác khi người dùng nhấp vào nút hoặc chạy lệnh.
Giải pháp:
# Khởi động đường hầm
nport start 3000 --subdomain myslackbot
# Cấu hình trong Slack API:
# URL tương tác: https://myslackbot.nport.io/slack/interactions
# Lệnh Slash: https://myslackbot.nport.io/slack/commands
Kiểm thử với Apidog:
- Mô phỏng các lần nhấp nút
- Kiểm thử phản hồi lệnh slash
- Xác minh thời gian phản hồi (Slack yêu cầu phản hồi <3 giây)
- Kiểm thử các phản hồi bị trì hoãn với
response_url
3. Kiểm thử Webhook SMS/Voice (Twilio)
Thách thức: Twilio gửi webhook khi SMS đến hoặc cuộc gọi thoại được nhận.
Giải pháp:
cloudflared tunnel --url http://localhost:3000
Cấu hình webhook TwiML để trỏ đến URL đường hầm của bạn.
Kiểm thử với Apidog:
- Giả lập các tải trọng SMS đến
- Kiểm thử các loại tin nhắn khác nhau (MMS, SMS)
- Xác minh xác thực chữ ký Twilio
- Kiểm thử tạo TwiML phản hồi
4. Kiểm thử API ứng dụng di động
Thách thức: Kiểm thử API của bạn từ một thiết bị vật lý hoặc trình giả lập.
Vấn đề với localhost:
// Điều này không hoạt động từ thiết bị di động
fetch('http://localhost:3000/api/users')
Giải pháp với đường hầm:
// Điều này hoạt động từ mọi nơi
fetch('https://myapi.ngrok.io/api/users')
Kiểm thử với Apidog:
- Tạo tài liệu API với URL cơ sở đã tạo đường hầm
- Chia sẻ với nhóm di động
- Các nhà phát triển di động có thể kiểm thử với máy chủ phát triển trực tiếp của bạn
- Chuyển sang URL staging/production khi sẵn sàng
5. Kiểm thử Webhook GitHub/GitLab
Thách thức: Kiểm thử webhook kho lưu trữ (push, pull request, issues) cục bộ.
Giải pháp:
# Khởi động đường hầm
ngrok http 4000
# Cấu hình trong cài đặt kho lưu trữ GitHub:
# URL Webhook: https://abc123.ngrok.io/github/webhook
# Loại nội dung: application/json
# Sự kiện: Push, Pull requests
Kiểm thử với Apidog:
- Mô phỏng các sự kiện push
- Kiểm thử các sự kiện PR được mở/đóng
- Xác minh xác thực chữ ký (X-Hub-Signature)
- Kiểm thử logic lọc nhánh
Các phương pháp bảo mật tốt nhất
Việc phơi bày localhost ra internet tạo ra rủi ro bảo mật. Hãy tuân theo các phương pháp sau:
1. Chỉ sử dụng HTTPS
Tất cả các dịch vụ tạo đường hầm đều cung cấp HTTPS theo mặc định. Không bao giờ sử dụng HTTP thuần túy cho đường hầm:
# Tốt
ngrok http 3000
# Tạo https://abc123.ngrok.io
# Xấu (đừng làm điều này)
ngrok http --scheme=http 3000
2. Triển khai xác minh chữ ký Webhook
Đừng tin tưởng mù quáng vào các webhook đến. Hãy xác minh chữ ký:
const crypto = require('crypto');
function verifyStripeSignature(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}
app.post('/webhook/stripe', (req, res) => {
const signature = req.headers['stripe-signature'];
if (!verifyStripeSignature(req.body, signature, process.env.STRIPE_SECRET)) {
return res.status(401).send('Chữ ký không hợp lệ');
}
// Xử lý webhook
});
3. Hạn chế truy cập bằng Xác thực cơ bản (Basic Auth)
Thêm xác thực vào đường hầm của bạn:
# ngrok với xác thực cơ bản
ngrok http 3000 --auth="username:password"
# NPort với xác thực cơ bản
nport start 3000 --auth username:password
Bây giờ các yêu cầu cần thông tin đăng nhập:
curl -u username:password https://abc123.ngrok.io/webhook
4. Sử dụng bí mật cụ thể cho môi trường
Không bao giờ commit bí mật webhook hoặc khóa API:
// .env.development
STRIPE_WEBHOOK_SECRET=whsec_test_abc123
WEBHOOK_TUNNEL_URL=https://abc123.ngrok.io
// .env.production
STRIPE_WEBHOOK_SECRET=whsec_live_xyz789
WEBHOOK_URL=https://api.yourapp.com
5. Giám sát truy cập đường hầm
Sử dụng trình kiểm tra yêu cầu để theo dõi hoạt động đáng ngờ:
# ngrok cung cấp giao diện web tại:
http://localhost:4040
# Xem tất cả các yêu cầu, phản hồi, phát lại các cuộc tấn công
6. Giới hạn thời gian đường hầm
Đừng để đường hầm chạy vô thời hạn:
# Tự động hết hạn đường hầm sau 1 giờ
ngrok http 3000 --session-duration 1h
7. Xác thực nguồn yêu cầu
Kiểm tra địa chỉ IP đến hoặc sử dụng danh sách cho phép (allowlists):
const allowedIPs = [
'192.0.2.1', // IP webhook của Stripe
'198.51.100.0/24'
];
app.use('/webhook', (req, res, next) => {
const clientIP = req.ip;
if (!allowedIPs.includes(clientIP)) {
return res.status(403).send('Bị cấm');
}
next();
});
Khắc phục sự cố thường gặp
Vấn đề 1: URL đường hầm thay đổi mỗi phiên
Vấn đề: Các đường hầm ngrok miễn phí sử dụng các URL ngẫu nhiên thay đổi mỗi khi khởi động lại. Webhook được cấu hình với URL cũ sẽ bị hỏng.
Giải pháp:
- Sử dụng gói trả phí cho các URL tĩnh:
ngrok http 3000 --domain=myapp.ngrok.app
- Chuyển sang NPort với tên miền phụ tùy chỉnh miễn phí:
nport start 3000 --subdomain myapp
# Luôn luôn https://myapp.nport.io
- Cập nhật webhook theo chương trình qua API khi đường hầm bắt đầu
Vấn đề 2: Webhook hết thời gian chờ
Vấn đề: Máy chủ cục bộ của bạn mất quá nhiều thời gian để phản hồi. Các dịch vụ như Slack yêu cầu phản hồi trong vòng 3 giây.
Giải pháp:
Xử lý bất đồng bộ:
app.post('/webhook', async (req, res) => {
// Xác nhận ngay lập tức
res.json({ received: true });
// Xử lý trong nền
processWebhookAsync(req.body).catch(console.error);
});
async function processWebhookAsync(data) {
// Thực hiện công việc chậm ở đây (cơ sở dữ liệu, API bên ngoài, v.v.)
await heavyProcessing(data);
}
Kiểm thử thời gian chờ với Apidog bằng cách đặt giới hạn thời gian chờ nghiêm ngặt trong các kịch bản kiểm thử.
Vấn đề 3: Lỗi CORS từ trình duyệt
Vấn đề: Giao diện người dùng thực hiện yêu cầu đến URL đường hầm nhận được lỗi CORS.
Giải pháp:
Cấu hình tiêu đề CORS:
const cors = require('cors');
app.use(cors({
origin: [
'http://localhost:3001', // Máy chủ dev frontend của bạn
'https://abc123.ngrok.io' // URL đường hầm của bạn
],
credentials: true
}));
Vấn đề 4: Giới hạn tốc độ trên gói miễn phí
Vấn đề: Các đường hầm miễn phí có giới hạn kết nối (ngrok: 40/phút).
Giải pháp:
- Tạo các yêu cầu kiểm thử theo nhóm trong Apidog thay vì kiểm thử từng yêu cầu nhanh chóng
- Sử dụng nhiều đường hầm cho các dịch vụ khác nhau
- Nâng cấp lên gói trả phí nếu kiểm thử nhiều
- Chuyển sang dịch vụ không giới hạn như Cloudflare Tunnel hoặc NPort
Vấn đề 5: Đường hầm thường xuyên bị ngắt kết nối
Vấn đề: Sự mất ổn định mạng gây ra việc ngắt kết nối đường hầm.
Giải pháp:
Sử dụng systemd/pm2 để tự động khởi động lại:
# Tạo dịch vụ systemd
sudo nano /etc/systemd/system/ngrok.service
[Unit]
Description=đường hầm ngrok
After=network.target
[Service]
Type=simple
User=tênngườidùngcủa_bạn
WorkingDirectory=/home/tênngườidùngcủa_bạn
ExecStart=/usr/local/bin/ngrok http 3000
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl enable ngrok
sudo systemctl start ngrok
Vấn đề 6: Không thể truy cập đường hầm từ một mạng cụ thể
Vấn đề: Tường lửa công ty hoặc mạng hạn chế chặn lưu lượng đường hầm.
Giải pháp:
- Sử dụng Cloudflare Tunnel (hiếm khi bị chặn)
- Chuyển đổi khu vực đường hầm gần bạn hơn:
ngrok http 3000 --region eu
- Sử dụng Tailscale cho mạng riêng thay vì đường hầm công cộng
Các mô hình nâng cao
Mô hình 1: Tạo đường hầm đa cổng
Phơi bày nhiều dịch vụ đồng thời:
# Thiết bị đầu cuối 1: Máy chủ API
ngrok http 3000
# Thiết bị đầu cuối 2: Máy chủ dev Frontend
ngrok http 3001
# Thiết bị đầu cuối 3: Worker webhook
ngrok http 3002
Hoặc sử dụng tệp cấu hình ngrok:
# ~/.ngrok2/ngrok.yml
tunnels:
api:
proto: http
addr: 3000
frontend:
proto: http
addr: 3001
worker:
proto: http
addr: 3002
ngrok start --all
Mô hình 2: Đường hầm + Docker Compose
# docker-compose.yml
version: '3'
services:
api:
build: .
ports:
- "3000:3000"
ngrok:
image: ngrok/ngrok:latest
command:
- "http"
- "api:3000"
environment:
NGROK_AUTHTOKEN: ${NGROK_AUTHTOKEN}
docker-compose up
Mô hình 3: Tiêm URL đường hầm động
Tự động cập nhật ứng dụng của bạn với URL đường hầm:
// start-tunnel.js
const ngrok = require('ngrok');
const fs = require('fs');
(async function() {
const url = await ngrok.connect(3000);
console.log(`Đường hầm đã khởi động: ${url}`);
// Cập nhật tệp .env
fs.appendFileSync('.env', `\nTUNNEL_URL=${url}\n`);
// Cập nhật webhook Stripe
await updateStripeWebhook(url);
})();
Mô hình 4: Chuyển tiếp yêu cầu đến nhiều môi trường
Kiểm thử cùng một webhook đối với môi trường dev, staging và production:
// webhook-multiplexer.js
app.post('/webhook', async (req, res) => {
const environments = [
'http://localhost:3000',
'https://staging.api.com',
'https://api.yourapp.com'
];
// Chuyển tiếp đến tất cả các môi trường
const results = await Promise.all(
environments.map(env =>
fetch(`${env}/webhook`, {
method: 'POST',
headers: req.headers,
body: JSON.stringify(req.body)
})
)
);
res.json({ forwarded: results.length });
});
Kết luận
Kiểm thử các API localhost nhận webhook hoặc callback không yêu cầu triển khai lên môi trường staging cho mỗi thay đổi. Các dịch vụ tạo đường hầm tạo ra các URL công khai tạm thời cho phép các dịch vụ bên ngoài truy cập môi trường phát triển của bạn.
Hãy bắt đầu với gói miễn phí của bất kỳ công cụ nào. Nếu kiểm thử webhook trở thành một phần hàng ngày trong quy trình làm việc của bạn, hãy cân nhắc các gói trả phí để có các URL tĩnh và các tính năng bổ sung. Nhưng đối với hầu hết các nhà phát triển, các dịch vụ tạo đường hầm miễn phí kết hợp với khả năng kiểm thử API của Apidog cung cấp mọi thứ cần thiết để kiểm thử API localhost một cách hiệu quả.
