<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shuki Vaknin (‫אחסון לינוקס‬‎)</title>
    <description>The latest articles on DEV Community by Shuki Vaknin (‫אחסון לינוקס‬‎) (@shuki_vaknin).</description>
    <link>https://dev.to/shuki_vaknin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2606472%2F2f28aa6b-86ba-41d2-8533-6f7453f36e5e.png</url>
      <title>DEV Community: Shuki Vaknin (‫אחסון לינוקס‬‎)</title>
      <link>https://dev.to/shuki_vaknin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shuki_vaknin"/>
    <language>en</language>
    <item>
      <title>An open-source cPanel alternative for Debian 13</title>
      <dc:creator>Shuki Vaknin (‫אחסון לינוקס‬‎)</dc:creator>
      <pubDate>Sun, 26 Jul 2026 20:01:40 +0000</pubDate>
      <link>https://dev.to/shuki_vaknin/an-open-source-cpanel-alternative-for-debian-13-3jco</link>
      <guid>https://dev.to/shuki_vaknin/an-open-source-cpanel-alternative-for-debian-13-3jco</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Originally published at &lt;a href="https://jabali-panel.com/blog/cpanel-alternative/" rel="noopener noreferrer"&gt;jabali-panel.com&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you run a Debian server and you are tired of paying per-account fees for a hosting control panel, this post is for you. Jabali Panel is a GPL-licensed control panel built for one operating system — Debian 13 (Trixie) — and one job: managing hosted websites, email, and DNS for end-user accounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we built another panel
&lt;/h2&gt;

&lt;p&gt;Most existing panels fall into one of two camps. The commercial ones (cPanel, Plesk, DirectAdmin) charge per account and lock features behind tiers. The free ones (HestiaCP, CyberPanel, aaPanel) make different trade-offs around language, security model, or maintenance cadence. We wanted something Debian-native, AGPL-licensed end to end, and built on a modern Go + React stack rather than a PHP monolith.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;The panel API is &lt;code&gt;jabali-panel-api&lt;/code&gt;, a Go service using Gin for HTTP routing and GORM for the data layer. The browser UI is a React single-page application built on Ant Design and TanStack Query. Privileged host operations — anything that needs &lt;code&gt;root&lt;/code&gt; — run in a separate process, &lt;code&gt;jabali-agent&lt;/code&gt;, accessed over a Unix domain socket. The panel itself does not run as root.&lt;/p&gt;

&lt;p&gt;PHP, in this stack, is a &lt;em&gt;hosted workload&lt;/em&gt;: each user gets their own PHP-FPM pool, and the panel manages versions 8.1 through 8.5 from the Sury repository per domain. The panel is not written in PHP.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get on a fresh install
&lt;/h2&gt;

&lt;p&gt;Run the installer on a clean Debian 13 host and 8–15 minutes later you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nginx&lt;/strong&gt; as the reverse proxy and TLS terminator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MariaDB 11.x&lt;/strong&gt; for tenant databases (PostgreSQL is opt-in)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerDNS Authoritative&lt;/strong&gt; for hosted zones, &lt;strong&gt;pdns-recursor&lt;/strong&gt; for panel-internal resolution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stalwart Mail 0.16.0&lt;/strong&gt; — SMTP, IMAP, JMAP in a single binary — with Roundcube webmail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;certbot&lt;/strong&gt; issuing Let's Encrypt certificates per domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrowdSec&lt;/strong&gt; AppSec WAF inline with nginx, plus Snuffleupagus, AppArmor, AIDE, and auditd&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerDNS DNSSEC&lt;/strong&gt; signing per domain (opt-in), with the DS record surfaced in the UI for registrar publication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WP-CLI 2.12.0&lt;/strong&gt; powering one-click WordPress installs with a self-deleting SSO link into wp-admin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is provisioned automatically. Nothing requires manual operator install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating from cPanel
&lt;/h2&gt;

&lt;p&gt;The Migrations section accepts cPanel &lt;code&gt;.tar.gz&lt;/code&gt; and &lt;code&gt;cpmove&lt;/code&gt; archives directly. It also reads DirectAdmin, Hestia, and WHM backups. The restore is per-account, tracked in the UI, and writes domains, databases, mailboxes, DNS zones, and cron jobs into the new layout.&lt;/p&gt;

