<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Hoang Nam, Author at Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/author/nam-hoang/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/author/nam-hoang/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Fri, 06 Feb 2026 08:34:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Hoang Nam, Author at Tomoshare</title>
	<link>https://blog.tomosia.com.vn/author/nam-hoang/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>SQL Partitioning: &#8220;Chia Để Trị&#8221; Dữ Liệu Khổng Lồ</title>
		<link>https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/</link>
					<comments>https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/#respond</comments>
		
		<dc:creator><![CDATA[Hoang Nam]]></dc:creator>
		<pubDate>Fri, 06 Feb 2026 08:34:06 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Sql]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[partition]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[db]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=4215</guid>

					<description><![CDATA[<p>Database Của Bạn Đang &#8220;Kêu Cứu&#8221; Vì Chậm? Đã Đến Lúc &#8220;Chia Để Trị&#8221;! Bạn có đang &#8220;đau&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/">SQL Partitioning: &#8220;Chia Để Trị&#8221; Dữ Liệu Khổng Lồ</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="database-cua-ban-dang-keu-cuu-vi-cham-da-den-luc-chia-de-tri" class="wp-block-heading">Database Của Bạn Đang &#8220;Kêu Cứu&#8221; Vì Chậm? Đã Đến Lúc &#8220;Chia Để Trị&#8221;!</h2>



<p>Bạn có đang &#8220;đau đầu&#8221; vì một câu query SQL, dù rất đơn giản, lại chạy mãi không xong trên một bảng dữ liệu ngày càng &#8220;béo phì&#8221;? Bạn là dev đang săn lùng từng mili giây hiệu suất, là tester đang vật lộn với những bài test performance, hay đơn giản là người mới tò mò về thế giới dữ liệu?</p>



<p>Nếu câu trả lời là &#8220;có&#8221;, thì đây chính là &#8220;liều thuốc&#8221; bạn cần.</p>



<p>Hãy quên đi những định nghĩa khô khan. Hôm nay, chúng ta sẽ khám phá <strong>SQL Partitioning</strong> – một kỹ thuật &#8220;chia để trị&#8221; đầy quyền năng – qua những ví dụ đời thường và những bí kíp thực chiến mà bạn sẽ không tìm thấy trong sách vở.</p>



<h2 id="1-sql-partitioning-la-gi" class="wp-block-heading">1. SQL Partitioning Là Gì? </h2>



<p>Trước hết, Hãy tưởng tượng database của bạn là một cái nhà kho khổng lồ, chứa hàng triệu món đồ (dữ liệu). Khi cần tìm một món đồ, bạn phải chạy khắp cái nhà kho đó. Rất mất thời gian!</p>



<p>Tuy nhiên, nếu bạn chia nhà kho thành các <strong>gian nhỏ có nhãn rõ ràng</strong>, mọi thứ sẽ khác.</p>



<p><strong>SQL Partitioning</strong> chính là việc bạn thông minh sắp xếp nhà kho đó thành các <strong>gian hàng nhỏ hơn, được dán nhãn rõ ràng</strong> (gọi là các <em>partition</em> &#8211; phân vùng):</p>



<ul class="wp-block-list">
<li>Gian hàng &#8220;Hóa đơn năm 2023&#8221;</li>



<li>Gian hàng &#8220;Hóa đơn năm 2024&#8221;</li>



<li>Gian hàng &#8220;Hóa đơn năm 2025&#8221;</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2f363c;color:#d3d7dd">Code mẫu:</span><span role="button" tabindex="0" data-code="CREATE TABLE invoice (
    invoice_id INT,
    invoice_date DATE,
    amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(invoice_date)) (
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);" style="color:#e1e4e8;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark" style="background-color: #24292e" tabindex="0"><code><span class="line"><span style="color: #F97583">CREATE</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">TABLE</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">invoice</span><span style="color: #E1E4E8"> (</span></span>
<span class="line"><span style="color: #E1E4E8">    invoice_id </span><span style="color: #F97583">INT</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    invoice_date </span><span style="color: #F97583">DATE</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    amount </span><span style="color: #F97583">DECIMAL</span><span style="color: #E1E4E8">(</span><span style="color: #79B8FF">10</span><span style="color: #E1E4E8">,</span><span style="color: #79B8FF">2</span><span style="color: #E1E4E8">)</span></span>
<span class="line"><span style="color: #E1E4E8">)</span></span>
<span class="line"><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">BY</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">RANGE</span><span style="color: #E1E4E8"> (</span><span style="color: #79B8FF">YEAR</span><span style="color: #E1E4E8">(invoice_date)) (</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> p2022 </span><span style="color: #F97583">VALUES</span><span style="color: #E1E4E8"> LESS THAN (</span><span style="color: #79B8FF">2023</span><span style="color: #E1E4E8">),</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> p2023 </span><span style="color: #F97583">VALUES</span><span style="color: #E1E4E8"> LESS THAN (</span><span style="color: #79B8FF">2024</span><span style="color: #E1E4E8">),</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> p2024 </span><span style="color: #F97583">VALUES</span><span style="color: #E1E4E8"> LESS THAN (</span><span style="color: #79B8FF">2025</span><span style="color: #E1E4E8">),</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> p_future </span><span style="color: #F97583">VALUES</span><span style="color: #E1E4E8"> LESS THAN MAXVALUE</span></span>
<span class="line"><span style="color: #E1E4E8">);</span></span></code></pre></div>



<p>Khi sếp yêu cầu bạn tìm hóa đơn tháng 12/2024, bạn chỉ việc đi thẳng đến gian hàng &#8220;Hóa đơn năm 2024&#8221; để tìm. Nhanh hơn gấp bội!</p>



<p>Quan trọng hơn, dù dữ liệu được chia nhỏ ra bên dưới, đối với ứng dụng của bạn nó vẫn là <strong>một bảng duy nhất</strong>. Đó chính là sự “thần kỳ” của partition.</p>



<h3 id="loi-ich-vang-cua-partitioning" class="wp-block-heading">Lợi ích VÀNG của Partitioning:</h3>



<ul class="wp-block-list">
<li><strong>Tăng tốc độ truy vấn &#8220;tên lửa&#8221;:</strong> Khi bạn lọc dữ liệu theo &#8220;nhãn&#8221; của gian hàng (ví dụ: <code>WHERE OrderDate BETWEEN '2024-01-01' AND '2024-12-31'</code>), hệ thống sẽ chỉ quét gian hàng &#8220;2024&#8221;, bỏ qua toàn bộ các gian hàng khác. Đây gọi là kỹ thuật <em>Partition Pruning</em> (cắt tỉa phân vùng).</li>



<li><strong>Quản lý dữ liệu dễ như trở bàn tay:</strong> Muốn xóa toàn bộ dữ liệu năm 2020? Thay vì chạy lệnh <code>DELETE</code> hàng triệu dòng và chờ &#8220;dài cổ&#8221;, bạn chỉ cần &#8220;dỡ&#8221; cả gian hàng 2020 đi. Xong!</li>



<li><strong>Bảo trì nhẹ nhàng hơn:</strong> Việc bảo trì (như rebuild index) trên một gian hàng nhỏ sẽ nhanh và ít ảnh hưởng đến hệ thống hơn là làm trên cả cái nhà kho.</li>
</ul>



<h2 id="2-cac-loai-vu-khi-phan-vung-pho-bien-chon-dung-thang-to" class="wp-block-heading">2. Các &#8220;Loại Vũ Khí&#8221; Phân Vùng Phổ Biến: Chọn Đúng, Thắng To</h2>



<p>Có 3 loại partitioning chính. Việc chọn đúng loại sẽ quyết định sự thành bại của bạn.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="683" src="https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-1024x683.png" alt="" class="wp-image-4232" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-1024x683.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-300x200.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-768x512.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-380x253.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-800x533.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-1160x773.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 id="range-partitioning-phan-vung-theo-khoang" class="wp-block-heading">RANGE Partitioning (Phân vùng theo Khoảng)</h3>



<ul class="wp-block-list">
<li><strong>Ý tưởng:</strong> Chia dữ liệu theo một khoảng giá trị liên tục.</li>



<li><strong>Ví dụ Kinh điển:</strong> Phân vùng bảng <code>Sales</code> theo cột <code>OrderDate</code>. Mỗi phân vùng chứa dữ liệu của một tháng hoặc một quý.</li>



<li><strong>Khi nào dùng:</strong> Cực kỳ hoàn hảo cho dữ liệu chuỗi thời gian (time-series) như logs, giao dịch, dữ liệu cảm biến IoT.</li>
</ul>



<h3 id="list-partitioning-phan-vung-theo-danh-sach" class="wp-block-heading">LIST Partitioning (Phân vùng theo Danh sách)</h3>



<ul class="wp-block-list">
<li><strong>Ý tưởng:</strong> Chia dữ liệu theo một danh sách các giá trị cụ thể.</li>



<li><strong>Ví dụ Kinh điển:</strong> Phân vùng bảng <code>Customers</code> theo cột <code>Region</code> (Vùng miền). Một phân vùng cho &#8216;Miền Bắc&#8217;, một cho &#8216;Miền Trung&#8217;, một cho &#8216;Miền Nam&#8217;.</li>



<li><strong>Khi nào dùng:</strong> Phù hợp khi cột phân vùng có một tập hợp các giá trị hữu hạn và rõ ràng (như Tỉnh/Thành, Trạng thái, Loại sản phẩm).</li>
</ul>



<h3 id="hash-partitioning-phan-vung-theo-ham-bam" class="wp-block-heading">HASH Partitioning (Phân vùng theo Hàm băm)</h3>



<ul class="wp-block-list">
<li><strong>Ý tưởng:</strong> Tự động phân bổ đều dữ liệu vào một số lượng phân vùng đã định trước.</li>



<li><strong>Ví dụ Kinh điển:</strong> Phân vùng bảng <code>Users</code> theo <code>user_id</code>. Hệ thống sẽ dùng một thuật toán để đảm bảo dữ liệu người dùng được chia đều vào các phân vùng.</li>



<li><strong>Khi nào dùng:</strong> Dùng khi bạn không có cột nào phù hợp cho RANGE hay LIST, và mục tiêu chính là phân tán đều dữ liệu để tránh &#8220;điểm nóng&#8221;.</li>
</ul>



<h2 id="3-bi-kip-thuc-chien-nhung-cu-lua-can-tranh" class="wp-block-heading">3. Bí Kíp Thực Chiến &amp; Những &#8220;Cú Lừa&#8221; Cần Tránh</h2>



<p>Lý thuyết màu hồng, nhưng thực tế thì&#8230; không phải lúc nào cũng vậy. Đây là những kinh nghiệm xương máu giúp bạn tránh đi vào &#8220;vết xe đổ&#8221;.</p>



<h3 id="hoi-dap-nhanh-cac-loi-sai-kinh-dien-khi-dung-partitioning" class="wp-block-heading">Hỏi &amp; Đáp Nhanh: Các Lỗi Sai Kinh Điển Khi Dùng Partitioning</h3>



<p><strong>Câu hỏi:</strong> <em>Tôi đã phân vùng rồi mà query vẫn chậm như rùa. Tôi đã làm sai ở đâu?</em></p>



<p><strong>Trả lời:</strong> Rất có thể bạn đã mắc phải một trong những lỗi sau:</p>



<ul class="wp-block-list">
<li><strong>Chọn sai &#8220;Chìa Khóa&#8221; (Partition Key):</strong> Đây là sai lầm chết người nhất. Nếu các query của bạn không lọc theo cột mà bạn dùng để phân vùng (<code>partition key</code>), thì việc phân vùng hoàn toàn vô dụng. Hệ thống vẫn phải quét tất cả các &#8220;gian hàng&#8221;.</li>



<li><strong>&#8220;Tham Lam&#8221; Chia Quá Nhiều Phân Vùng:</strong> Chia nhỏ quá không tốt! Quá nhiều phân vùng sẽ làm tăng gánh nặng quản lý cho database, khiến việc lên kế hoạch truy vấn chậm đi. Vài chục đến vài trăm phân vùng thường là con số hợp lý.</li>



<li><strong>Dữ Liệu Phân Bổ Không Đều:</strong> Nếu 90% dữ liệu của bạn bị dồn vào chỉ một phân vùng, thì lợi ích gần như bằng không. Hãy phân tích dữ liệu trước khi chọn cột phân vùng.</li>



<li><strong>&#8220;Bỏ quên&#8221; Index:</strong> Partitioning và Indexing là &#8220;cặp bài trùng&#8221; chứ không phải kẻ thù. Phân vùng giúp giới hạn số lượng dữ liệu cần quét, còn index giúp tìm kiếm nhanh chóng bên trong phân vùng đó.</li>



<li><strong>Đừng chia quá nhỏ (Over-partitioning)</strong><br>Đừng chia mỗi ngày 1 partition nếu bạn có dữ liệu 10 năm (sẽ ra 3650 partitions). Khi partitions quá nhiều:
<ul class="wp-block-list">
<li>Hệ điều hành quá tải vì mở quá nhiều file.</li>



<li>Database tốn tài nguyên để quản lý metadata.</li>



<li>Query có thể chậm hơn cả không partition.</li>



<li><strong>Lời khuyên:</strong> Giữ số lượng partition ở mức hợp lý (dưới 100 thường là con số an toàn cho MySQL, Oracle thì có thể nhiều hơn).</li>
</ul>
</li>



<li><strong>Cẩn thận với Primary Key</strong>: Hầu hết các DB engine (như MySQL) yêu cầu cột dùng để Partition phải nằm trong Primary Key. Điều này có nghĩa là PK của bạn sẽ phải đổi từ <code>(id)</code> sang <code>(id, order_date)</code>. Dev team cần lưu ý chỗ này kẻo code logic bị sai.</li>
</ul>



<h2 id="ket-luan-partitioning-la-mot-tu-duy-khong-chi-la-cong-cu" class="wp-block-heading">Kết Luận: Partitioning Là Một Tư Duy, Không Chỉ Là Công Cụ</h2>



<p>SQL Partitioning không phải là viên đạn bạc cho mọi vấn đề. Nó là một công cụ quản lý dữ liệu cực kỳ mạnh mẽ ở quy mô lớn, với &#8220;tác dụng phụ&#8221; tuyệt vời là cải thiện hiệu suất.</p>



<p><strong>Lời khuyên cuối cùng:</strong> Đừng vội vàng phân vùng mọi bảng bạn có. Hãy luôn bắt đầu bằng việc tối ưu query và index. Chỉ khi bảng dữ liệu đã thực sự phình to (hàng trăm triệu dòng) và các phương pháp khác đã &#8220;bó tay&#8221;, đó mới là lúc bạn rút &#8220;thanh bảo kiếm&#8221; Partitioning ra.</p>



<p>Chúc bạn thành công trên con đường chinh phục dữ liệu!</p>



<p></p>
<p>The post <a href="https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/">SQL Partitioning: &#8220;Chia Để Trị&#8221; Dữ Liệu Khổng Lồ</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<series:name><![CDATA[Web vulnerability]]></series:name>
	</item>
		<item>
		<title>Đưa Localhost lên Internet miễn phí với Cloudflare Tunnel: Giải pháp thay thế Ngrok để Test Webhook &#038; Demo App</title>
		<link>https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/</link>
					<comments>https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/#comments</comments>
		
		<dc:creator><![CDATA[Hoang Nam]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 01:41:48 +0000</pubDate>
				<category><![CDATA[Web Server]]></category>
		<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[Solution]]></category>
		<category><![CDATA[Hosting]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=3752</guid>

					<description><![CDATA[<p>Bạn cần test webhook ZaloPay, Stripe hay demo app cho khách hàng ngay trên localhost? Hướng dẫn sử&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/">Đưa Localhost lên Internet miễn phí với Cloudflare Tunnel: Giải pháp thay thế Ngrok để Test Webhook &amp; Demo App</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><em>Bạn cần test webhook ZaloPay, Stripe hay demo app cho khách hàng ngay trên localhost? Hướng dẫn sử dụng Cloudflare Tunnel để expose local server ra internet với HTTPS miễn phí, bảo mật, không cần mở port.</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="mo-dau-noi-dau-cua-developer" class="wp-block-heading">Mở đầu: Nỗi đau của Developer</h2>



<p>Bạn đang phát triển một ứng dụng local, mọi thứ chạy mượt mà ở&nbsp;localhost:3000. Nhưng vấn đề nảy sinh khi:</p>



<ul class="wp-block-list">
<li>Bạn cần <strong>test Webhook</strong> từ các dịch vụ bên ngoài như ZaloPay, Stripe, Telegram (các bên này bắt buộc phải có HTTPS).</li>



<li>Khách hàng muốn <strong>xem demo ngay lập tức</strong>, nhưng bạn chưa kịp deploy lên server.</li>



<li>Bạn chán ngấy cảnh dùng <strong>Ngrok bản free</strong> vì tên miền bị đổi liên tục sau mỗi lần restart.</li>
</ul>



<p>Giải pháp tối ưu nhất hiện nay chính là&nbsp;<strong>Cloudflare Tunnel</strong>.</p>



<h2 id="1-cloudflare-tunnel-la-gi" class="wp-block-heading">1. Cloudflare Tunnel là gì?</h2>



<p><strong>Cloudflare Tunnel</strong>&nbsp;(trước đây là Argo Tunnel) là công cụ giúp bạn kết nối máy chủ local (hoặc máy ảo) ra internet mà&nbsp;<strong>không cần mở port (port forwarding)</strong>&nbsp;trên router.</p>



<p>Thay vì cho phép người lạ truy cập trực tiếp vào IP của bạn (rất rủi ro), Tunnel tạo một đường hầm bảo mật (outbound connection) từ máy bạn đến mạng lưới Cloudflare Edge. Từ đó, Cloudflare sẽ &#8220;public&#8221; ứng dụng của bạn ra ngoài bằng một tên miền HTTPS xịn xò.</p>



<h3 id="tai-sao-nen-dung-cloudflare-tunnel-thay-vi-ngrok" class="wp-block-heading">Tại sao nên dùng Cloudflare Tunnel thay vì Ngrok?</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Tiêu chí</td><td>Ngrok (Free)</td><td>Cloudflare Tunnel</td></tr><tr><td><strong>Domain</strong></td><td>Random, đổi liên tục</td><td><strong>Cố định</strong>&nbsp;(theo domain của bạn)</td></tr><tr><td><strong>Chi phí</strong></td><td>Giới hạn tính năng</td><td><strong>Miễn phí</strong>&nbsp;hoàn toàn</td></tr><tr><td><strong>Bảo mật</strong></td><td>Thấp</td><td>Rất cao (Cloudflare Shield)</td></tr><tr><td><strong>Cài đặt</strong></td><td>Nhanh</td><td>Cần domain riêng (nhưng đáng giá)</td></tr></tbody></table></figure>



<h2 id="2-mo-hinh-hoat-dong" class="wp-block-heading">2. Mô hình hoạt động</h2>



<p>Hãy tưởng tượng luồng dữ liệu sẽ đi như sau:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>User Browser</strong> -> <strong>Cloudflare Edge (HTTPS)</strong> -> <strong>Cloudflared (trên máy bạn)</strong> -> <strong>Localhost (3000, 8080&#8230;)</strong></p>
</blockquote>



<p>Bạn có thể chạy nhiều dịch vụ cùng lúc qua một đường hầm duy nhất:</p>



<ul class="wp-block-list">
<li>api.domain.com -> trỏ về localhost:3000</li>



<li>admin.domain.com -> trỏ về localhost:8080</li>
</ul>



<h2 id="3-chuan-bi-do-nghe" class="wp-block-heading">3. Chuẩn bị &#8220;đồ nghề&#8221;</h2>



<p>Trước khi bắt đầu, bạn cần:</p>



<ol class="wp-block-list">
<li><strong>Tài khoản Cloudflare</strong> (đăng ký miễn phí).</li>



<li><strong>Một tên miền (Domain)</strong> đã thêm vào Cloudflare.
<ul class="wp-block-list">
<li><em>Lưu ý:</em> Freenom hiện tại không ổn định. Bạn nên mua các domain giá rẻ như .xyz, .dev, .click (chỉ khoảng 1-2$/năm) tại Namecheap hoặc Hostinger để dùng lâu dài.</li>
</ul>
</li>



<li><strong>Máy tính</strong> (Linux/Mac/Windows) để chạy tool.</li>
</ol>



<h2 id="4-huong-dan-trien-khai-chi-tiet-step-by-step" class="wp-block-heading">4. Hướng dẫn triển khai chi tiết (Step-by-step)</h2>



<h3 id="buoc-1-cai-dat-cloudflared" class="wp-block-heading">Bước 1: Cài đặt&nbsp;cloudflared</h3>



<p>Công cụ&nbsp;cloudflared&nbsp;là cầu nối giữa máy bạn và Cloudflare.</p>



<p><strong>Trên Linux (Ubuntu/Debian):</strong>codeBash</p>



<pre class="wp-block-code"><code>curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb</code></pre>



<p><strong>Trên Windows:</strong><br>Tải file&nbsp;.msi&nbsp;mới nhất từ GitHub chính chủ:&nbsp;<a target="_blank" href="https://www.google.com/url?sa=E&amp;q=https%3A%2F%2Fgithub.com%2Fcloudflare%2Fcloudflared%2Freleases" rel="noreferrer noopener">Cloudflare Downloads</a><br><em>(Mở PowerShell dưới quyền Administrator để chạy các lệnh sau này).</em></p>



<h3 id="buoc-2-dang-nhap-cloudflare" class="wp-block-heading">Bước 2: Đăng nhập Cloudflare</h3>



<p>Chạy lệnh sau để xác thực:codeBash</p>



<pre class="wp-block-code"><code>cloudflared tunnel login</code></pre>



<p>Trình duyệt sẽ bật lên, bạn hãy chọn tên miền muốn sử dụng và bấm&nbsp;<strong>Authorize</strong>.</p>



<h3 id="buoc-3-tao-tunnel" class="wp-block-heading">Bước 3: Tạo Tunnel</h3>



<p>Đặt tên cho tunnel của bạn (ví dụ:&nbsp;my-local-server):codeBash</p>



<pre class="wp-block-code"><code>cloudflared tunnel create my-local-server</code></pre>



<p>Sau khi tạo xong, Cloudflare sẽ sinh ra một&nbsp;<strong>Tunnel ID</strong>&nbsp;và file credentials (thường nằm ở&nbsp;~/.cloudflared/).</p>



<h3 id="buoc-4-cau-hinh-dinh-tuyen-routing" class="wp-block-heading">Bước 4: Cấu hình định tuyến (Routing)</h3>



<p>Đây là bước quan trọng nhất để map domain về localhost.<br>Tạo file&nbsp;config.yml&nbsp;trong thư mục&nbsp;~/.cloudflared/&nbsp;(hoặc cùng thư mục chạy tool) với nội dung:codeYaml</p>



<pre class="wp-block-code"><code>tunnel: &lt;TUNNEL-NAME-HOẶC-ID&gt;
credentials-file: /duong/dan/den/file/json/credentials.json

ingress:
  # Service 1: API Backend
  - hostname: api.namdevlabs.com
    service: http://localhost:3000

  # Service 2: Webhook test (ZaloPay, Stripe)
  - hostname: hook.namdevlabs.com
    service: http://localhost:5678

  # Service 3: Dashboard Admin
  - hostname: admin.namdevlabs.com
    service: http://localhost:8080

  # Rule cuối cùng bắt buộc: Trả về 404 nếu không khớp domain nào
  - service: http_status:404</code></pre>



<h3 id="buoc-5-gan-dns-cho-subdomain" class="wp-block-heading">Bước 5: Gắn DNS cho Subdomain</h3>



<p>Bạn cần báo cho Cloudflare biết subdomain nào sẽ đi vào tunnel này.codeBash</p>



<pre class="wp-block-code"><code># Cú pháp: cloudflared tunnel route dns &lt;TUNNEL_NAME&gt; &lt;SUBDOMAIN&gt;
cloudflared tunnel route dns my-local-server api.namdevlabs.com
cloudflared tunnel route dns my-local-server hook.namdevlabs.com</code></pre>



<p>Lệnh này sẽ tự động tạo bản ghi CNAME trên Cloudflare Dashboard.</p>



<h3 id="buoc-6-kich-hoat-tunnel" class="wp-block-heading">Bước 6: Kích hoạt Tunnel</h3>



<p>Chạy tunnel với file config vừa tạo:codeBash</p>



<pre class="wp-block-code"><code>cloudflared tunnel run my-local-server</code></pre>



<p><em>Mẹo:</em>&nbsp;Nếu file config không nằm ở vị trí mặc định, dùng flag&nbsp;&#8211;config:<br>cloudflared tunnel &#8211;config /path/to/config.yml run</p>



<p> <strong>Xong!</strong> Bây giờ bạn có thể truy cập https://api.namdevlabs.com và thấy nó trỏ thẳng về localhost:3000 của bạn với HTTPS xanh mượt.</p>



<h2 id="5-meo-nang-cao-cho-pro-developer" class="wp-block-heading">5. Mẹo nâng cao cho Pro Developer</h2>



<ul class="wp-block-list">
<li><strong>Chạy ngầm (Service Mode):</strong> Để tunnel tự chạy khi khởi động máy (dành cho server home lab):codeBash<code>sudo cloudflared service install sudo systemctl start cloudflared</code></li>



<li><strong>Bảo mật Zero Trust:</strong> Bạn sợ người lạ vào link demo? Vào Cloudflare Dashboard -> Zero Trust, bật tính năng yêu cầu đăng nhập bằng Email/Google trước khi truy cập vào domain.</li>



<li><strong>Debug lỗi:</strong> Nếu không truy cập được, hãy thêm flag &#8211;loglevel debug khi chạy để xem log chi tiết.</li>
</ul>



<h2 id="6-tong-ket" class="wp-block-heading">6. Tổng kết</h2>



<p>Cloudflare Tunnel thực sự là một vũ khí lợi hại trong bộ công cụ của developer. Nó giúp bạn:</p>



<ol class="wp-block-list">
<li><strong>Tiết kiệm tiền:</strong> Không tốn phí server staging.</li>



<li><strong>Tiết kiệm thời gian:</strong> Không cần deploy để demo.</li>



<li><strong>An toàn:</strong> Không mở port, hạn chế tấn công DDoS.</li>
</ol>



<p>Hy vọng bài viết giúp bạn giải quyết được bài toán đau đầu về Webhook và Demo. Chúc bạn code vui!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>
<p>The post <a href="https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/">Đưa Localhost lên Internet miễn phí với Cloudflare Tunnel: Giải pháp thay thế Ngrok để Test Webhook &amp; Demo App</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
