<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[AdminsForum - Varnish Cache for aaPanel]]></title>
		<link>https://adminsforum.com/</link>
		<description><![CDATA[AdminsForum - https://adminsforum.com]]></description>
		<pubDate>Sat, 24 Oct 2026 21:46:55 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Varnish Cache for aaPanel 0.6.2: Multi-Webserver Test Download]]></title>
			<link>https://adminsforum.com/Thread-varnish-cache-for-aapanel-0-6-2-multi-webserver-test-download</link>
			<pubDate>Sun, 25 Oct 2026 02:29:24 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-varnish-cache-for-aapanel-0-6-2-multi-webserver-test-download</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Varnish Cache by Adminforum 0.6.2 — multi-webserver test download</span><br />
<br />
<a href="https://adminsforum.com/mydownloads.php?action=view&amp;product=1" target="_blank" rel="noopener" class="mycode_url">Download Varnish Cache 0.6.2 and view its release history</a>. This is a development test package for a disposable Linux aaPanel server. It binds one WordPress site selected by its aaPanel site ID. It is not yet a general production release.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Compatible test routes</span><ul class="mycode_list"><li>Nginx.<br />
</li>
<li>Nginx + Apache, using aaPanel's existing Apache/PHP-FPM backend.<br />
</li>
<li>Nginx + OpenLiteSpeed, using aaPanel's existing OLS/lsphp backend.<br />
</li>
</ul>
Nginx must remain the public frontend. Standalone Apache-only and OpenLiteSpeed-only frontends are not supported by this installer. Multi-webserver support describes the selected site's engine combination; this package does not manage multiple cached sites at once.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">What changed</span><br />
The addon reads the actual assigned backend and its loopback port, preserves native backend files and security locations, and adds a reversible Varnish route. If the dedicated cache stops, the combined routes fall back to the native backend. WordPress edits trigger cache invalidation. Existing cache layers and unknown custom configurations are checked before activation.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Verified results</span><br />
Both combined modes passed 44 live checks each: <span style="font-weight: bold;" class="mycode_b">88/88 checks</span> in total. These covered MISS then HIT, cookies/admin/query/Authorization bypass, WordPress update purging, protected purge, native fallback, exact route restoration, two real logged-in users, and configuration-conflict detection. Another 19 Linux installer safeguards and 18 adapter tests passed.<br />
<br />
Test environment: Ubuntu 22.04.5, aaPanel 8.0.7, WordPress 7.1.3, Nginx 1.30.6, Apache 2.4.69, OpenLiteSpeed 1.8.5, PHP/lsphp 8.5.12 and privately extracted distro Varnish 6.6.1. The previously installed lab addon was preserved; the candidate was tested from an isolated review directory.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Install on your test server</span><br />
1. Take a VM snapshot and confirm the chosen WordPress site works over trusted HTTPS. Keep it on its intended aaPanel engine combination. Use one hostname with /www/wwwroot/hostname as its document root.<br />
2. Download and extract the ZIP from the release page. Read START-HERE.md inside it. Upload its af_varnish folder outside the website root, for example /root/af-varnish-test/af_varnish.<br />
3. In aaPanel Terminal as root:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>cd /root/af-varnish-test/af_varnish
bash install.sh install
cd /www/server/panel/plugin/af_varnish
/www/server/panel/pyenv/bin/python3 setup.py prepare-engine
/www/server/panel/pyenv/bin/python3 setup.py list-sites</code></div></div>The installer refuses an existing addon installation instead of overwriting it. prepare-engine extracts Varnish from your configured signed apt repositories; it does not install the system Varnish service or start public listeners.<br />
<br />
4. Replace 12 with your WordPress site's actual ID:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>/www/server/panel/pyenv/bin/python3 setup.py configure --site-id 12
/www/server/panel/pyenv/bin/python3 setup.py doctor</code></div></div>Configuration does not enable caching. If preflight refuses a custom route, preserve the error and report it; do not force changes past the checks.<br />
<br />
5. Open the addon in aaPanel, select Websites and Enable the configured site. Repeat an anonymous request: a cacheable page should show X-AF-Cache: MISS and then HIT. Cookie/login/admin/query requests should bypass. In combined modes POST, Upgrade-header and event-stream-header requests route directly to the native backend.<br />
6. Test a WordPress post edit, Purge and Disable. Disable must restore direct operation before stopping its cache dependencies. Follow START-HERE.md for removal; do not use the unverified App Store removal wrapper for this candidate.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Current limits</span><br />
Use one cache layer: active WordPress page-cache drop-ins and active inner OLS page caching are refused. WooCommerce, clean-server installation, reboot/upgrade lifecycle, active engine switching, certificate renewal, WP Toolkit creation, WAF integration and arbitrary custom configurations remain unverified. Upgrade/event-stream request routing was checked; a complete WebSocket handshake or long-running stream was not demonstrated.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">File verification</span><br />
Filename: af-varnish-0.6.2-multi-localtest.zip<br />
Size: 87,955 bytes<br />
SHA-256:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>b5813a7abed5d442b8d748472c6d1035cfabf35e00510f9ae8c343ffbd74ee53</code></div></div>The archive includes installation instructions and a SHA256SUMS manifest. No Varnish engine binary is bundled.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Report your test results here</span><br />
Include OS, aaPanel, webserver mode, PHP/lsphp and Varnish versions, whether the problem occurs on Enable/Purge/Disable, and relevant redacted error output. Do not post credentials, cookies or purge secrets.<br />
<br />
<a href="https://adminsforum.com/Forum-varnish-cache-for-aapanel" target="_blank" rel="noopener" class="mycode_url">Varnish guides and support</a>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Varnish Cache by Adminforum 0.6.2 — multi-webserver test download</span><br />
<br />
<a href="https://adminsforum.com/mydownloads.php?action=view&amp;product=1" target="_blank" rel="noopener" class="mycode_url">Download Varnish Cache 0.6.2 and view its release history</a>. This is a development test package for a disposable Linux aaPanel server. It binds one WordPress site selected by its aaPanel site ID. It is not yet a general production release.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Compatible test routes</span><ul class="mycode_list"><li>Nginx.<br />
</li>
<li>Nginx + Apache, using aaPanel's existing Apache/PHP-FPM backend.<br />
</li>
<li>Nginx + OpenLiteSpeed, using aaPanel's existing OLS/lsphp backend.<br />
</li>
</ul>
Nginx must remain the public frontend. Standalone Apache-only and OpenLiteSpeed-only frontends are not supported by this installer. Multi-webserver support describes the selected site's engine combination; this package does not manage multiple cached sites at once.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">What changed</span><br />
The addon reads the actual assigned backend and its loopback port, preserves native backend files and security locations, and adds a reversible Varnish route. If the dedicated cache stops, the combined routes fall back to the native backend. WordPress edits trigger cache invalidation. Existing cache layers and unknown custom configurations are checked before activation.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Verified results</span><br />
Both combined modes passed 44 live checks each: <span style="font-weight: bold;" class="mycode_b">88/88 checks</span> in total. These covered MISS then HIT, cookies/admin/query/Authorization bypass, WordPress update purging, protected purge, native fallback, exact route restoration, two real logged-in users, and configuration-conflict detection. Another 19 Linux installer safeguards and 18 adapter tests passed.<br />
<br />
Test environment: Ubuntu 22.04.5, aaPanel 8.0.7, WordPress 7.1.3, Nginx 1.30.6, Apache 2.4.69, OpenLiteSpeed 1.8.5, PHP/lsphp 8.5.12 and privately extracted distro Varnish 6.6.1. The previously installed lab addon was preserved; the candidate was tested from an isolated review directory.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Install on your test server</span><br />
1. Take a VM snapshot and confirm the chosen WordPress site works over trusted HTTPS. Keep it on its intended aaPanel engine combination. Use one hostname with /www/wwwroot/hostname as its document root.<br />
2. Download and extract the ZIP from the release page. Read START-HERE.md inside it. Upload its af_varnish folder outside the website root, for example /root/af-varnish-test/af_varnish.<br />
3. In aaPanel Terminal as root:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>cd /root/af-varnish-test/af_varnish
bash install.sh install
cd /www/server/panel/plugin/af_varnish
/www/server/panel/pyenv/bin/python3 setup.py prepare-engine
/www/server/panel/pyenv/bin/python3 setup.py list-sites</code></div></div>The installer refuses an existing addon installation instead of overwriting it. prepare-engine extracts Varnish from your configured signed apt repositories; it does not install the system Varnish service or start public listeners.<br />
<br />
4. Replace 12 with your WordPress site's actual ID:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>/www/server/panel/pyenv/bin/python3 setup.py configure --site-id 12
/www/server/panel/pyenv/bin/python3 setup.py doctor</code></div></div>Configuration does not enable caching. If preflight refuses a custom route, preserve the error and report it; do not force changes past the checks.<br />
<br />
5. Open the addon in aaPanel, select Websites and Enable the configured site. Repeat an anonymous request: a cacheable page should show X-AF-Cache: MISS and then HIT. Cookie/login/admin/query requests should bypass. In combined modes POST, Upgrade-header and event-stream-header requests route directly to the native backend.<br />
6. Test a WordPress post edit, Purge and Disable. Disable must restore direct operation before stopping its cache dependencies. Follow START-HERE.md for removal; do not use the unverified App Store removal wrapper for this candidate.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Current limits</span><br />
Use one cache layer: active WordPress page-cache drop-ins and active inner OLS page caching are refused. WooCommerce, clean-server installation, reboot/upgrade lifecycle, active engine switching, certificate renewal, WP Toolkit creation, WAF integration and arbitrary custom configurations remain unverified. Upgrade/event-stream request routing was checked; a complete WebSocket handshake or long-running stream was not demonstrated.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">File verification</span><br />
Filename: af-varnish-0.6.2-multi-localtest.zip<br />
Size: 87,955 bytes<br />
SHA-256:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>b5813a7abed5d442b8d748472c6d1035cfabf35e00510f9ae8c343ffbd74ee53</code></div></div>The archive includes installation instructions and a SHA256SUMS manifest. No Varnish engine binary is bundled.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Report your test results here</span><br />
Include OS, aaPanel, webserver mode, PHP/lsphp and Varnish versions, whether the problem occurs on Enable/Purge/Disable, and relevant redacted error output. Do not post credentials, cookies or purge secrets.<br />
<br />
<a href="https://adminsforum.com/Forum-varnish-cache-for-aapanel" target="_blank" rel="noopener" class="mycode_url">Varnish guides and support</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Install Varnish Cache in aaPanel: Closed Lab Preview]]></title>
			<link>https://adminsforum.com/Thread-guide-install-varnish-cache-in-aapanel-closed-lab-preview</link>
			<pubDate>Sat, 24 Oct 2026 19:26:32 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-install-varnish-cache-in-aapanel-closed-lab-preview</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Updated 24 October 2026 | Varnish Cache by Adminforum 0.6.0-lab | Verified scope: one audited WordPress/Nginx website.</span><br />