&lt;p&gt;A few cPanel-specific notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MySQL passwords&lt;/strong&gt; are bcrypt in cPanel ≥ 11.96. Jabali stores the bcrypt hash directly in MariaDB so migrated apps keep authenticating without password reset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email accounts&lt;/strong&gt; move from cPanel's Dovecot+Exim to Stalwart. Mailbox passwords cannot be migrated as-is — the migration report prints the new passwords, or you can flip the "force first-login password reset" option.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DKIM keys&lt;/strong&gt; are imported as-is so outbound deliverability survives the switch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you don't get
&lt;/h2&gt;

&lt;p&gt;A few honest caveats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is &lt;strong&gt;single-host&lt;/strong&gt;. There is no clustering. One panel, one VPS.&lt;/li&gt;
&lt;li&gt;We support &lt;strong&gt;Debian 13 only&lt;/strong&gt;. The installer exits on earlier Debian releases or Ubuntu — not because we dislike Ubuntu, but because supporting a single distribution lets us actually test what we ship.&lt;/li&gt;
&lt;li&gt;The panel itself is &lt;strong&gt;English-only&lt;/strong&gt; in the UI today. End-user features (webmail, autoconfig profiles) honour the user's browser locale.&lt;/li&gt;
&lt;li&gt;We sell &lt;strong&gt;paid support&lt;/strong&gt; and &lt;strong&gt;pre-configured VPS instances&lt;/strong&gt;. The software itself stays free; nothing is gated behind a paid tier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://jabali-panel.com/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole install command. The script is idempotent and safe to re-run. From a clean Debian 13 VPS, expect 8–15 minutes to a working panel at &lt;code&gt;https://&amp;lt;panel-hostname&amp;gt;/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you'd rather see it first, the &lt;a href="https://jabali-panel.com/demo/" rel="noopener noreferrer"&gt;demo panel&lt;/a&gt; runs the live UI with seeded admin and user accounts. Everything is read-only — useful for clicking around without spinning up a server.&lt;/p&gt;

&lt;p&gt;For longer-form documentation, the &lt;a href="https://jabali-panel.com/docs/installation/" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt; and &lt;a href="https://jabali-panel.com/docs/quickstart/" rel="noopener noreferrer"&gt;quickstart&lt;/a&gt; walk through DNS prep, panel-hostname certificate issuance, and creating your first hosted user.&lt;/p&gt;

</description>
      <category>sysadmin</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to Preview a Website on a New Server Before You Change DNS</title>
      <dc:creator>Shuki Vaknin (‫אחסון לינוקס‬‎)</dc:creator>
      <pubDate>Sun, 26 Jul 2026 19:54:14 +0000</pubDate>
      <link>https://dev.to/shuki_vaknin/how-to-preview-a-website-on-a-new-server-before-you-change-dns-576n</link>
      <guid>https://dev.to/shuki_vaknin/how-to-preview-a-website-on-a-new-server-before-you-change-dns-576n</guid>
      <description>&lt;p&gt;Every website migration has the same terrifying moment: you flip the DNS record, and for the next few hours you have no idea whether the new server is actually serving your site correctly — or quietly 500-ing for half the planet while it propagates.&lt;/p&gt;

&lt;p&gt;The fix is simple: &lt;strong&gt;test the new server &lt;em&gt;before&lt;/em&gt; you change DNS.&lt;/strong&gt; Here's how to do that properly, plus the checks I run on every migration so nothing breaks silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The old way: editing your hosts file
&lt;/h2&gt;

&lt;p&gt;The classic trick is to point your machine at the new server by adding a line to your local &lt;code&gt;hosts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="m"&gt;203&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;113&lt;/span&gt;.&lt;span class="m"&gt;10&lt;/span&gt;   &lt;span class="n"&gt;example&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works, but it's painful: you edit a system file with admin rights on every device, your phone and your client's laptop can't easily see it, and you &lt;em&gt;will&lt;/em&gt; forget to remove the line and then debug "why is the site broken on my machine only."&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: a temporary preview URL
&lt;/h2&gt;

&lt;p&gt;Instead of editing the hosts file, you can generate a temporary URL that resolves to the new server's IP for your chosen domain — no local changes, works on any device.&lt;/p&gt;

&lt;p&gt;I built a free tool for exactly this: &lt;strong&gt;&lt;a href="https://hostsclick.com" rel="noopener noreferrer"&gt;hosts.click&lt;/a&gt;&lt;/strong&gt; ("The Website Previewer"). You give it the new server's IP and the domain, and it hands you a temporary preview URL. Open it anywhere — desktop, phone, share it with the client — and click through the whole site exactly as it will look once DNS points to the new host. No hosts file, no DNS change, no waiting for propagation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diff the old and new server before you cut over
&lt;/h2&gt;

