Why Choose Lighttpd?
When speed and low memory usage matter, Lighttpd shines. Its event-driven architecture handles thousands of simultaneous connections without spawning extra processes or threads. This means:
- Rock-Solid Performance: Able to serve high-traffic sites or APIs without maxing out CPU/memory.
- Minimal Footprint: Perfect for small‐scale VPS instances, containerized deployments, or a Raspberry Pi.
- Sane Defaults & Security: Chroot and setuid/setgid support, plus secure default settings.
- Modular Design: Enable only the modules you actually need (CGI, FastCGI, SSL, URL rewriting, and more).
- Straightforward Configuration: No need to wade through pages of directives—just the essentials.
Whether you’re hosting a static blog, prototyping a web service, or running a small CMS, Lighttpd gives you a lean server that’s easy to tweak.
Prerequisites
- Debian 12 (Bookworm) or Ubuntu 24.04 LTS
- A VPS or physical server running one of these distributions.
- Root access or a user in the
sudo
group.
- System Preparation
sudo apt update
sudo apt upgrade -y
sudo timedatectl set-timezone America/Newyork
sudo dpkg-reconfigure locales
Bash1. Installing Lighttpd
- Refresh Package Lists & Install
sudo apt update
sudo apt install -y lighttpd
Bash- Verify the Service
sudo systemctl status lighttpd
Bash- If it’s not running:
sudo systemctl start lighttpd
Bash- Enable at boot:
sudo systemctl enable lighttpd
Bash2. Testing Your Setup
Open a browser to http://<your-server-ip>/
. You should see the default Lighttpd welcome page:
It works!
BashIf you don’t see it, check:
- Lighttpd is running:
sudo systemctl status lighttpd
Bash- Port 80 is open in the firewall.
3. Adjusting Firewall Rules (ufw)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status
BashIf you use iptables
or another firewall, open ports 80 and 443 accordingly.
4. Lighttpd File Layout
Purpose | Path |
---|---|
Document root (web files) | /var/www/html |
Main configuration file | /etc/lighttpd/lighttpd.conf |
Default log directory | /var/log/lighttpd/ |
Available site configs | /etc/lighttpd/conf-available/ |
Enabled site configs | /etc/lighttpd/conf-enabled/ |
Service controls (systemd) | `systemctl [start |
Drop your HTML/PHP files into /var/www/html/
to serve them immediately.
5. Basic Server Management
- Restart (after config changes):
sudo systemctl restart lighttpd
Bash- Reload (no full restart):
sudo systemctl reload lighttpd
Bash- Stop the service:
sudo systemctl stop lighttpd
Bash6. Enabling & Using Modules
Lighttpd’s modular design means you only load what you need. Use lighty-enable-mod
to activate modules.
- Enable mod_rewrite (for “pretty URLs”):
sudo lighty-enable-mod rewrite
sudo systemctl reload lighttpd
Bash- Enable mod_ssl (for HTTPS support):
sudo lighty-enable-mod ssl
sudo systemctl reload lighttpd
Bash- After enabling
mod_ssl
, you’ll need a valid SSL certificate (see Section 9). - Enable PHP via FastCGI
sudo apt install -y php8.2-cgi
sudo lighty-enable-mod fastcgi
sudo lighty-enable-mod fastcgi-php
sudo systemctl reload lighttpd
Bash- Now any
.php
file in/var/www/html/
is processed by PHP.
7. Tweaking the Configuration
Always back up before editing:
sudo cp /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.bak
sudo nano /etc/lighttpd/lighttpd.conf
BashCommon Tweaks
- Change the Document Root
server.document-root = "/var/www/html"
# Example: change to /srv/www/site1
server.document-root = "/srv/www/site1"
Bash- Hide Server Tokens (for Privacy)
server.tag = ""
Bash- Custom Error Pages
server.error-handler-404 = "/custom-404.html"
server.error-handler-500 = "/custom-500.html"
Bash- Adjust Max Connections
server.max-connections = 2048
BashAfter editing, reload:
sudo systemctl reload lighttpd
Bash8. Serving Multiple Sites (Virtual Hosts)
- Create a directory for each site
sudo mkdir -p /var/www/example.com
sudo chown -R www-data:www-data /var/www/example.com
Bash- Create a new vhost config (
/etc/lighttpd/conf-available/example.com.conf
):
$SERVER["socket"] == "0.0.0.0:80" {
server.name = "example.com"
server.document-root = "/var/www/example.com"
accesslog.filename = "/var/log/lighttpd/example.com-access.log"
server.errorlog = "/var/log/lighttpd/example.com-error.log"
}
Bash- Enable the new configuration
sudo ln -s /etc/lighttpd/conf-available/example.com.conf /etc/lighttpd/conf-enabled/10-example.com.conf
sudo systemctl reload lighttpd
BashRepeat for additional sites. For HTTPS, add a block with "$SERVER[\"socket\"] == \"0.0.0.0:443\""
and SSL directives.
9. Automating SSL with Let’s Encrypt
- Install Certbot & Lighttpd Plugin
sudo apt install -y certbot python3-certbot-lighttpd
Bash- Obtain & Install a Certificate
sudo certbot --lighttpd
Bash- Prompts for your domain names.
- Automatically updates Lighttpd to use the new certificate.
- Sets up auto-renewal.
- Verify HTTPS Access
Visithttps://example.com/
—you should see a valid certificate.
Test renewal:
sudo certbot renew --dry-run
Bash10. Keeping Security Tight
- Run as Non-Privileged User
Lighttpd defaults towww-data
. Verify with:
ps aux | grep lighttpd
Bash- Restrict Access to Sensitive Paths
In your site’s config (e.g.,/etc/lighttpd/conf-enabled/example.com.conf
):
$HTTP["url"] =~ "^/admin/" {
url.access-deny = ( "" )
}
Bash- Keep Packages Up to Date
sudo apt update
sudo apt upgrade -y
Bash- Harden PHP (if used)
Edit/etc/php/8.2/cgi/php.ini
(or PHP-FPM’sphp.ini
):
disable_functions = exec,passthru,shell_exec,system
open_basedir = /var/www/html/:/tmp/
display_errors = Off
Bash- Limit File Upload Sizes
In your FastCGI config (e.g.,/etc/lighttpd/conf-enabled/10-fastcgi.conf
):
fastcgi.server = ( ".php" =>
( "localhost" =>
(
"socket" => "/run/lighttpd/php.socket",
"bin-path" => "/usr/bin/php-cgi",
"min-procs" => 1,
"max-procs" => 5,
"max-request-size" => 10485760 # 10 MB
)
)
)
Bash11. When to Use Lighttpd
- Static Site Hosting
Instant, ultra-fast delivery of HTML/CSS/JS/images on a small VPS. - Embedded or Low-Power Devices
Raspberry Pi dashboards, IoT endpoints, intranet tools. - Rapid Prototyping
Spin up a minimal LAMP/LEMP‐style environment for PHP or Python (via FastCGI). - Secure File Sharing
Lightweight file downloads behind basic authentication.
Ready to Go?
- Place your files into
/var/www/html/
(or your custom document root). - Edit
/etc/lighttpd/lighttpd.conf
or drop virtual host files into/etc/lighttpd/conf-available/
and enable them. - Reload Lighttpd:
sudo systemctl reload lighttpd
Bash- Visit
http://<your-server-ip>/
orhttps://<your-domain>/
(if using SSL).
You’ll have a lean, stable web server—ready to handle static or dynamic content with minimal fuss. Enjoy!