<br />
This guide covers <span style="font-weight: bold;" class="mycode_b">Varnish Cache by Adminforum 0.6.0-lab</span>, the development build tested on our existing aaPanel lab. It explains how its control files are validated and how the audited WordPress website is added and enabled.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">This is not a clean-server installation recipe.</span> The current native integration is restricted in code to blog.adminslab.com, aaPanel site ID 11, using Nginx/PHP and the WordPress template. Its Varnish binaries and runtime dependencies were already prepared on this lab. Copying the control files to another server will not produce a supported working installation. A portable installer and the full aaPanel webserver matrix remain release gates.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Check the tested environment</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Operating system:</span> Ubuntu 22.04 lab VPS<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel:</span> 8.0.7; multi-webserver feature enabled<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website assignment:</span> Nginx 1.30.6<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WordPress PHP:</span> 8.5.12<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WordPress:</span> 7.1.3<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish:</span> 9.1.0<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Dedicated cache capacity:</span> 32 MiB<br />
<br />
Having Apache or OpenLiteSpeed installed does not establish addon compatibility with those website assignments. aaPanel supports per-site server choices and proxy combinations; each requires its own integration tests. See <a href="https://www.aapanel.com/docs/faq/multi-webserver_hosting.html" target="_blank" rel="noopener" class="mycode_url">aaPanel Multi-WebServer Hosting</a>.<br />
<br />
Before a closed test, retain a private copy of the plugin files and the site's native configuration. Confirm that WordPress works over valid HTTPS, that the website is assigned to the audited engine, and that the application/database can be recovered. Keep the lab's noindex and outgoing-mail guard in place.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Validate the installed control files</span></span><br />
<br />
The current lab control directory is:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>/www/server/panel/plugin/af_varnish</code></div></div><br />
For an operator already working in this prepared lab, the installation-validation command is:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>bash /www/server/panel/plugin/af_varnish/install.sh install</code></div></div><br />
It validates the known control files and their permissions. It does not download or install the Varnish engine, prepare a fresh server, start caching or rewrite a registered website. On this test run, it completed while the existing native cache stayed enabled and its public route remained unchanged.<br />
<br />
Use a reviewed build supplied for the specific lab. There is no public download link for the current native build in this guide. Do not substitute an older preview archive and assume it includes the current native controls.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Open the addon</span></span><br />
<br />
1. Sign in as the primary aaPanel administrator.<br />
2. Open **Home → Software → Varnish Cache by Adminforum**.<br />
3. Confirm that the addon loads and website discovery completes.<br />
4. If an update appears to use older code, reopen the addon. A panel-process refresh may be required by the operator after deployment; this is separate from rebooting the VPS or restarting website services.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Add the audited WordPress website</span></span><br />
<br />
1. Choose **Add website**.<br />
2. Select the existing `blog.adminslab.com` website from aaPanel.<br />
3. Choose **WordPress** as the application template.<br />
4. Choose **Add website** to save it in the addon workspace.<br />
<br />
Adding a website does not enable caching. The template identifies the application; it does not mean that every application or server mode has a working adapter.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Enable caching and verify the route</span></span><br />
<br />
For the audited lab website, open <span style="font-weight: bold;" class="mycode_b">Websites</span> and choose <span style="font-weight: bold;" class="mycode_b">Enable caching</span> in the managed WordPress control card. Wait for the operation and verification to finish.<br />
<br />
The addon creates a dedicated private Varnish service and a site-specific origin handoff while retaining the native HTTPS frontend. It keeps an original-route backup and configuration fingerprints. It does not require a global webserver switch.<br />
<br />
Successful activation shows <span style="font-weight: bold;" class="mycode_b">Varnish: active</span>. The green state requires both a verified managed process and a successful HTTPS response through the cache route. A website simply returning HTTP 200 is insufficient.<br />
<br />
Open <span style="font-weight: bold;" class="mycode_b">Dashboard</span> to check request counters, hit rate, traffic readings, memory, version and uptime. Use a logged-out request to a cacheable public post to confirm a MISS followed by a HIT. See the <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">configuration guide</a>.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Disable safely before removal</span></span><br />
<br />
Use <span style="font-weight: bold;" class="mycode_b">Disable caching</span> and wait for the native direct route to be restored. Only then remove the website from the addon list. Removing it from the addon list does not delete its aaPanel website, files or database.<br />
<br />
The installer refused uninstall while the native cache was configured in our live test. The website route and plugin files remained intact. This verifies the active-cache safeguard, <span style="font-weight: bold;" class="mycode_b">not</span> a complete clean uninstall/reinstall lifecycle.<br />
<br />
Do not delete runtime files or manually stop dependencies while a managed public route still needs them. If a native configuration has changed, preserve it and resolve the conflict; do not overwrite it with an older backup merely to force removal.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation troubleshooting</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Addon opens but activation is unavailable:</span> Confirm the exact supported site, engine and WordPress template. Other sites remain outside native activation scope.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Enable rolls back:</span> Inspect the private routing journal, Nginx validation and PHP/site errors. Confirm the original website still works.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP cannot read addon configuration:</span> Preserve open_basedir. The corrected bridge embeds its installed key in the PHP-readable MU plugin; it does not require relaxing the restriction.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Quick re-enable reports an occupied private port:</span> Allow graceful listener retirement; identify a real port owner before retrying. Do not kill an unknown process.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Uninstall is refused:</span> Disable the managed native cache first and confirm direct routing.<br />
<br />
Public release still requires portable dependency installation, additional native engine adapters, mixed-engine tests and lifecycle validation. Until then, use this procedure only within the explicitly prepared closed lab.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Original AdminsForum lab work. Copyright AdminsForum | adminsforum.com.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Guide series:</span> <a href="https://adminsforum.com/Thread-guide-install-varnish-cache-in-aapanel-closed-lab-preview" target="_blank" rel="noopener" class="mycode_url">Installation</a> | <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">WordPress configuration</a> | <a href="https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results" target="_blank" rel="noopener" class="mycode_url">Measured results</a>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Updated 24 October 2026 | Varnish Cache by Adminforum 0.6.0-lab | Verified scope: one audited WordPress/Nginx website.</span><br />
<br />
This guide covers <span style="font-weight: bold;" class="mycode_b">Varnish Cache by Adminforum 0.6.0-lab</span>, the development build tested on our existing aaPanel lab. It explains how its control files are validated and how the audited WordPress website is added and enabled.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">This is not a clean-server installation recipe.</span> The current native integration is restricted in code to blog.adminslab.com, aaPanel site ID 11, using Nginx/PHP and the WordPress template. Its Varnish binaries and runtime dependencies were already prepared on this lab. Copying the control files to another server will not produce a supported working installation. A portable installer and the full aaPanel webserver matrix remain release gates.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Check the tested environment</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Operating system:</span> Ubuntu 22.04 lab VPS<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel:</span> 8.0.7; multi-webserver feature enabled<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website assignment:</span> Nginx 1.30.6<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WordPress PHP:</span> 8.5.12<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WordPress:</span> 7.1.3<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish:</span> 9.1.0<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Dedicated cache capacity:</span> 32 MiB<br />
<br />
Having Apache or OpenLiteSpeed installed does not establish addon compatibility with those website assignments. aaPanel supports per-site server choices and proxy combinations; each requires its own integration tests. See <a href="https://www.aapanel.com/docs/faq/multi-webserver_hosting.html" target="_blank" rel="noopener" class="mycode_url">aaPanel Multi-WebServer Hosting</a>.<br />
<br />
Before a closed test, retain a private copy of the plugin files and the site's native configuration. Confirm that WordPress works over valid HTTPS, that the website is assigned to the audited engine, and that the application/database can be recovered. Keep the lab's noindex and outgoing-mail guard in place.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Validate the installed control files</span></span><br />
<br />
The current lab control directory is:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>/www/server/panel/plugin/af_varnish</code></div></div><br />
For an operator already working in this prepared lab, the installation-validation command is:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>bash /www/server/panel/plugin/af_varnish/install.sh install</code></div></div><br />
It validates the known control files and their permissions. It does not download or install the Varnish engine, prepare a fresh server, start caching or rewrite a registered website. On this test run, it completed while the existing native cache stayed enabled and its public route remained unchanged.<br />
<br />
Use a reviewed build supplied for the specific lab. There is no public download link for the current native build in this guide. Do not substitute an older preview archive and assume it includes the current native controls.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Open the addon</span></span><br />
<br />
1. Sign in as the primary aaPanel administrator.<br />
2. Open **Home → Software → Varnish Cache by Adminforum**.<br />
3. Confirm that the addon loads and website discovery completes.<br />
4. If an update appears to use older code, reopen the addon. A panel-process refresh may be required by the operator after deployment; this is separate from rebooting the VPS or restarting website services.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Add the audited WordPress website</span></span><br />
<br />
1. Choose **Add website**.<br />
2. Select the existing `blog.adminslab.com` website from aaPanel.<br />
3. Choose **WordPress** as the application template.<br />
4. Choose **Add website** to save it in the addon workspace.<br />
<br />
Adding a website does not enable caching. The template identifies the application; it does not mean that every application or server mode has a working adapter.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Enable caching and verify the route</span></span><br />
<br />
For the audited lab website, open <span style="font-weight: bold;" class="mycode_b">Websites</span> and choose <span style="font-weight: bold;" class="mycode_b">Enable caching</span> in the managed WordPress control card. Wait for the operation and verification to finish.<br />
<br />
The addon creates a dedicated private Varnish service and a site-specific origin handoff while retaining the native HTTPS frontend. It keeps an original-route backup and configuration fingerprints. It does not require a global webserver switch.<br />
<br />
Successful activation shows <span style="font-weight: bold;" class="mycode_b">Varnish: active</span>. The green state requires both a verified managed process and a successful HTTPS response through the cache route. A website simply returning HTTP 200 is insufficient.<br />
<br />
Open <span style="font-weight: bold;" class="mycode_b">Dashboard</span> to check request counters, hit rate, traffic readings, memory, version and uptime. Use a logged-out request to a cacheable public post to confirm a MISS followed by a HIT. See the <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">configuration guide</a>.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Disable safely before removal</span></span><br />
<br />
Use <span style="font-weight: bold;" class="mycode_b">Disable caching</span> and wait for the native direct route to be restored. Only then remove the website from the addon list. Removing it from the addon list does not delete its aaPanel website, files or database.<br />
<br />
The installer refused uninstall while the native cache was configured in our live test. The website route and plugin files remained intact. This verifies the active-cache safeguard, <span style="font-weight: bold;" class="mycode_b">not</span> a complete clean uninstall/reinstall lifecycle.<br />
<br />
Do not delete runtime files or manually stop dependencies while a managed public route still needs them. If a native configuration has changed, preserve it and resolve the conflict; do not overwrite it with an older backup merely to force removal.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation troubleshooting</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Addon opens but activation is unavailable:</span> Confirm the exact supported site, engine and WordPress template. Other sites remain outside native activation scope.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Enable rolls back:</span> Inspect the private routing journal, Nginx validation and PHP/site errors. Confirm the original website still works.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP cannot read addon configuration:</span> Preserve open_basedir. The corrected bridge embeds its installed key in the PHP-readable MU plugin; it does not require relaxing the restriction.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Quick re-enable reports an occupied private port:</span> Allow graceful listener retirement; identify a real port owner before retrying. Do not kill an unknown process.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Uninstall is refused:</span> Disable the managed native cache first and confirm direct routing.<br />
<br />
Public release still requires portable dependency installation, additional native engine adapters, mixed-engine tests and lifecycle validation. Until then, use this procedure only within the explicitly prepared closed lab.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Original AdminsForum lab work. Copyright AdminsForum | adminsforum.com.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Guide series:</span> <a href="https://adminsforum.com/Thread-guide-install-varnish-cache-in-aapanel-closed-lab-preview" target="_blank" rel="noopener" class="mycode_url">Installation</a> | <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">WordPress configuration</a> | <a href="https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results" target="_blank" rel="noopener" class="mycode_url">Measured results</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Install Varnish for WordPress on aaPanel: Tested Lab Guide]]></title>
			<link>https://adminsforum.com/Thread-guide-install-varnish-for-wordpress-on-aapanel-tested-lab-guide</link>
			<pubDate>Tue, 20 Oct 2026 15:56:55 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-install-varnish-for-wordpress-on-aapanel-tested-lab-guide</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Tested 20 October 2026: real WordPress 7.1.3 with Varnish 9.1.0 on an Ubuntu 22.04 aaPanel lab.</span><br />