&lt;p&gt;The most dangerous migration bugs are the &lt;em&gt;silent&lt;/em&gt; ones — a redirect that changed, a header that got dropped, a page that's subtly different. Eyeballing every page won't catch them.&lt;/p&gt;

&lt;p&gt;Run a &lt;strong&gt;server diff&lt;/strong&gt;: hit the same paths on the old IP and the new IP and compare status codes, redirect chains, response headers, response time, and a hash of the page body. If the body hash differs on a page you didn't touch, find it now, not after the cutover.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Free tool: &lt;a href="https://hostsclick.com/server-diff" rel="noopener noreferrer"&gt;server diff&lt;/a&gt; — old IP vs. new IP, side by side.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Don't lose email
&lt;/h2&gt;

&lt;p&gt;They change the domain's &lt;strong&gt;A record&lt;/strong&gt; and their email stops working, because they assumed "changing hosts" meant changing everything. It doesn't. Your website (A/AAAA record) and your email (MX records) are independent. If you're only moving the website, &lt;strong&gt;leave the MX records alone.&lt;/strong&gt; Verify your mail DNS — MX, plus SPF, DKIM, and DMARC — with an &lt;a href="https://hostsclick.com/email-dns" rel="noopener noreferrer"&gt;email DNS checker&lt;/a&gt; so you don't quietly drop into spam folders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lower your TTL first
&lt;/h2&gt;

&lt;p&gt;DNS propagation isn't magic; it's caching. Every DNS record has a &lt;strong&gt;TTL&lt;/strong&gt; (time to live). If your A record has a 24-hour TTL, your cutover can take 24 hours to fully roll out. &lt;strong&gt;At least a day before&lt;/strong&gt; you migrate, drop the TTL on the records you'll change to 300 seconds. Then when you flip the record, the switch propagates in minutes instead of hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch the cutover propagate
&lt;/h2&gt;

&lt;p&gt;Once you change the record, you want to &lt;em&gt;see&lt;/em&gt; it roll out across the world rather than guessing. Query the domain against many public resolvers and watch them converge on the new IP.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Free tool: &lt;a href="https://hostsclick.com/dns-propagation" rel="noopener noreferrer"&gt;DNS propagation checker&lt;/a&gt; — compares your record across 45 public resolvers worldwide on a map.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Re-check the boring stuff on the new host
&lt;/h2&gt;

&lt;p&gt;New server, new defaults. Confirm the new host matches the old one on what doesn't show visually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Caching &amp;amp; compression&lt;/strong&gt; — sensible &lt;code&gt;Cache-Control&lt;/code&gt; and gzip/Brotli? Check the &lt;a href="https://hostsclick.com/cache-checker" rel="noopener noreferrer"&gt;cache checker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS &amp;amp; the cert chain&lt;/strong&gt; — valid, covers the hostname, complete intermediates? Run an &lt;a href="https://hostsclick.com/ssl-checker" rel="noopener noreferrer"&gt;SSL checker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security headers&lt;/strong&gt; — HSTS, CSP, &lt;code&gt;X-Content-Type-Options&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redirects&lt;/strong&gt; — did your &lt;code&gt;http → https&lt;/code&gt; and &lt;code&gt;www&lt;/code&gt; canonicalization survive the move?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Test before you switch, switch fast, verify after:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Preview the site on the new server before touching DNS.&lt;/li&gt;
&lt;li&gt;Diff old vs. new to catch silent changes.&lt;/li&gt;
&lt;li&gt;Leave MX alone unless you're moving email too.&lt;/li&gt;
&lt;li&gt;Lower TTL 24h ahead.&lt;/li&gt;
&lt;li&gt;Flip DNS, watch it propagate.&lt;/li&gt;
&lt;li&gt;Re-check cache, SSL, security headers, redirects.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All the tools for each step are free (no signup) at &lt;strong&gt;&lt;a href="https://hostsclick.com/tools" rel="noopener noreferrer"&gt;hostsclick.com/tools&lt;/a&gt;&lt;/strong&gt;. For a version tailored to your specific hosts, the &lt;a href="https://hostsclick.com/migration-checklist" rel="noopener noreferrer"&gt;migration checklist generator&lt;/a&gt; builds one for you.&lt;/p&gt;

