Apache Virtual Hosts
date: 2020-12-20
Use Virtual Hosts
This is a very useful way to keep your server organized.
Virtual Hosts On Your Lan
You can practice on your Lan.
Setting up DNS on your Lan
For instance, if your router is running dnsmasq
, this may be as simple
as describing the virtual hosts in /etc/hosts
on the router.
192.168.1.101 blog.devbox blogstatic.devbox
Here's An Example Reverse Proxy for A Flask Blog On Your Lan
# /etc/apache2/sites-enabled/blog.devbox.conf
<VirtualHost *:80>
ServerName blog.devbox
# dont' block LetsEncrypt
# ProxyPass "/.well-known" ! ... not needed on your Lan
# don't block /var/www/html/favicon.ico
ProxyPass "/favicon.ico" !
ProxyPass "/" "http://127.0.0.1:8000/"
ProxyPassReverse "/" "http://127.0.0.1:8000/"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Here's An Example for A Static Blog On Your Lan
# /etc/apache2/sites-enabled/blogstatic.devbox.conf
<VirtualHost *:80>
ServerName blogstatic.devbox
DocumentRoot /var/www/html/blogstatic/site
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Wan Deployment
Set up DNS
Log into your dns provider and create records
- A record for blog.example.com pointing to your ipv4 address
- AAAA record for blog.example.com pointing to your ipv6 address
- A record for blogstatic.example.com pointing to your ipv4 address
- AAAA record for blogstatic.example.com pointing to your ipv6 address
Start With Virtual Hosts for HTTP
You don't need to create virtual hosts for SSL configuration, because CertBot will automatically do that for you.
Reverse Proxy
# /etc/apache2/sites-enabled/blog.example.com.conf
<VirtualHost *:80>
ServerName blog.example.com
# dont' block LetsEncrypt
ProxyPass "/.well-known" !
# don't block /var/www/html/favicon.ico
ProxyPass "/favicon.ico" !
ProxyPass "/" "http://127.0.0.1:8000/"
ProxyPassReverse "/" "http://127.0.0.1:8000/"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Static Site
# /etc/apache2/sites-enabled/blogstatic.example.com.conf
<VirtualHost *:80>
ServerName blogstatic.example.com
DocumentRoot /var/www/html/blogstatic/site
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Get LetsEncrypt Certs
certbot --apache -d blog.example.com -d blogstatic.example.com