<br />
This guide installs a separate WordPress/Varnish training stack using aaPanel's existing Nginx, PHP and database software. It shows package verification, installation, WordPress cache eligibility, exclusions, testing, manual invalidation and shutdown.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Scope matters:</span> this is a manual, loopback-only lab setup. It does not enable caching on a registered aaPanel website, edit its vhost, install an aaPanel App Store plugin or create a production service. The AdminsForum addon preview remains a separate project. We are documenting a real WordPress test here rather than implying that selecting its WordPress template already connects a live site.<br />
<br />
<img src="https://adminsforum.com/attachment.php?aid=400" loading="lazy"  alt="[Image: attachment.php?aid=400]" class="mycode_img" /><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. What you need before installation</span></span><br />
- A disposable aaPanel training VPS or a recoverable lab snapshot, with root SSH access.<br />
- Ubuntu 22.04 on amd64. These files deliberately target this declared environment, not every Linux distribution.<br />
- Existing aaPanel Nginx at /www/server/nginx/sbin/nginx, PHP 8.5 with /tmp/php-cgi-85.sock, the panel Python environment and the MySQL/MariaDB client at /www/server/mysql/bin/mysql.<br />
- Python 3, gpg/gpgv, dpkg-deb, gcc and the libraries required by the vendor's Ubuntu package. Our existing panel server already had them. Stop if package verification, dependency checks or config validation fail.<br />
- Unused loopback ports 18190, 18191, 18192 and 18193, and sufficient disk/RAM for another test application. Our lab had 2 CPU cores and approximately 4 GB RAM; that is environment information, not a production sizing promise.<br />
<br />
Keep the existing production sites and acceleration/WAF configuration in place. This exercise uses a separate process/configuration and does not need public DNS changes, firewall openings or moving aaPanel Nginx away from port 80/443.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Download and inspect the guide files</span></span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=402" target="_blank" title="">wordpress-varnish-lab-guide-files-20261020.zip</a> (Size: 9.79 KB / Downloads: 15)
<!-- end: postbit_attachments_attachment --><br />
<br />
The ZIP contains README.txt, setup-engine.py, setup-wordpress.py, runtime.py and verify-wordpress.py. Read them before running root commands. It contains no WordPress core archive, passwords, cookies, private keys, database dumps or existing-site configuration. It is example source for this training setup, not the preview addon's install ZIP.<br />
<br />
Verify the downloaded ZIP locally or on the VPS:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sha256sum wordpress-varnish-lab-guide-files-20261020.zip</code></div></div>Expected SHA-256:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>478b2b6e37034bcdabadd02c0ff6bd68d98c5663120a3446ccad05a6ec69e9aa</code></div></div><br />
Extract it into a new private working folder and open README.txt. Keep all four scripts together. Do not rerun setup against an already-created lab or change only one hardcoded path: the scripts share the root /opt/af-wp-varnish-20261020, database name and port layout. An existing database or wp-config.php is a reason to stop and inspect, not to delete a working installation.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Install the supported Varnish engine privately</span></span><br />
From the extracted guide folder, run:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo python3 setup-engine.py</code></div></div><br />
The script fetches the official vendor repository key, verifies its signed release metadata, verifies the package index checksum, then verifies the selected package checksum. It stages Varnish 9.1.0-2~jammy under the dedicated lab root using dpkg-deb extraction. It does not register a system package, start the distribution's default service or take over an existing listener.<br />
<br />
Read the result: repository_signature_valid must be true and the version output must identify Varnish 9.1.0. This version was supported when this guide was checked. Recheck the official supported-release list when reproducing the exercise later; a pinned example is not an automatic security-update mechanism. Package extraction here intentionally keeps the panel's services independent.<br />
<br />
Do not install the older Varnish 6.6.1 package used in our first synthetic addon benchmark just to match its screenshots. This WordPress exercise uses a newer, separately staged engine.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Prepare a separate WordPress application and database</span></span><br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo python3 setup-wordpress.py</code></div></div><br />
This downloads WordPress from wordpress.org, verifies its core file checksums against the WordPress API, and prepares a new application under the dedicated lab root. It creates only the named lab database af_wp_varnish_20261020 and a database user restricted to that database. To do this, it reads aaPanel's existing stored MySQL root credential locally; it does not print or send that credential to a website.<br />
<br />
The script generates new random lab passwords and salts. The generated WordPress login details stay in the root-readable private-users.json on the VPS. Do not attach that file, wp-config.php or admin.secret to a support post. The lab disables outgoing WordPress mail and scheduled cron requests. Existing WordPress databases and users are not reused.<br />
<br />
The setup result should report installed=true and the actual WordPress version. Our downloaded and verified version was 7.1.3. The script intentionally refuses to overwrite an existing configuration or an already-named database; resolve a failed/partial exercise by inspecting that dedicated lab, not by repeatedly rerunning setup blindly.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Generate and validate the isolated routing</span></span><br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo install -m 0644 runtime.py /opt/af-wp-varnish-20261020/runtime.py
sudo python3 /opt/af-wp-varnish-20261020/runtime.py prepare
sudo python3 /opt/af-wp-varnish-20261020/runtime.py start</code></div></div><br />
The start action validates Nginx and compiles VCL before starting the separate processes. The paths are:<br />
- 127.0.0.1:18190: the front-end Nginx listener.<br />
- 127.0.0.1:18192: Varnish cache.<br />
- 127.0.0.1:18191: the origin Nginx, connected to aaPanel's PHP 8.5 socket and this WordPress installation.<br />
- 127.0.0.1:18193: authenticated Varnish management. Its secret stays in the dedicated root; do not expose this listener.<br />
<br />
The example allocates 64 MiB cache storage and small lab thread pools. Those are exercise settings, not production tuning recommendations. In this private example Varnish drops privileges to nobody/nogroup; a production service needs its own managed identity and lifecycle. No startup-on-reboot service is installed here.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Understand the WordPress configuration</span></span><br />
WordPress is configured for <a href="http://127.0.0.1:18190" target="_blank" rel="noopener" class="mycode_url">http://127.0.0.1:18190</a>. The small MU plugin added by setup explicitly permits short public caching only for anonymous front-page and post responses without query parameters. It does not mark every PHP response public.<br />
<br />
The VCL passes requests with any cookie or Authorization header, non-GET/HEAD methods, queries, encoded paths and common WordPress administration/login/REST/cron/comment paths. Common cart, checkout and account paths also bypass. Responses with Set-Cookie, private/no-store/no-cache, errors or no positive explicitly public lifetime are not cached. Cached responses are capped at 60 seconds.<br />
<br />
This conservative policy means a logged-in visitor bypasses even a normally public home page. Do not strip login or cart cookies to manufacture a better hit rate. Custom plugins, translated store paths, password-protected content, forms and personalized routes require application-specific review. WooCommerce was not installed in this test; the presence of cart-path exclusions is not a WooCommerce compatibility certification.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. Verify a first MISS and a repeat HIT</span></span><br />
Run these on the VPS, without browser cookies:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl -sS -D - -o /dev/null http://127.0.0.1:18190/
curl -sS -D - -o /dev/null http://127.0.0.1:18190/</code></div></div><br />
Check HTTP 200 and X-AF-WP-Cache. A new eligible page should be MISS first and HIT when repeated before expiry. If another test already filled it, it may already be HIT. BYPASS means the request or response was excluded; it is not automatically an error. These diagnostic headers belong to this guide's configuration, not to every Varnish deployment.<br />
<br />
To view the actual WordPress lab from your computer, create an SSH tunnel in a local terminal using your normal SSH account:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>ssh -L 18190:127.0.0.1:18190 YOUR_SSH_USER@YOUR_VPS</code></div></div>Keep that tunnel open, then open <a href="http://127.0.0.1:18190/" target="_blank" rel="noopener" class="mycode_url">http://127.0.0.1:18190/</a> locally. If your local port is busy, resolve the conflict first; these example URLs and WordPress settings use the same port. There is no need to expose the remote lab to the internet.<br />
<br />
<img src="https://adminsforum.com/attachment.php?aid=401" loading="lazy"  alt="[Image: attachment.php?aid=401]" class="mycode_img" /><br />
<span style="font-style: italic;" class="mycode_i">Original screenshot of the actual WordPress installation viewed through a private SSH tunnel.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">8. Verify private requests and two-user isolation</span></span><br />
Run the provided validation script from the extracted guide folder:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo python3 verify-wordpress.py</code></div></div><br />
It uses the generated disposable users, creates a private session-check endpoint, changes the demonstration post and verifies the configured cache path. It does not benchmark a customer's site. Our recorded results were:<br />
- Anonymous home: 200 MISS, then 200 HIT.<br />
- Cookie, Authorization, login, REST, search query and POST requests: BYPASS.<br />
- Missing page: 404 BYPASS; anonymous private session endpoint: 401 BYPASS.<br />
- Two real WordPress users: each received its own identity and nonce; both logged-in home requests bypassed.<br />
- Changed public content: the older cached copy remained until manual invalidation, then the new copy returned MISS followed by HIT.<br />
- Public HTTP PURGE: 405 rejected.<br />
<br />
Separate follow-up checks also verified expiry after the 60-second window and a restart of the isolated stack. These are functional application checks. We did not run a new WordPress speed benchmark and do not apply the earlier synthetic response-time percentages to this site.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">9. Invalidate changed content</span></span><br />
This example does not install automatic WordPress purge hooks. For the exact home-page URL in this single-host test instance, use the private management interface:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo env LD_LIBRARY_PATH=/opt/af-wp-varnish-20261020/engine/usr/lib:/opt/af-wp-varnish-20261020/engine/usr/lib/x86_64-linux-gnu /opt/af-wp-varnish-20261020/engine/usr/bin/varnishadm -T 127.0.0.1:18193 -S /opt/af-wp-varnish-20261020/admin.secret ban 'req.url == /'</code></div></div><br />
This management command adds an exact-URL ban for / in this dedicated instance; it is not a whole-site purge or a recursive wildcard. Repeat the curl checks to refill and verify the updated response. Other changed URLs need their own invalidation, and the public HTTP PURGE method remains disabled. Never treat editing a WordPress post as proof that every cache layer was cleared.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">10. Stop the lab and understand the production boundary</span></span><br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo python3 /opt/af-wp-varnish-20261020/runtime.py stop</code></div></div>This stops only the checked lab process IDs. The WordPress files, separate database, generated credentials and staged engine remain for inspection. There is no automatic destructive cleanup.<br />
<br />
Our existing registered aaPanel vhost hashes stayed unchanged. This exercise did not test public HTTPS, WooCommerce, a real-domain aaPanel vhost adapter, reboot persistence, panel-generated config changes, certificate renewal or live-site uninstall. Connecting an existing domain needs a separately validated integration with its actual routing, trusted TLS forwarding, backups and rollback. Do not move a working site's ports or replace its aaPanel-generated configuration using these loopback examples.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Related:</span> <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">Addon preview controls and exclusions</a>; <a href="https://adminsforum.com/Thread-guide-fine-tune-varnish-cache-hit-rate-memory-and-troubleshooting" target="_blank" rel="noopener" class="mycode_url">cache tuning and troubleshooting</a>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Primary references:</span> <a href="https://www.varnish.org/docs/install-guide/install-debian-ubuntu/" target="_blank" rel="noopener" class="mycode_url">Varnish's official Ubuntu installation source</a>; <a href="https://www.varnish.org/releases/index.html" target="_blank" rel="noopener" class="mycode_url">supported Varnish releases</a>; <a href="https://developer.wordpress.org/advanced-administration/performance/optimization/" target="_blank" rel="noopener" class="mycode_url">WordPress performance and caching guidance</a>.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Copyright AdminsForum | adminsforum.com. Original lab evidence; scope and limitations are stated above.</span><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=400" target="_blank" title="">wordpress-varnish-architecture-20261020.png</a> (Size: 123.21 KB / Downloads: 21)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=401" target="_blank" title="">wordpress-varnish-site-20261020.jpg</a> (Size: 109 KB / Downloads: 20)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Tested 20 October 2026: real WordPress 7.1.3 with Varnish 9.1.0 on an Ubuntu 22.04 aaPanel lab.</span><br />
<br />
This guide installs a separate WordPress/Varnish training stack using aaPanel's existing Nginx, PHP and database software. It shows package verification, installation, WordPress cache eligibility, exclusions, testing, manual invalidation and shutdown.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Scope matters:</span> this is a manual, loopback-only lab setup. It does not enable caching on a registered aaPanel website, edit its vhost, install an aaPanel App Store plugin or create a production service. The AdminsForum addon preview remains a separate project. We are documenting a real WordPress test here rather than implying that selecting its WordPress template already connects a live site.<br />
<br />
<img src="https://adminsforum.com/attachment.php?aid=400" loading="lazy"  alt="[Image: attachment.php?aid=400]" class="mycode_img" /><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. What you need before installation</span></span><br />
- A disposable aaPanel training VPS or a recoverable lab snapshot, with root SSH access.<br />
- Ubuntu 22.04 on amd64. These files deliberately target this declared environment, not every Linux distribution.<br />
- Existing aaPanel Nginx at /www/server/nginx/sbin/nginx, PHP 8.5 with /tmp/php-cgi-85.sock, the panel Python environment and the MySQL/MariaDB client at /www/server/mysql/bin/mysql.<br />
- Python 3, gpg/gpgv, dpkg-deb, gcc and the libraries required by the vendor's Ubuntu package. Our existing panel server already had them. Stop if package verification, dependency checks or config validation fail.<br />
- Unused loopback ports 18190, 18191, 18192 and 18193, and sufficient disk/RAM for another test application. Our lab had 2 CPU cores and approximately 4 GB RAM; that is environment information, not a production sizing promise.<br />
<br />
Keep the existing production sites and acceleration/WAF configuration in place. This exercise uses a separate process/configuration and does not need public DNS changes, firewall openings or moving aaPanel Nginx away from port 80/443.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Download and inspect the guide files</span></span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=402" target="_blank" title="">wordpress-varnish-lab-guide-files-20261020.zip</a> (Size: 9.79 KB / Downloads: 15)
<!-- end: postbit_attachments_attachment --><br />
<br />
The ZIP contains README.txt, setup-engine.py, setup-wordpress.py, runtime.py and verify-wordpress.py. Read them before running root commands. It contains no WordPress core archive, passwords, cookies, private keys, database dumps or existing-site configuration. It is example source for this training setup, not the preview addon's install ZIP.<br />
<br />
Verify the downloaded ZIP locally or on the VPS:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sha256sum wordpress-varnish-lab-guide-files-20261020.zip</code></div></div>Expected SHA-256:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>478b2b6e37034bcdabadd02c0ff6bd68d98c5663120a3446ccad05a6ec69e9aa</code></div></div><br />
Extract it into a new private working folder and open README.txt. Keep all four scripts together. Do not rerun setup against an already-created lab or change only one hardcoded path: the scripts share the root /opt/af-wp-varnish-20261020, database name and port layout. An existing database or wp-config.php is a reason to stop and inspect, not to delete a working installation.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Install the supported Varnish engine privately</span></span><br />
From the extracted guide folder, run:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo python3 setup-engine.py</code></div></div><br />
The script fetches the official vendor repository key, verifies its signed release metadata, verifies the package index checksum, then verifies the selected package checksum. It stages Varnish 9.1.0-2~jammy under the dedicated lab root using dpkg-deb extraction. It does not register a system package, start the distribution's default service or take over an existing listener.<br />
<br />
Read the result: repository_signature_valid must be true and the version output must identify Varnish 9.1.0. This version was supported when this guide was checked. Recheck the official supported-release list when reproducing the exercise later; a pinned example is not an automatic security-update mechanism. Package extraction here intentionally keeps the panel's services independent.<br />
<br />
Do not install the older Varnish 6.6.1 package used in our first synthetic addon benchmark just to match its screenshots. This WordPress exercise uses a newer, separately staged engine.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Prepare a separate WordPress application and database</span></span><br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo python3 setup-wordpress.py</code></div></div><br />
This downloads WordPress from wordpress.org, verifies its core file checksums against the WordPress API, and prepares a new application under the dedicated lab root. It creates only the named lab database af_wp_varnish_20261020 and a database user restricted to that database. To do this, it reads aaPanel's existing stored MySQL root credential locally; it does not print or send that credential to a website.<br />
<br />
The script generates new random lab passwords and salts. The generated WordPress login details stay in the root-readable private-users.json on the VPS. Do not attach that file, wp-config.php or admin.secret to a support post. The lab disables outgoing WordPress mail and scheduled cron requests. Existing WordPress databases and users are not reused.<br />
<br />
The setup result should report installed=true and the actual WordPress version. Our downloaded and verified version was 7.1.3. The script intentionally refuses to overwrite an existing configuration or an already-named database; resolve a failed/partial exercise by inspecting that dedicated lab, not by repeatedly rerunning setup blindly.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Generate and validate the isolated routing</span></span><br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo install -m 0644 runtime.py /opt/af-wp-varnish-20261020/runtime.py
sudo python3 /opt/af-wp-varnish-20261020/runtime.py prepare
sudo python3 /opt/af-wp-varnish-20261020/runtime.py start</code></div></div><br />
The start action validates Nginx and compiles VCL before starting the separate processes. The paths are:<br />
- 127.0.0.1:18190: the front-end Nginx listener.<br />
- 127.0.0.1:18192: Varnish cache.<br />
- 127.0.0.1:18191: the origin Nginx, connected to aaPanel's PHP 8.5 socket and this WordPress installation.<br />
- 127.0.0.1:18193: authenticated Varnish management. Its secret stays in the dedicated root; do not expose this listener.<br />
<br />
The example allocates 64 MiB cache storage and small lab thread pools. Those are exercise settings, not production tuning recommendations. In this private example Varnish drops privileges to nobody/nogroup; a production service needs its own managed identity and lifecycle. No startup-on-reboot service is installed here.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Understand the WordPress configuration</span></span><br />
WordPress is configured for <a href="http://127.0.0.1:18190" target="_blank" rel="noopener" class="mycode_url">http://127.0.0.1:18190</a>. The small MU plugin added by setup explicitly permits short public caching only for anonymous front-page and post responses without query parameters. It does not mark every PHP response public.<br />
<br />
The VCL passes requests with any cookie or Authorization header, non-GET/HEAD methods, queries, encoded paths and common WordPress administration/login/REST/cron/comment paths. Common cart, checkout and account paths also bypass. Responses with Set-Cookie, private/no-store/no-cache, errors or no positive explicitly public lifetime are not cached. Cached responses are capped at 60 seconds.<br />
<br />
This conservative policy means a logged-in visitor bypasses even a normally public home page. Do not strip login or cart cookies to manufacture a better hit rate. Custom plugins, translated store paths, password-protected content, forms and personalized routes require application-specific review. WooCommerce was not installed in this test; the presence of cart-path exclusions is not a WooCommerce compatibility certification.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. Verify a first MISS and a repeat HIT</span></span><br />
Run these on the VPS, without browser cookies:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl -sS -D - -o /dev/null http://127.0.0.1:18190/
curl -sS -D - -o /dev/null http://127.0.0.1:18190/</code></div></div><br />
Check HTTP 200 and X-AF-WP-Cache. A new eligible page should be MISS first and HIT when repeated before expiry. If another test already filled it, it may already be HIT. BYPASS means the request or response was excluded; it is not automatically an error. These diagnostic headers belong to this guide's configuration, not to every Varnish deployment.<br />
<br />
To view the actual WordPress lab from your computer, create an SSH tunnel in a local terminal using your normal SSH account:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>ssh -L 18190:127.0.0.1:18190 YOUR_SSH_USER@YOUR_VPS</code></div></div>Keep that tunnel open, then open <a href="http://127.0.0.1:18190/" target="_blank" rel="noopener" class="mycode_url">http://127.0.0.1:18190/</a> locally. If your local port is busy, resolve the conflict first; these example URLs and WordPress settings use the same port. There is no need to expose the remote lab to the internet.<br />
<br />
<img src="https://adminsforum.com/attachment.php?aid=401" loading="lazy"  alt="[Image: attachment.php?aid=401]" class="mycode_img" /><br />
<span style="font-style: italic;" class="mycode_i">Original screenshot of the actual WordPress installation viewed through a private SSH tunnel.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">8. Verify private requests and two-user isolation</span></span><br />
Run the provided validation script from the extracted guide folder:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo python3 verify-wordpress.py</code></div></div><br />
It uses the generated disposable users, creates a private session-check endpoint, changes the demonstration post and verifies the configured cache path. It does not benchmark a customer's site. Our recorded results were:<br />
- Anonymous home: 200 MISS, then 200 HIT.<br />
- Cookie, Authorization, login, REST, search query and POST requests: BYPASS.<br />
- Missing page: 404 BYPASS; anonymous private session endpoint: 401 BYPASS.<br />
- Two real WordPress users: each received its own identity and nonce; both logged-in home requests bypassed.<br />
- Changed public content: the older cached copy remained until manual invalidation, then the new copy returned MISS followed by HIT.<br />
- Public HTTP PURGE: 405 rejected.<br />
<br />
Separate follow-up checks also verified expiry after the 60-second window and a restart of the isolated stack. These are functional application checks. We did not run a new WordPress speed benchmark and do not apply the earlier synthetic response-time percentages to this site.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">9. Invalidate changed content</span></span><br />
This example does not install automatic WordPress purge hooks. For the exact home-page URL in this single-host test instance, use the private management interface:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo env LD_LIBRARY_PATH=/opt/af-wp-varnish-20261020/engine/usr/lib:/opt/af-wp-varnish-20261020/engine/usr/lib/x86_64-linux-gnu /opt/af-wp-varnish-20261020/engine/usr/bin/varnishadm -T 127.0.0.1:18193 -S /opt/af-wp-varnish-20261020/admin.secret ban 'req.url == /'</code></div></div><br />
This management command adds an exact-URL ban for / in this dedicated instance; it is not a whole-site purge or a recursive wildcard. Repeat the curl checks to refill and verify the updated response. Other changed URLs need their own invalidation, and the public HTTP PURGE method remains disabled. Never treat editing a WordPress post as proof that every cache layer was cleared.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">10. Stop the lab and understand the production boundary</span></span><br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>sudo python3 /opt/af-wp-varnish-20261020/runtime.py stop</code></div></div>This stops only the checked lab process IDs. The WordPress files, separate database, generated credentials and staged engine remain for inspection. There is no automatic destructive cleanup.<br />
<br />
Our existing registered aaPanel vhost hashes stayed unchanged. This exercise did not test public HTTPS, WooCommerce, a real-domain aaPanel vhost adapter, reboot persistence, panel-generated config changes, certificate renewal or live-site uninstall. Connecting an existing domain needs a separately validated integration with its actual routing, trusted TLS forwarding, backups and rollback. Do not move a working site's ports or replace its aaPanel-generated configuration using these loopback examples.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Related:</span> <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">Addon preview controls and exclusions</a>; <a href="https://adminsforum.com/Thread-guide-fine-tune-varnish-cache-hit-rate-memory-and-troubleshooting" target="_blank" rel="noopener" class="mycode_url">cache tuning and troubleshooting</a>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Primary references:</span> <a href="https://www.varnish.org/docs/install-guide/install-debian-ubuntu/" target="_blank" rel="noopener" class="mycode_url">Varnish's official Ubuntu installation source</a>; <a href="https://www.varnish.org/releases/index.html" target="_blank" rel="noopener" class="mycode_url">supported Varnish releases</a>; <a href="https://developer.wordpress.org/advanced-administration/performance/optimization/" target="_blank" rel="noopener" class="mycode_url">WordPress performance and caching guidance</a>.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Copyright AdminsForum | adminsforum.com. Original lab evidence; scope and limitations are stated above.</span><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=400" target="_blank" title="">wordpress-varnish-architecture-20261020.png</a> (Size: 123.21 KB / Downloads: 21)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=401" target="_blank" title="">wordpress-varnish-site-20261020.jpg</a> (Size: 109 KB / Downloads: 20)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Fine-Tune Varnish Cache: Hit Rate, Memory and Troubleshooting]]></title>
			<link>https://adminsforum.com/Thread-guide-fine-tune-varnish-cache-hit-rate-memory-and-troubleshooting</link>
			<pubDate>Tue, 20 Oct 2026 15:31:53 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-fine-tune-varnish-cache-hit-rate-memory-and-troubleshooting</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Measured tuning workflow for Varnish Cache by Adminforum 0.5.0 lab preview. Reviewed 20 October 2026.</span><br />