&lt;p&gt;Migrate boldly. Just test first.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>dns</category>
      <category>hosting</category>
    </item>
    <item>
      <title>LiteSpeed vs Nginx for WordPress: 3 months of production benchmarks</title>
      <dc:creator>Shuki Vaknin (‫אחסון לינוקס‬‎)</dc:creator>
      <pubDate>Sun, 26 Jul 2026 01:42:28 +0000</pubDate>
      <link>https://dev.to/shuki_vaknin/litespeed-vs-nginx-for-wordpress-3-months-of-production-benchmarks-46ab</link>
      <guid>https://dev.to/shuki_vaknin/litespeed-vs-nginx-for-wordpress-3-months-of-production-benchmarks-46ab</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Ran LiteSpeed Enterprise (LSWS) and Nginx side-by-side on identical VPS instances for 3 months, hosting the same 12 WordPress sites on each. LiteSpeed came out 33–45% faster on TTFB and moved 10/12 sites to a 90+ mobile PageSpeed score vs. 3/12 on Nginx. But ~80% of that advantage doesn't come from LSWS itself — it comes from the LSCache plugin, which also works with OpenLiteSpeed (free).&lt;/p&gt;

&lt;p&gt;If you're deciding today: &lt;strong&gt;OpenLiteSpeed + LSCache&lt;/strong&gt; is the pragmatic answer for most WordPress workloads.&lt;/p&gt;