<br />
Fine-tuning starts with correct content and repeatable measurements. A high hit percentage is not useful if someone receives the wrong account page, sees stale prices or loses access to a website. This guide explains the observations available now and separates them from settings planned for a later release.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Start here:</span> <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">Configuration, templates and exclusions walkthrough</a>.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Know which settings are adjustable</span></span><br />
In the current addon you can select a path template, add exclusions, enable or disable fixture caching, purge one exact URL and read the available counters/logs.<br />
<br />
Cache allocation is fixed at 32 MiB. The maximum positive public-response lifetime is 60 seconds. Grace is explicitly zero. There is no memory, TTL, grace, worker-thread or timeout editor in this release. These values describe the synthetic fixture; they are not recommended production settings. Do not edit generated VCL or daemon arguments behind the addon and assume it will retain or validate those edits.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Record a baseline before changing policy</span></span><br />
Use a repeatable, anonymous public page and a consistent client, concurrency and request headers. Record direct responses, cold misses and prefilled warm hits separately. Include errors and p95, not just the fastest response. Keep PHP/database/CDN changes out of the comparison so the cause is clear.<br />
<br />
Our <a href="https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results" target="_blank" rel="noopener" class="mycode_url">before-and-after lab report</a> measured 1,440 successful requests. At concurrency 1, direct mean was 1.707 ms, cold MISS 2.651 ms and warm HIT 0.896 ms. At concurrency 4, direct mean was 5.906 ms, cold MISS 6.671 ms and warm HIT 3.350 ms. Compare within the same concurrency group. Those tiny loopback timings are not browser load times or production capacity estimates.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Diagnose low hit rate before allocating more memory</span></span><br />
Refresh Overview, then inspect Access Logs. Classify the outcome:<br />
- Mostly BYPASS: inspect cookies, authorization, private-response headers, query strings and exclusions. Extra memory will not turn an intentionally private response into a cacheable page.<br />
- Mostly MISS on distinct URLs: new objects need an initial fill. Repeating the same eligible URL is the first useful check.<br />
- MISS after expiry, a purge or a rules update: this may be expected. Rules updates create a new cache namespace.<br />
- Repeated MISS on the same URL before expected expiry: check response eligibility, variant headers, actual host/scheme, intervening restarts and evictions.<br />
- No request rows: confirm caching is enabled, the request reaches the test instance and logs were refreshed. Direct routing does not appear in Varnish's request sample.<br />
<br />
The displayed hit ratio uses HIT / (HIT + MISS), excluding bypassed traffic. For example, 80 hits and 20 misses gives 80%, even if another 900 requests bypassed. Do not describe that figure as the percentage of all website visitors served from cache. Counters reset when the Varnish child restarts; compare counter differences over a known interval rather than unrelated totals.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Read memory and eviction figures correctly</span></span><br />
Open Storage after starting the fixture. Read allocated storage, limit, cached objects and evictions together.<br />
<br />
<img src="https://adminsforum.com/attachment.php?aid=399" loading="lazy"  alt="[Image: attachment.php?aid=399]" class="mycode_img" /><br />
<span style="font-style: italic;" class="mycode_i">These figures belong to the dedicated test instance. They are not per-domain disk usage.</span><br />
<br />
The 32 MiB cache allocation is not a cap on total process memory. Process RSS is shown separately and includes more than cached response bodies. Leave room for the operating system, PHP workers, database, webserver and Varnish overhead when planning a later deployment. Varnish's storage documentation explains the additional allocations and allocator overhead; choosing a cache size equal to all free RAM is not a sizing method.<br />
<br />
A growing eviction counter means objects have been evicted to make room. Record the increase during a representative workload. If useful frequently requested objects are evicted before reuse, capacity or the cached object mix deserves investigation. A single nonzero lifetime counter is not proof that the cache is too small. If objects expire before being reused, simply increasing capacity may not help.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Balance freshness with cache lifetime</span></span><br />
TTL is the period a cached object can normally remain fresh. A longer value can reduce origin fetches but can also keep old public content visible longer unless it is invalidated. Determine how quickly a changed article, price, availability or announcement must appear before choosing a policy.<br />
<br />
In this preview, successful explicitly public responses need a positive lifetime and are capped at 60 seconds. The addon does not give you a field to increase it. Test a changed public response with the exact-URL purge control and confirm that the next request gets the new content. A full-site purge and automatic WordPress invalidation are not implemented. Do not promise immediate updates across a whole site from a single-path purge.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Understand grace before requesting it</span></span><br />
Varnish supports grace: eligible stale content can be served for an additional period while a fresh version is fetched. Keep has a different purpose: retaining an object for conditional revalidation. These are content-freshness choices, not universal speed switches. This addon currently sets grace to zero; it does not expose or validate a production stale-content policy. Consider such a feature only after its behavior and acceptable staleness have been tested for the application.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. Tune the origin when misses are slow</span></span><br />
If direct and MISS requests are slow while HIT is fast, investigate the work still required at the origin. Correlate the same time window with PHP slow requests, database slow queries, CPU, available RAM, swap activity and storage I/O. A Varnish HIT avoids that work for an eligible cached response; it does not repair slow authenticated pages or unsafe application queries.<br />
<br />
Do not apply a universal PHP worker count or database buffer size from this guide. Measure the application's worker memory, database working set and server capacity first. Make one change at a time and compare the same workload, including errors. If direct requests are already fast, cold-cache overhead may exceed any benefit for a rarely reused URL.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">8. Use errors and logs to choose the next action</span></span><br />
- 4xx: check the requested path, access restrictions and application response. Do not disable private-page rules to hide an authorization error.<br />
- 5xx: check the origin and relevant web/PHP error logs, then correlate with addon Activity. The addon Error Logs tab is a sample, not the full server log.<br />
- Online - fallback / Needs attention: disable fixture caching, verify direct routing, then investigate the cache service. Availability and active caching are separate checks.<br />
- Template did not save: read the validation message, correct unsupported path syntax, then apply and refresh. Do not assume a failed save changed the active policy.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">9. Re-test privacy after each policy change</span></span><br />
Check anonymous public pages, logged-in pages, two independent test users, cart/account/checkout pages, APIs, query-string URLs and responses that set cookies. Use disposable sessions and never publish their headers. Our existing fixture checks prove synthetic bypass behavior; real WordPress/WooCommerce and Laravel session isolation remain release gates. Template names alone are not proof of compatibility.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">10. Keep a small change record</span></span><br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>Date and component versions:
Test scope and application:
One setting changed:
Direct / cold MISS / warm HIT:
Requests, concurrency, errors, mean and p95:
HIT/MISS/BYPASS counts and interval:
Objects, allocation, eviction increase and RSS:
Privacy and content-update checks:
Rollback result:</code></div></div><br />
Retain the change only when it improves the intended workload without correctness or availability regressions. Stop the isolated test website after the exercise. Public deployment also needs a supported engine, tested installer, real-site routing and recovery; this preview is not that release.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">References:</span> <a href="https://www.varnish.org/docs/users-guide/storage-backends/" target="_blank" rel="noopener" class="mycode_url">Varnish storage backends</a>; <a href="https://www.varnish.org/docs/users-guide/vcl-grace/" target="_blank" rel="noopener" class="mycode_url">grace and keep</a>.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Original AdminsForum lab screenshot. Copyright AdminsForum | adminsforum.com.</span><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=399" target="_blank" title="">varnish-guide-storage-20261020.jpg</a> (Size: 103.83 KB / Downloads: 17)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Measured tuning workflow for Varnish Cache by Adminforum 0.5.0 lab preview. Reviewed 20 October 2026.</span><br />
<br />
Fine-tuning starts with correct content and repeatable measurements. A high hit percentage is not useful if someone receives the wrong account page, sees stale prices or loses access to a website. This guide explains the observations available now and separates them from settings planned for a later release.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Start here:</span> <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">Configuration, templates and exclusions walkthrough</a>.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Know which settings are adjustable</span></span><br />
In the current addon you can select a path template, add exclusions, enable or disable fixture caching, purge one exact URL and read the available counters/logs.<br />
<br />
Cache allocation is fixed at 32 MiB. The maximum positive public-response lifetime is 60 seconds. Grace is explicitly zero. There is no memory, TTL, grace, worker-thread or timeout editor in this release. These values describe the synthetic fixture; they are not recommended production settings. Do not edit generated VCL or daemon arguments behind the addon and assume it will retain or validate those edits.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Record a baseline before changing policy</span></span><br />
Use a repeatable, anonymous public page and a consistent client, concurrency and request headers. Record direct responses, cold misses and prefilled warm hits separately. Include errors and p95, not just the fastest response. Keep PHP/database/CDN changes out of the comparison so the cause is clear.<br />
<br />
Our <a href="https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results" target="_blank" rel="noopener" class="mycode_url">before-and-after lab report</a> measured 1,440 successful requests. At concurrency 1, direct mean was 1.707 ms, cold MISS 2.651 ms and warm HIT 0.896 ms. At concurrency 4, direct mean was 5.906 ms, cold MISS 6.671 ms and warm HIT 3.350 ms. Compare within the same concurrency group. Those tiny loopback timings are not browser load times or production capacity estimates.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Diagnose low hit rate before allocating more memory</span></span><br />
Refresh Overview, then inspect Access Logs. Classify the outcome:<br />
- Mostly BYPASS: inspect cookies, authorization, private-response headers, query strings and exclusions. Extra memory will not turn an intentionally private response into a cacheable page.<br />
- Mostly MISS on distinct URLs: new objects need an initial fill. Repeating the same eligible URL is the first useful check.<br />
- MISS after expiry, a purge or a rules update: this may be expected. Rules updates create a new cache namespace.<br />
- Repeated MISS on the same URL before expected expiry: check response eligibility, variant headers, actual host/scheme, intervening restarts and evictions.<br />
- No request rows: confirm caching is enabled, the request reaches the test instance and logs were refreshed. Direct routing does not appear in Varnish's request sample.<br />
<br />
The displayed hit ratio uses HIT / (HIT + MISS), excluding bypassed traffic. For example, 80 hits and 20 misses gives 80%, even if another 900 requests bypassed. Do not describe that figure as the percentage of all website visitors served from cache. Counters reset when the Varnish child restarts; compare counter differences over a known interval rather than unrelated totals.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Read memory and eviction figures correctly</span></span><br />
Open Storage after starting the fixture. Read allocated storage, limit, cached objects and evictions together.<br />
<br />
<img src="https://adminsforum.com/attachment.php?aid=399" loading="lazy"  alt="[Image: attachment.php?aid=399]" class="mycode_img" /><br />
<span style="font-style: italic;" class="mycode_i">These figures belong to the dedicated test instance. They are not per-domain disk usage.</span><br />
<br />
The 32 MiB cache allocation is not a cap on total process memory. Process RSS is shown separately and includes more than cached response bodies. Leave room for the operating system, PHP workers, database, webserver and Varnish overhead when planning a later deployment. Varnish's storage documentation explains the additional allocations and allocator overhead; choosing a cache size equal to all free RAM is not a sizing method.<br />
<br />
A growing eviction counter means objects have been evicted to make room. Record the increase during a representative workload. If useful frequently requested objects are evicted before reuse, capacity or the cached object mix deserves investigation. A single nonzero lifetime counter is not proof that the cache is too small. If objects expire before being reused, simply increasing capacity may not help.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Balance freshness with cache lifetime</span></span><br />
TTL is the period a cached object can normally remain fresh. A longer value can reduce origin fetches but can also keep old public content visible longer unless it is invalidated. Determine how quickly a changed article, price, availability or announcement must appear before choosing a policy.<br />
<br />
In this preview, successful explicitly public responses need a positive lifetime and are capped at 60 seconds. The addon does not give you a field to increase it. Test a changed public response with the exact-URL purge control and confirm that the next request gets the new content. A full-site purge and automatic WordPress invalidation are not implemented. Do not promise immediate updates across a whole site from a single-path purge.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Understand grace before requesting it</span></span><br />
Varnish supports grace: eligible stale content can be served for an additional period while a fresh version is fetched. Keep has a different purpose: retaining an object for conditional revalidation. These are content-freshness choices, not universal speed switches. This addon currently sets grace to zero; it does not expose or validate a production stale-content policy. Consider such a feature only after its behavior and acceptable staleness have been tested for the application.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. Tune the origin when misses are slow</span></span><br />
If direct and MISS requests are slow while HIT is fast, investigate the work still required at the origin. Correlate the same time window with PHP slow requests, database slow queries, CPU, available RAM, swap activity and storage I/O. A Varnish HIT avoids that work for an eligible cached response; it does not repair slow authenticated pages or unsafe application queries.<br />
<br />
Do not apply a universal PHP worker count or database buffer size from this guide. Measure the application's worker memory, database working set and server capacity first. Make one change at a time and compare the same workload, including errors. If direct requests are already fast, cold-cache overhead may exceed any benefit for a rarely reused URL.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">8. Use errors and logs to choose the next action</span></span><br />
- 4xx: check the requested path, access restrictions and application response. Do not disable private-page rules to hide an authorization error.<br />
- 5xx: check the origin and relevant web/PHP error logs, then correlate with addon Activity. The addon Error Logs tab is a sample, not the full server log.<br />
- Online - fallback / Needs attention: disable fixture caching, verify direct routing, then investigate the cache service. Availability and active caching are separate checks.<br />
- Template did not save: read the validation message, correct unsupported path syntax, then apply and refresh. Do not assume a failed save changed the active policy.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">9. Re-test privacy after each policy change</span></span><br />
Check anonymous public pages, logged-in pages, two independent test users, cart/account/checkout pages, APIs, query-string URLs and responses that set cookies. Use disposable sessions and never publish their headers. Our existing fixture checks prove synthetic bypass behavior; real WordPress/WooCommerce and Laravel session isolation remain release gates. Template names alone are not proof of compatibility.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">10. Keep a small change record</span></span><br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>Date and component versions:
Test scope and application:
One setting changed:
Direct / cold MISS / warm HIT:
Requests, concurrency, errors, mean and p95:
HIT/MISS/BYPASS counts and interval:
Objects, allocation, eviction increase and RSS:
Privacy and content-update checks:
Rollback result:</code></div></div><br />
Retain the change only when it improves the intended workload without correctness or availability regressions. Stop the isolated test website after the exercise. Public deployment also needs a supported engine, tested installer, real-site routing and recovery; this preview is not that release.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">References:</span> <a href="https://www.varnish.org/docs/users-guide/storage-backends/" target="_blank" rel="noopener" class="mycode_url">Varnish storage backends</a>; <a href="https://www.varnish.org/docs/users-guide/vcl-grace/" target="_blank" rel="noopener" class="mycode_url">grace and keep</a>.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Original AdminsForum lab screenshot. Copyright AdminsForum | adminsforum.com.</span><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=399" target="_blank" title="">varnish-guide-storage-20261020.jpg</a> (Size: 103.83 KB / Downloads: 17)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Configure Varnish Cache in aaPanel: Controls and Exclusions]]></title>
			<link>https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions</link>
			<pubDate>Tue, 20 Oct 2026 15:30:36 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Updated 24 October 2026 | Varnish Cache by Adminforum 0.6.0-lab | Verified scope: one audited WordPress/Nginx website.</span><br />