&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Two identical VPS instances at the same Israeli data center:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server A&lt;/strong&gt;: LiteSpeed Enterprise 6.2 + LSCache 5.7 + PHP 8.2 (LSAPI) + CloudLinux&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server B&lt;/strong&gt;: Nginx 1.24 + PHP 8.2 FPM + FastCGI cache + Redis object cache&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spec on each: 4 vCPU, 8 GB RAM, 100 GB NVMe, Ubuntu 22.04.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12 WordPress sites migrated to each&lt;/strong&gt; (same versions, same plugin stack):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 brochure sites (~50 pages, empty WooCommerce)&lt;/li&gt;
&lt;li&gt;4 WooCommerce stores (500–2000 products)&lt;/li&gt;
&lt;li&gt;4 Elementor blogs (500+ posts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Load simulated with k6, 100 concurrent users, 30-min runs, realistic paths: home → category → product → cart → checkout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results — TTFB
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site type&lt;/th&gt;
&lt;th&gt;Nginx&lt;/th&gt;
&lt;th&gt;LiteSpeed&lt;/th&gt;
&lt;th&gt;Δ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Brochure&lt;/td&gt;
&lt;td&gt;142 ms&lt;/td&gt;
&lt;td&gt;89 ms&lt;/td&gt;
&lt;td&gt;−37%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WooCommerce empty&lt;/td&gt;
&lt;td&gt;168 ms&lt;/td&gt;
&lt;td&gt;112 ms&lt;/td&gt;
&lt;td&gt;−33%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WooCommerce full&lt;/td&gt;
&lt;td&gt;384 ms&lt;/td&gt;
&lt;td&gt;210 ms&lt;/td&gt;
&lt;td&gt;−45%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blog&lt;/td&gt;
&lt;td&gt;156 ms&lt;/td&gt;
&lt;td&gt;98 ms&lt;/td&gt;
&lt;td&gt;−37%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Results — RPS under load
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site type&lt;/th&gt;
&lt;th&gt;Nginx&lt;/th&gt;
&lt;th&gt;LiteSpeed&lt;/th&gt;
&lt;th&gt;Δ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Brochure&lt;/td&gt;
&lt;td&gt;340&lt;/td&gt;
&lt;td&gt;520&lt;/td&gt;
&lt;td&gt;+53%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WooCommerce empty&lt;/td&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;340&lt;/td&gt;
&lt;td&gt;+62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WooCommerce full&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;118&lt;/td&gt;
&lt;td&gt;+90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blog&lt;/td&gt;
&lt;td&gt;280&lt;/td&gt;
&lt;td&gt;470&lt;/td&gt;
&lt;td&gt;+68%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The gap widens with deeper PHP call trees. WooCommerce with a big catalog is nearly 2× faster on LSWS. Reason: &lt;strong&gt;LSAPI keeps a persistent worker pool&lt;/strong&gt; that avoids PHP-FPM's cold-start overhead on complex requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results — PageSpeed Insights (mobile)
&lt;/h2&gt;

&lt;p&gt;Averages across all 12 sites, both stacks with the same image + Critical-CSS pipeline:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Nginx&lt;/th&gt;
&lt;th&gt;LiteSpeed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LCP&lt;/td&gt;
&lt;td&gt;2.4 s&lt;/td&gt;
&lt;td&gt;1.6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FCP&lt;/td&gt;
&lt;td&gt;1.7 s&lt;/td&gt;
&lt;td&gt;1.1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;0.03&lt;/td&gt;
&lt;td&gt;0.03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TBT&lt;/td&gt;
&lt;td&gt;240 ms&lt;/td&gt;
&lt;td&gt;190 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;LiteSpeed moved &lt;strong&gt;10/12 sites&lt;/strong&gt; to 90+. Nginx got &lt;strong&gt;3/12&lt;/strong&gt; there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The plot twist
&lt;/h2&gt;

&lt;p&gt;Three months in, I did one more test: installed &lt;strong&gt;OpenLiteSpeed&lt;/strong&gt; (free, MIT license) + LSCache on Server B, in place of Nginx. Same 12 sites.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Nginx + FastCGI + Redis&lt;/th&gt;
&lt;th&gt;OpenLiteSpeed + LSCache&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TTFB (WooCommerce full)&lt;/td&gt;
&lt;td&gt;384 ms&lt;/td&gt;
&lt;td&gt;245 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PageSpeed (mobile)&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License cost&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;~80% of LiteSpeed Enterprise's advantage came from the cache plugin, not the server.&lt;/strong&gt; LSCache does four things no other WordPress cache plugin does at the same level:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;QUIC.cloud CDN, free tier&lt;/strong&gt; (built into the plugin)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image optimization + WebP conversion&lt;/strong&gt; in-process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Critical CSS&lt;/strong&gt; generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESI edge-side includes&lt;/strong&gt; — cache the shell of a page while keeping dynamic bits fresh (mini-carts, logged-in nav)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Recommended config
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;wp-config.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_CACHE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_DEBUG'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_REDIS_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_REDIS_PORT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_REDIS_DATABASE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_POST_REVISIONS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AUTOSAVE_INTERVAL'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Critical LSCache settings (Dashboard → LiteSpeed Cache):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache → General → Enable Cache: &lt;strong&gt;On&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cache → General → Cache Logged-in Users: &lt;strong&gt;Off&lt;/strong&gt; (important)&lt;/li&gt;
&lt;li&gt;Cache → Object → Object Cache: &lt;strong&gt;Redis&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cache → ESI → Enable ESI: &lt;strong&gt;On&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;CDN → QUIC.cloud CDN: &lt;strong&gt;On&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Page Optimization → CSS: Combine + Minify + UCSS&lt;/li&gt;
&lt;li&gt;Page Optimization → JS: Combine + Defer&lt;/li&gt;
&lt;li&gt;Page Optimization → Images: Guest Optimization + Lazy Load&lt;/li&gt;
&lt;li&gt;Page Optimization → HTML: Minify + DNS Prefetch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Nginx still wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API-only WordPress backends&lt;/strong&gt; (headless) — Nginx + FPM has a tighter footprint for pure JSON responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Truly static traffic&lt;/strong&gt; — landing pages, marketing sites with no dynamic content. Nginx + static file cache is unbeatable there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team that only knows Nginx&lt;/strong&gt; — LSWS/OLS learning curve isn't worth it for a single box.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Eight-point WordPress performance checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;curl -o /dev/null -s -w "%{time_starttransfer}\n" https://yoursite.com/&lt;/code&gt; → TTFB under 200 ms&lt;/li&gt;
&lt;li&gt;PageSpeed Insights on home + 3 product pages → LCP under 2.5 s&lt;/li&gt;
&lt;li&gt;GTmetrix waterfall → cache HIT on every static asset&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;X-LiteSpeed-Cache: hit&lt;/code&gt; header on repeat requests (or equivalent for your cache)&lt;/li&gt;
&lt;li&gt;Search Console → Core Web Vitals → 90%+ URLs "Good"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wp cli plugin list --status=active&lt;/code&gt; → under 25 active plugins&lt;/li&gt;
&lt;li&gt;wp-admin → Site Health → no "Critical" issues&lt;/li&gt;
&lt;li&gt;Redis object cache active — check "Cache Statistics" in your cache plugin&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;For WordPress in 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On a shared host&lt;/strong&gt;: LiteSpeed Enterprise + LSCache is the strongest option. Pay the license, forget about tuning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On your own VPS&lt;/strong&gt;: OpenLiteSpeed + LSCache gets you 90% of the way there for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nginx&lt;/strong&gt;: still the right call for API-only or ultra-static workloads, or if your team lives and breathes it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two days of proper LSCache config usually beats switching hosts.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I run &lt;a href="https://www.linux-hosting.co.il/en/" rel="noopener noreferrer"&gt;Linux Hosting&lt;/a&gt;, an Israeli hosting provider running LiteSpeed Enterprise + LSCache across every plan. Comments and pushback welcome — this was measured on a real customer fleet, but every setup is different and I'd love to see other benchmarks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>devops</category>
      <category>benchmarking</category>
    </item>
  </channel>
</rss>