<br />
The current lab build caches eligible public WordPress homepage/post responses for up to <span style="font-weight: bold;" class="mycode_b">30 seconds</span>. It uses a dedicated <span style="font-weight: bold;" class="mycode_b">32 MiB</span> cache instance for the audited website. These are the tested native lab values, not user-adjustable controls demonstrated by this guide.<br />
<br />
The WordPress template should be selected when adding the site. This native build has fixed audited exclusions. Custom exclusion editing, framework switching and the isolated fixture's settings must not be presented as working native-site controls.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Understand the status</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish: active</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> Managed process and site route are verified<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Check anonymous public content and your application workflows.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">HIT</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> This response was served from a reusable cached object<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Confirm it is public content and contains no user-specific information.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MISS</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> Varnish fetched a cacheable response from the origin<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Repeat the same anonymous request before its lifetime expires.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">BYPASS</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> The request or response was deliberately not reused from cache<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Expected for private sessions, writes and protected paths.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">DIRECT</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> The native origin served the response without Varnish<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Expected while disabled; investigate if caching should be enabled.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Direct fallback / needs attention</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> The site is online through its origin but cache verification failed<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Inspect the managed service and recover or disable through the addon.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Not verified / configuration needs review</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> The addon cannot establish a trustworthy state<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Refresh and inspect the conflict before making changes.<br />
<br />
A low hit rate on a quiet lab is not a tuning failure by itself. Health checks, deliberate privacy tests, recently purged objects and cold requests affect the ratio.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Verify a public page</span></span><br />
<br />
Use a published post that is public and not password-protected. For this lab, replace your-public-post with an existing public test post:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl -sS -D - -o /dev/null https://blog.adminslab.com/your-public-post/
curl -sS -D - -o /dev/null https://blog.adminslab.com/your-public-post/</code></div></div><br />
Inspect X-AF-Cache. After an exact-path purge or a genuinely cold request, the first response should normally be MISS and the next HIT. Use GET as above; do not assume HEAD exercises exactly the same application behavior. These commands retain certificate verification and send no login cookies.<br />
<br />
The status request used to verify a purge can immediately warm the homepage again. A subsequent homepage HIT therefore does not prove that purge failed. Check changed content or use an exact public post path for a controlled cold test.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Confirm private requests bypass</span></span><br />
<br />
The current policy bypasses requests with cookies, Authorization, query strings and writes. WordPress login/admin/API routes and common cart, checkout and account paths are excluded. Private/no-store responses and responses with Set-Cookie must not become reusable public objects.<br />
<br />
Repeat the public-post check with a disposable cookie:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl -sS -D - -o /dev/null &#92;
  -H 'Cookie: af_test=private' &#92;
  https://blog.adminslab.com/your-public-post/</code></div></div><br />
Expect BYPASS. Then test real sign-in and user-specific pages with two separate accounts. In our application test, both accounts completed real WordPress login requests and received their own uncached profile pages, including during 12 interleaved requests.<br />
<br />
The /cart/, /checkout/ and /my-account/ paths bypassed in this lab. <span style="font-weight: bold;" class="mycode_b">WooCommerce was not installed.</span> This is route-exclusion evidence, not proof that a real shop's sessions, cart contents, payments, custom URLs or extensions work correctly. A live WooCommerce journey remains a release gate.<br />
<br />
Varnish's general request/cache flow is documented in the <a href="https://www.varnish.org/docs/tutorials/varnish-configuration-language-vcl/" target="_blank" rel="noopener" class="mycode_url">official VCL tutorial</a>; the values and exclusions above describe this addon build.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Verify automatic invalidation</span></span><br />
<br />
1. Warm a disposable public post and confirm HIT.<br />
2. Update its public content through WordPress.<br />
3. Request the same post anonymously.<br />
4. Confirm the updated content is visible immediately and the old content is absent.<br />
5. Repeat and confirm HIT on the updated version.<br />
6. Edit an approved disposable comment and repeat the cache check.<br />
<br />
Our current run used WordPress's application APIs to publish/update/trash a disposable post and edit a real comment. The update invalidated the old cached content automatically, and a successful purge was recorded by the native integration. A browser editor and public comment-form journey were not exercised in this run.<br />
<br />
Use <span style="font-weight: bold;" class="mycode_b">Purge site cache</span> in the Dashboard for a manual site purge. Its administration is private and authenticated. Public PURGE and BAN requests returned HTTP 405 during testing, and an invalid key at the private purge interface was rejected.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Read the Dashboard correctly</span></span><br />
<br />
- **Requests, hits, misses and pass requests:** cumulative counters for the dedicated Varnish child. Pass is read from its own counter; it is not calculated by subtracting hits and misses.<br />
- **Hit rate:** HIT / (HIT + MISS), excluding pass requests.<br />
- **Live traffic:** rates calculated from successive counter observations. The Live button refreshes about every 10 seconds while the visible Dashboard is open and can be paused.<br />
- **Memory:** allocated cache storage versus its capacity. Process RSS is reported separately and includes overhead/shared pages.<br />
- **Service health:** version, cache uptime, origin requests, backend connection failures and cumulative session connections. Session connections are not the current number of visitors.<br />
- **Managed website:** selected hostname, WordPress template, Nginx assignment and verified cache status.<br />
<br />
The chart retains up to 30 minutes of readings in the open browser session. It is not persistent server history. A restart, missing counter or long observation gap breaks the line. Native static-file responses and direct fallback traffic are outside these Varnish counters. Internal health requests are included.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Tune from evidence</span></span><br />
<br />
Before increasing memory or cache lifetime, determine whether misses come from expiry, deliberate exclusions, purges or insufficient storage. Compare the same public content, PHP configuration and request method. Keep privacy checks in place while measuring performance.<br />
<br />
The lab's 32 MiB storage and 30-second lifetime are a controlled test configuration. The current native controls do not offer demonstrated production tuning for these values. Do not edit managed files to experiment: an external edit can trigger a conflict and make automatic recovery unsafe.<br />
<br />
A cold MISS still runs the origin application. Varnish improves reusable public responses; it does not replace PHP/database optimization or make logged-in account pages cacheable.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. Troubleshoot and recover</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Every response bypasses:</span> Cookies, query strings, authentication, protected paths, private Cache-Control and Set-Cookie.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">A public post never becomes HIT:</span> Confirm it is eligible public post content, check response headers, then test the same path anonymously before expiry.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Old content remains after editing:</span> Verify the native MU integration is installed, inspect its last purge result, and use manual purge. Check for another cache/CDN layer.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Cache unavailable but site works:</span> Confirm DIRECT fallback and the managed service state. Use the addon recovery/Enable action after reviewing the failure.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Native configuration changed:</span> Preserve the newer configuration and investigate the conflict. Do not restore an old file blindly.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Native Logs or Activity appears unavailable:</span> Those views are not yet connected for the native site. Use the site's aaPanel logs and the operator's private service/routing evidence.<br />
<br />
For this lab only, the operator can inspect the managed service without changing it:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>systemctl status af-varnish-native-11.service --no-pager
journalctl -u af-varnish-native-11.service -n 50 --no-pager</code></div></div><br />
Review errors before sharing excerpts; do not publish keys, cookies, database credentials or private request details. Keep the original configuration and private transaction journals available for recovery.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Original AdminsForum lab work. Copyright AdminsForum | adminsforum.com.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Guide series:</span> <a href="https://adminsforum.com/Thread-guide-install-varnish-cache-in-aapanel-closed-lab-preview" target="_blank" rel="noopener" class="mycode_url">Installation</a> | <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">WordPress configuration</a> | <a href="https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results" target="_blank" rel="noopener" class="mycode_url">Measured results</a><br />
<br />
<span style="font-style: italic;" class="mycode_i">Historical attachments dated 20 October below show the older isolated fixture interface. The instructions above describe the native WordPress lab build verified on 24 October.</span><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=395" target="_blank" title="">varnish-guide-overview-20261020.jpg</a> (Size: 112.28 KB / Downloads: 27)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=396" target="_blank" title="">varnish-guide-exclusions-20261020.jpg</a> (Size: 138.26 KB / Downloads: 97)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=397" target="_blank" title="">varnish-guide-controls-20261020.jpg</a> (Size: 104.63 KB / Downloads: 24)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=398" target="_blank" title="">varnish-guide-logs-20261020.jpg</a> (Size: 118.15 KB / Downloads: 23)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Updated 24 October 2026 | Varnish Cache by Adminforum 0.6.0-lab | Verified scope: one audited WordPress/Nginx website.</span><br />
<br />
The current lab build caches eligible public WordPress homepage/post responses for up to <span style="font-weight: bold;" class="mycode_b">30 seconds</span>. It uses a dedicated <span style="font-weight: bold;" class="mycode_b">32 MiB</span> cache instance for the audited website. These are the tested native lab values, not user-adjustable controls demonstrated by this guide.<br />
<br />
The WordPress template should be selected when adding the site. This native build has fixed audited exclusions. Custom exclusion editing, framework switching and the isolated fixture's settings must not be presented as working native-site controls.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Understand the status</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish: active</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> Managed process and site route are verified<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Check anonymous public content and your application workflows.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">HIT</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> This response was served from a reusable cached object<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Confirm it is public content and contains no user-specific information.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MISS</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> Varnish fetched a cacheable response from the origin<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Repeat the same anonymous request before its lifetime expires.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">BYPASS</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> The request or response was deliberately not reused from cache<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Expected for private sessions, writes and protected paths.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">DIRECT</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> The native origin served the response without Varnish<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Expected while disabled; investigate if caching should be enabled.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Direct fallback / needs attention</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> The site is online through its origin but cache verification failed<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Inspect the managed service and recover or disable through the addon.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Not verified / configuration needs review</span><br />
<span style="font-weight: bold;" class="mycode_b">Meaning:</span> The addon cannot establish a trustworthy state<br />
<span style="font-weight: bold;" class="mycode_b">What to do:</span> Refresh and inspect the conflict before making changes.<br />
<br />
A low hit rate on a quiet lab is not a tuning failure by itself. Health checks, deliberate privacy tests, recently purged objects and cold requests affect the ratio.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Verify a public page</span></span><br />
<br />
Use a published post that is public and not password-protected. For this lab, replace your-public-post with an existing public test post:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl -sS -D - -o /dev/null https://blog.adminslab.com/your-public-post/
curl -sS -D - -o /dev/null https://blog.adminslab.com/your-public-post/</code></div></div><br />
Inspect X-AF-Cache. After an exact-path purge or a genuinely cold request, the first response should normally be MISS and the next HIT. Use GET as above; do not assume HEAD exercises exactly the same application behavior. These commands retain certificate verification and send no login cookies.<br />
<br />
The status request used to verify a purge can immediately warm the homepage again. A subsequent homepage HIT therefore does not prove that purge failed. Check changed content or use an exact public post path for a controlled cold test.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Confirm private requests bypass</span></span><br />
<br />
The current policy bypasses requests with cookies, Authorization, query strings and writes. WordPress login/admin/API routes and common cart, checkout and account paths are excluded. Private/no-store responses and responses with Set-Cookie must not become reusable public objects.<br />
<br />
Repeat the public-post check with a disposable cookie:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl -sS -D - -o /dev/null &#92;
  -H 'Cookie: af_test=private' &#92;
  https://blog.adminslab.com/your-public-post/</code></div></div><br />
Expect BYPASS. Then test real sign-in and user-specific pages with two separate accounts. In our application test, both accounts completed real WordPress login requests and received their own uncached profile pages, including during 12 interleaved requests.<br />
<br />
The /cart/, /checkout/ and /my-account/ paths bypassed in this lab. <span style="font-weight: bold;" class="mycode_b">WooCommerce was not installed.</span> This is route-exclusion evidence, not proof that a real shop's sessions, cart contents, payments, custom URLs or extensions work correctly. A live WooCommerce journey remains a release gate.<br />
<br />
Varnish's general request/cache flow is documented in the <a href="https://www.varnish.org/docs/tutorials/varnish-configuration-language-vcl/" target="_blank" rel="noopener" class="mycode_url">official VCL tutorial</a>; the values and exclusions above describe this addon build.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Verify automatic invalidation</span></span><br />
<br />
1. Warm a disposable public post and confirm HIT.<br />
2. Update its public content through WordPress.<br />
3. Request the same post anonymously.<br />
4. Confirm the updated content is visible immediately and the old content is absent.<br />
5. Repeat and confirm HIT on the updated version.<br />
6. Edit an approved disposable comment and repeat the cache check.<br />
<br />
Our current run used WordPress's application APIs to publish/update/trash a disposable post and edit a real comment. The update invalidated the old cached content automatically, and a successful purge was recorded by the native integration. A browser editor and public comment-form journey were not exercised in this run.<br />
<br />
Use <span style="font-weight: bold;" class="mycode_b">Purge site cache</span> in the Dashboard for a manual site purge. Its administration is private and authenticated. Public PURGE and BAN requests returned HTTP 405 during testing, and an invalid key at the private purge interface was rejected.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Read the Dashboard correctly</span></span><br />
<br />
- **Requests, hits, misses and pass requests:** cumulative counters for the dedicated Varnish child. Pass is read from its own counter; it is not calculated by subtracting hits and misses.<br />
- **Hit rate:** HIT / (HIT + MISS), excluding pass requests.<br />
- **Live traffic:** rates calculated from successive counter observations. The Live button refreshes about every 10 seconds while the visible Dashboard is open and can be paused.<br />
- **Memory:** allocated cache storage versus its capacity. Process RSS is reported separately and includes overhead/shared pages.<br />
- **Service health:** version, cache uptime, origin requests, backend connection failures and cumulative session connections. Session connections are not the current number of visitors.<br />
- **Managed website:** selected hostname, WordPress template, Nginx assignment and verified cache status.<br />
<br />
The chart retains up to 30 minutes of readings in the open browser session. It is not persistent server history. A restart, missing counter or long observation gap breaks the line. Native static-file responses and direct fallback traffic are outside these Varnish counters. Internal health requests are included.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Tune from evidence</span></span><br />
<br />
Before increasing memory or cache lifetime, determine whether misses come from expiry, deliberate exclusions, purges or insufficient storage. Compare the same public content, PHP configuration and request method. Keep privacy checks in place while measuring performance.<br />
<br />
The lab's 32 MiB storage and 30-second lifetime are a controlled test configuration. The current native controls do not offer demonstrated production tuning for these values. Do not edit managed files to experiment: an external edit can trigger a conflict and make automatic recovery unsafe.<br />
<br />
A cold MISS still runs the origin application. Varnish improves reusable public responses; it does not replace PHP/database optimization or make logged-in account pages cacheable.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. Troubleshoot and recover</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Every response bypasses:</span> Cookies, query strings, authentication, protected paths, private Cache-Control and Set-Cookie.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">A public post never becomes HIT:</span> Confirm it is eligible public post content, check response headers, then test the same path anonymously before expiry.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Old content remains after editing:</span> Verify the native MU integration is installed, inspect its last purge result, and use manual purge. Check for another cache/CDN layer.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Cache unavailable but site works:</span> Confirm DIRECT fallback and the managed service state. Use the addon recovery/Enable action after reviewing the failure.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Native configuration changed:</span> Preserve the newer configuration and investigate the conflict. Do not restore an old file blindly.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Native Logs or Activity appears unavailable:</span> Those views are not yet connected for the native site. Use the site's aaPanel logs and the operator's private service/routing evidence.<br />
<br />
For this lab only, the operator can inspect the managed service without changing it:<br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>systemctl status af-varnish-native-11.service --no-pager
journalctl -u af-varnish-native-11.service -n 50 --no-pager</code></div></div><br />
Review errors before sharing excerpts; do not publish keys, cookies, database credentials or private request details. Keep the original configuration and private transaction journals available for recovery.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Original AdminsForum lab work. Copyright AdminsForum | adminsforum.com.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Guide series:</span> <a href="https://adminsforum.com/Thread-guide-install-varnish-cache-in-aapanel-closed-lab-preview" target="_blank" rel="noopener" class="mycode_url">Installation</a> | <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">WordPress configuration</a> | <a href="https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results" target="_blank" rel="noopener" class="mycode_url">Measured results</a><br />
<br />
<span style="font-style: italic;" class="mycode_i">Historical attachments dated 20 October below show the older isolated fixture interface. The instructions above describe the native WordPress lab build verified on 24 October.</span><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=395" target="_blank" title="">varnish-guide-overview-20261020.jpg</a> (Size: 112.28 KB / Downloads: 27)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=396" target="_blank" title="">varnish-guide-exclusions-20261020.jpg</a> (Size: 138.26 KB / Downloads: 97)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=397" target="_blank" title="">varnish-guide-controls-20261020.jpg</a> (Size: 104.63 KB / Downloads: 24)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=398" target="_blank" title="">varnish-guide-logs-20261020.jpg</a> (Size: 118.15 KB / Downloads: 23)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Varnish Cache Before and After: aaPanel Lab Test Results]]></title>
			<link>https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results</link>
			<pubDate>Tue, 20 Oct 2026 15:15:50 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Updated 24 October 2026 | Varnish Cache by Adminforum 0.6.0-lab | Verified scope: one audited WordPress/Nginx website.</span><br />
<br />
On 24 October 2026, the current managed WordPress/Nginx lab integration passed <span style="font-weight: bold;" class="mycode_b">38 application checks</span>, plus <span style="font-weight: bold;" class="mycode_b">3 installation-safeguard checks</span>. The current-source backend suite passed <span style="font-weight: bold;" class="mycode_b">161 tests</span>; the frontend suite passed <span style="font-weight: bold;" class="mycode_b">38 checks</span>. These are separate suites, not counts of independent websites or server modes.<br />
<br />
The website was left added and enabled after testing. The disposable application fixtures were moved to WordPress Trash, and the other Nginx/Apache website configuration files were unchanged. Postfix and Dovecot remained active; this checks service state, not end-to-end mail delivery.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Environment</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website:</span> blog.adminslab.com — isolated test site<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Operating system:</span> Ubuntu 22.04 VPS, 2 CPU cores, approximately 4 GiB RAM<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel:</span> 8.0.7<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Assigned website server:</span> Nginx 1.30.6<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP:</span> 8.5.12<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WordPress:</span> 7.1.3<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish:</span> 9.1.0<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Cache policy:</span> Public homepage/posts, up to 30 seconds; 32 MiB capacity<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WooCommerce:</span> Not installed<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Before and after response times</span></span><br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>Local verified HTTPS       Requests    Median ms     p95 ms
Direct WordPress                 30      142.298    171.835
Warm Varnish HIT                 30        7.772     12.075
Cold Varnish MISS                10      132.968    156.915</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Native WordPress, cache disabled</span><br />
<span style="font-weight: bold;" class="mycode_b">Requests:</span> 30<br />
<span style="font-weight: bold;" class="mycode_b">Expected response:</span> DIRECT<br />
<span style="font-weight: bold;" class="mycode_b">Median:</span> 142.298 ms<br />
<span style="font-weight: bold;" class="mycode_b">p95:</span> 171.835 ms<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish, warmed public post</span><br />
<span style="font-weight: bold;" class="mycode_b">Requests:</span> 30<br />
<span style="font-weight: bold;" class="mycode_b">Expected response:</span> HIT<br />
<span style="font-weight: bold;" class="mycode_b">Median:</span> 7.772 ms<br />
<span style="font-weight: bold;" class="mycode_b">p95:</span> 12.075 ms<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish, exact post purged before each request</span><br />
<span style="font-weight: bold;" class="mycode_b">Requests:</span> 10<br />
<span style="font-weight: bold;" class="mycode_b">Expected response:</span> MISS<br />
<span style="font-weight: bold;" class="mycode_b">Median:</span> 132.968 ms<br />
<span style="font-weight: bold;" class="mycode_b">p95:</span> 156.915 ms<br />
<br />
Warm-cache median complete response time was <span style="font-weight: bold;" class="mycode_b">94.5% lower</span> than the direct median in this sample. This is a local lab comparison, not a promise of the same reduction for visitors.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Measurement method</span></span><br />
<br />
The test requested the same newly published public WordPress post through verified HTTPS on the VPS's loopback connection using the real hostname. Every measured request opened a new connection and read the complete response; timings include TLS setup. Requests were sequential. The p95 uses the nearest-rank method.<br />
<br />
The direct phase disabled the managed route and verified the exact original configuration. The warm phase restored caching and warmed the public post before measuring. The cold phase purged that exact path before each request. Each measured response had to return HTTP 200 with the expected DIRECT, HIT or MISS marker. Dashboard live polling was paused during the measurements.<br />
<br />
This is <span style="font-weight: bold;" class="mycode_b">not</span> an internet-latency, browser-rendering, throughput, sustained-load or high-concurrency benchmark. Test order and normal server variation can affect results. The slightly lower cold-MISS median than direct does not establish that misses are faster; both execute the origin application and their small difference needs broader controlled measurements.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Application and privacy results</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Draft publication:</span> Anonymous draft request was unavailable; published post returned MISS then HIT.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Content update:</span> A real WordPress post update invalidated the old cached content automatically.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Comment edit:</span> Editing a stored approved comment invalidated the post cache.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Public response headers:</span> Cached public post did not carry Set-Cookie.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Two real accounts:</span> Both existing test readers logged in and received their own uncached profile pages.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Concurrent identity isolation:</span> 12 interleaved profile requests across two users and four workers retained the correct user identity. This is a small functional check, not a load benchmark.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Nonces:</span> The two profile pages had distinct nonces.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Exclusions:</span> Cookies, Authorization, search, REST API, admin, POST, cart/account/checkout paths bypassed.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Private content:</span> A new private post was not exposed anonymously or served as a HIT.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Purge protection:</span> Public PURGE/BAN were rejected; an invalid private purge key was rejected.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Trash invalidation:</span> Trashing the disposable public post removed its cached public content.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Coexistence:</span> Other checked Nginx/Apache vhost files stayed byte-identical; Nginx validation passed and mail services remained active.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Final state:</span> The managed cache remained enabled and verified active.<br />
<br />
The cart/account/checkout checks exercised excluded paths on a site without WooCommerce. They do <span style="font-weight: bold;" class="mycode_b">not</span> establish shopping-cart, payment or store-plugin compatibility.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation safeguards</span></span><br />
<br />
The installed control-file validation completed without changing the active public website route. Attempting uninstall while the native cache was configured returned the expected refusal. The plugin files and native route were preserved.<br />
<br />
This tests a guard, not a successful clean uninstall/reinstall. The current build still depends on the prepared lab runtime.<br />
<br />
Earlier on the same day, a separate <span style="font-weight: bold;" class="mycode_b">29-check managed lifecycle run</span> passed exact direct-route restoration, re-enable, stopped-cache fallback and recovery. Those earlier lifecycle results are distinct from the new 38-check application run; they should not be presented as newly retested behavior where it was not repeated.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">What remains before public beta</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">WordPress on this audited Nginx lab site:</span> Application and managed lifecycle evidence available<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Other Nginx sites / portable site onboarding:</span> Not validated; current target is restricted in code<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Native Apache, OpenLiteSpeed, Nginx + Apache, Nginx + OpenLiteSpeed:</span> Adapters/live compatibility not established<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mixed-engine cached websites:</span> Not established<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WooCommerce cart/session/payment journey:</span> Not tested; WooCommerce absent<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Browser editor and public comment submission:</span> Not exercised by this API-based application run<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Native access/error log views and persistent traffic history:</span> Not connected; live chart is a browser-session buffer<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Clean-server install, upgrade, successful uninstall/reinstall:</span> Not established by this run<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Reboot, certificate renewal, native engine/PHP switching:</span> Not exercised<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sustained traffic and resource-pressure testing:</span> Not performed<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Release decision:</span> keep this build in the closed lab programme. The results support further development and targeted testing; they do not approve a general aaPanel beta release.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Evidence and reproduction</span></span><br />
<br />
The companion sanitized results summary (the measured values are reproduced in this report) records the measured values, suite counts and limits. The reproducible test source and private raw timing evidence are retained with our lab records. The test is fixed to this lab; it is not a portable installer.<br />
<br />
Private detailed results, raw timing samples and any diagnostics are retained on the lab under the operator's test-evidence directory. Credentials, cookies, nonces and private PHP errors are not included in this guide bundle.<br />
<br />
Official architecture reference: <a href="https://www.aapanel.com/docs/faq/multi-webserver_hosting.html" target="_blank" rel="noopener" class="mycode_url">aaPanel Multi-WebServer Hosting</a>. This describes aaPanel's server choices, not compatibility certification for our addon.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Original AdminsForum lab work. Copyright AdminsForum | adminsforum.com.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Guide series:</span> <a href="https://adminsforum.com/Thread-guide-install-varnish-cache-in-aapanel-closed-lab-preview" target="_blank" rel="noopener" class="mycode_url">Installation</a> | <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">WordPress configuration</a> | <a href="https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results" target="_blank" rel="noopener" class="mycode_url">Measured results</a><br />
<br />
<span style="font-style: italic;" class="mycode_i">Historical attachments dated 20 October below belong to the older synthetic fixture run. They are retained as earlier evidence and are not the raw samples for the 24 October WordPress measurements above.</span><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=393" target="_blank" title="">varnish-before-after-results-20261020.png</a> (Size: 135.15 KB / Downloads: 23)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=394" target="_blank" title="">varnish-before-after-data-20261020.zip</a> (Size: 17.82 KB / Downloads: 15)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Updated 24 October 2026 | Varnish Cache by Adminforum 0.6.0-lab | Verified scope: one audited WordPress/Nginx website.</span><br />
<br />
On 24 October 2026, the current managed WordPress/Nginx lab integration passed <span style="font-weight: bold;" class="mycode_b">38 application checks</span>, plus <span style="font-weight: bold;" class="mycode_b">3 installation-safeguard checks</span>. The current-source backend suite passed <span style="font-weight: bold;" class="mycode_b">161 tests</span>; the frontend suite passed <span style="font-weight: bold;" class="mycode_b">38 checks</span>. These are separate suites, not counts of independent websites or server modes.<br />
<br />
The website was left added and enabled after testing. The disposable application fixtures were moved to WordPress Trash, and the other Nginx/Apache website configuration files were unchanged. Postfix and Dovecot remained active; this checks service state, not end-to-end mail delivery.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Environment</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website:</span> blog.adminslab.com — isolated test site<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Operating system:</span> Ubuntu 22.04 VPS, 2 CPU cores, approximately 4 GiB RAM<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel:</span> 8.0.7<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Assigned website server:</span> Nginx 1.30.6<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP:</span> 8.5.12<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WordPress:</span> 7.1.3<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish:</span> 9.1.0<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Cache policy:</span> Public homepage/posts, up to 30 seconds; 32 MiB capacity<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WooCommerce:</span> Not installed<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Before and after response times</span></span><br />
<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>Local verified HTTPS       Requests    Median ms     p95 ms
Direct WordPress                 30      142.298    171.835
Warm Varnish HIT                 30        7.772     12.075
Cold Varnish MISS                10      132.968    156.915</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Native WordPress, cache disabled</span><br />
<span style="font-weight: bold;" class="mycode_b">Requests:</span> 30<br />
<span style="font-weight: bold;" class="mycode_b">Expected response:</span> DIRECT<br />
<span style="font-weight: bold;" class="mycode_b">Median:</span> 142.298 ms<br />
<span style="font-weight: bold;" class="mycode_b">p95:</span> 171.835 ms<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish, warmed public post</span><br />
<span style="font-weight: bold;" class="mycode_b">Requests:</span> 30<br />
<span style="font-weight: bold;" class="mycode_b">Expected response:</span> HIT<br />
<span style="font-weight: bold;" class="mycode_b">Median:</span> 7.772 ms<br />
<span style="font-weight: bold;" class="mycode_b">p95:</span> 12.075 ms<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Varnish, exact post purged before each request</span><br />
<span style="font-weight: bold;" class="mycode_b">Requests:</span> 10<br />
<span style="font-weight: bold;" class="mycode_b">Expected response:</span> MISS<br />
<span style="font-weight: bold;" class="mycode_b">Median:</span> 132.968 ms<br />
<span style="font-weight: bold;" class="mycode_b">p95:</span> 156.915 ms<br />
<br />
Warm-cache median complete response time was <span style="font-weight: bold;" class="mycode_b">94.5% lower</span> than the direct median in this sample. This is a local lab comparison, not a promise of the same reduction for visitors.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Measurement method</span></span><br />
<br />
The test requested the same newly published public WordPress post through verified HTTPS on the VPS's loopback connection using the real hostname. Every measured request opened a new connection and read the complete response; timings include TLS setup. Requests were sequential. The p95 uses the nearest-rank method.<br />
<br />
The direct phase disabled the managed route and verified the exact original configuration. The warm phase restored caching and warmed the public post before measuring. The cold phase purged that exact path before each request. Each measured response had to return HTTP 200 with the expected DIRECT, HIT or MISS marker. Dashboard live polling was paused during the measurements.<br />
<br />
This is <span style="font-weight: bold;" class="mycode_b">not</span> an internet-latency, browser-rendering, throughput, sustained-load or high-concurrency benchmark. Test order and normal server variation can affect results. The slightly lower cold-MISS median than direct does not establish that misses are faster; both execute the origin application and their small difference needs broader controlled measurements.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Application and privacy results</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Draft publication:</span> Anonymous draft request was unavailable; published post returned MISS then HIT.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Content update:</span> A real WordPress post update invalidated the old cached content automatically.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Comment edit:</span> Editing a stored approved comment invalidated the post cache.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Public response headers:</span> Cached public post did not carry Set-Cookie.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Two real accounts:</span> Both existing test readers logged in and received their own uncached profile pages.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Concurrent identity isolation:</span> 12 interleaved profile requests across two users and four workers retained the correct user identity. This is a small functional check, not a load benchmark.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Nonces:</span> The two profile pages had distinct nonces.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Exclusions:</span> Cookies, Authorization, search, REST API, admin, POST, cart/account/checkout paths bypassed.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Private content:</span> A new private post was not exposed anonymously or served as a HIT.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Purge protection:</span> Public PURGE/BAN were rejected; an invalid private purge key was rejected.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Trash invalidation:</span> Trashing the disposable public post removed its cached public content.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Coexistence:</span> Other checked Nginx/Apache vhost files stayed byte-identical; Nginx validation passed and mail services remained active.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Final state:</span> The managed cache remained enabled and verified active.<br />
<br />
The cart/account/checkout checks exercised excluded paths on a site without WooCommerce. They do <span style="font-weight: bold;" class="mycode_b">not</span> establish shopping-cart, payment or store-plugin compatibility.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation safeguards</span></span><br />
<br />
The installed control-file validation completed without changing the active public website route. Attempting uninstall while the native cache was configured returned the expected refusal. The plugin files and native route were preserved.<br />
<br />
This tests a guard, not a successful clean uninstall/reinstall. The current build still depends on the prepared lab runtime.<br />
<br />
Earlier on the same day, a separate <span style="font-weight: bold;" class="mycode_b">29-check managed lifecycle run</span> passed exact direct-route restoration, re-enable, stopped-cache fallback and recovery. Those earlier lifecycle results are distinct from the new 38-check application run; they should not be presented as newly retested behavior where it was not repeated.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">What remains before public beta</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">WordPress on this audited Nginx lab site:</span> Application and managed lifecycle evidence available<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Other Nginx sites / portable site onboarding:</span> Not validated; current target is restricted in code<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Native Apache, OpenLiteSpeed, Nginx + Apache, Nginx + OpenLiteSpeed:</span> Adapters/live compatibility not established<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mixed-engine cached websites:</span> Not established<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WooCommerce cart/session/payment journey:</span> Not tested; WooCommerce absent<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Browser editor and public comment submission:</span> Not exercised by this API-based application run<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Native access/error log views and persistent traffic history:</span> Not connected; live chart is a browser-session buffer<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Clean-server install, upgrade, successful uninstall/reinstall:</span> Not established by this run<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Reboot, certificate renewal, native engine/PHP switching:</span> Not exercised<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sustained traffic and resource-pressure testing:</span> Not performed<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Release decision:</span> keep this build in the closed lab programme. The results support further development and targeted testing; they do not approve a general aaPanel beta release.<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Evidence and reproduction</span></span><br />
<br />
The companion sanitized results summary (the measured values are reproduced in this report) records the measured values, suite counts and limits. The reproducible test source and private raw timing evidence are retained with our lab records. The test is fixed to this lab; it is not a portable installer.<br />
<br />
Private detailed results, raw timing samples and any diagnostics are retained on the lab under the operator's test-evidence directory. Credentials, cookies, nonces and private PHP errors are not included in this guide bundle.<br />
<br />
Official architecture reference: <a href="https://www.aapanel.com/docs/faq/multi-webserver_hosting.html" target="_blank" rel="noopener" class="mycode_url">aaPanel Multi-WebServer Hosting</a>. This describes aaPanel's server choices, not compatibility certification for our addon.<br />
<br />
<span style="font-style: italic;" class="mycode_i">Original AdminsForum lab work. Copyright AdminsForum | adminsforum.com.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Guide series:</span> <a href="https://adminsforum.com/Thread-guide-install-varnish-cache-in-aapanel-closed-lab-preview" target="_blank" rel="noopener" class="mycode_url">Installation</a> | <a href="https://adminsforum.com/Thread-guide-configure-varnish-cache-in-aapanel-controls-and-exclusions" target="_blank" rel="noopener" class="mycode_url">WordPress configuration</a> | <a href="https://adminsforum.com/Thread-guide-varnish-cache-before-and-after-aapanel-lab-test-results" target="_blank" rel="noopener" class="mycode_url">Measured results</a><br />
<br />
<span style="font-style: italic;" class="mycode_i">Historical attachments dated 20 October below belong to the older synthetic fixture run. They are retained as earlier evidence and are not the raw samples for the 24 October WordPress measurements above.</span><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=393" target="_blank" title="">varnish-before-after-results-20261020.png</a> (Size: 135.15 KB / Downloads: 23)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=394" target="_blank" title="">varnish-before-after-data-20261020.zip</a> (Size: 17.82 KB / Downloads: 15)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
	</channel>
</rss>