This is an original planning guide. It is not a vendor manual, an official standard, or legal advice. Example addresses use documentation ranges. Review every command before you paste it.
Where Apache HTTP Server sits
Apache HTTP Server uses VirtualHost blocks. The test is apachectl configtest, or the equivalent the package installed. Reload only after it passes. Debian-family packages use sites-available. RHEL-family packages often use conf.d. Read the include. Do not maintain both by accident.
AllowOverride and .htaccess let a directory change the server. That is useful and it is slower and easier to forget. Prefer the virtual host file for a setting you can put there. Use .htaccess only when a directory must override and you accept the review cost. The .htaccess generator drafts rules. A draft is not already in force.
The lab virtual host listens on 127.0.0.1:8080 and serves one test page. The web guide explains why the public listener is later. ProxyPass, if you need it, points at an application you run.
Apache is not Nginx. Do not paste a server block or a proxy_pass line here. The converter in the migration guide is how you move, and its output still goes through configtest.
A loopback site you can fetch
Step 1 for Apache HTTP Server is the layout. Find the include for sites or conf.d and put the vhost there. The wrong directory is a silent miss. Check: apachectl -S or the dump of vhosts lists this one. If the check fails, do not reload again and do not point a name at this host. Restore the previous file. The generators for Apache HTTP Server draft a site in the browser and do not open a firewall. Delete every listen-on-every-address line for the lab. Replace prompt-for-this. A config from a neighbouring web server is not this syntax.
Step 2 for Apache HTTP Server is loopback. Listen and VirtualHost on 127.0.0.1:8080 with one document root. You can fetch without opening a public port. Check: The local fetch returns the test page. If the check fails, do not reload again and do not point a name at this host. Restore the previous file. The generators for Apache HTTP Server draft a site in the browser and do not open a firewall. Delete every listen-on-every-address line for the lab. Replace prompt-for-this. A config from a neighbouring web server is not this syntax.
Step 3 for Apache HTTP Server is configtest. Run the config test and read it. A reload of a bad vhost affects the whole server. Check: The test passes, then you reload. If the check fails, do not reload again and do not point a name at this host. Restore the previous file. The generators for Apache HTTP Server draft a site in the browser and do not open a firewall. Delete every listen-on-every-address line for the lab. Replace prompt-for-this. A config from a neighbouring web server is not this syntax.
Step 4 for Apache HTTP Server is overrides. Leave AllowOverride at the tight setting unless a directory must override. A forgotten .htaccess becomes the real config. Check: A search for .htaccess in the tree matches the ticket. If the check fails, do not reload again and do not point a name at this host. Restore the previous file. The generators for Apache HTTP Server draft a site in the browser and do not open a firewall. Delete every listen-on-every-address line for the lab. Replace prompt-for-this. A config from a neighbouring web server is not this syntax.
Step 5 for Apache HTTP Server is modules. Enable only the proxy or rewrite module you are about to use. An unused module is a surface. Check: The module list matches the directives you used. If the check fails, do not reload again and do not point a name at this host. Restore the previous file. The generators for Apache HTTP Server draft a site in the browser and do not open a firewall. Delete every listen-on-every-address line for the lab. Replace prompt-for-this. A config from a neighbouring web server is not this syntax.
# Apache lab. Review before you paste.
# VirtualHost 127.0.0.1:8080
# apachectl configtest before reload.
# Prefer the vhost file. Avoid a new .htaccess unless the ticket says so.
# Do not paste Nginx syntax.
Certificates come after the name is yours
SSLEngine and the certificate paths belong in the virtual host that should speak TLS, on a name you control. The key file mode follows the permissions guide. The ticket does not contain the key.
A lab can stay on HTTP on loopback. You do not need a public certificate to prove the virtual host is loaded.
configtest catches a missing certificate path. Believe it.
What not to paste
A .htaccess file is not the first place to set a redirect you could set in the vhost.
Apache is not IIS and not Nginx. web.config and Nginx directives are the wrong language.
Enabling every module the package offers is not hardening. Enable the modules this site uses.
The hour you stop
Write the hostname, the role, and the clock time before you change Apache HTTP Server. If this host is also serving users, it is not the lab and this first hour belongs on a spare. The provisioning guide is how the spare gets built. A change without a spare is a change you can still postpone.
Keep the console or the out-of-band path open for the whole hour. Reloading a network service, a firewall, or a secure-shell daemon from the only session is how a lab becomes a drive across town. The hardware guide names that path for a physical machine. A virtual machine uses the hypervisor console. A cloud instance uses the serial console the platform gives you. Test it before the reload, not after.
The address 192.0.2.10/24 and the gateway 192.0.2.1 are documentation. They belong in the lab note and nowhere else. On a real network, use the prefix the network desk already assigned. On a cloud instance, use the address the platform assigned and do not hard-code the documentation range into user-data. If a generator filled the documentation address into a production draft, delete it.
prompt-for-this is a reminder that a secret is missing. It is not a password you set, not a token you commit, and not a string you leave in a configuration file because the service started. The real secret lives in the password store. The ticket says who can read it. A file that still contains the reminder is a file you have not finished.
One service is enough for the first hour on Apache HTTP Server. The purpose from the fundamentals page says which service. Every other package stays uninstalled until its own guide has a ticket. A host that enables a web server, a database, and a queue in the first hour has three changes and no proof. Finish the login, the address, and the update. Then stop.
Read the package transaction before you accept it. A count of packages is not a review. If the list contains a repository you did not add, stop. If it contains a kernel, the patch guide's reboot decision applies and the console stays open. If it contains software this role does not need, remove that line from the plan rather than installing it and disabling it later.
The previous image, the previous configuration file, or the previous package version is the rollback. Write the path down while the host still works. A rollback you invent after a failed reload is a guess. The migration guide assumes the old copy is still there. Do not delete it in the same hour to free a disk.
When the checks pass, copy the notes into the ticket and leave the host alone. The next host waits until a second person can repeat the login and the address from the notes. A fleet built from memory drifts. A fleet built from the file the provisioning guide stored stays boring, which is the point of Apache HTTP Server in production.
If a step on Apache HTTP Server fails twice, stop for the day. The failure is the result. Adding a forum command beside a half-applied config produces a host nobody can rebuild. Rebuild from the image instead. The time you lose is smaller than the time you will spend explaining the hybrid.
Hand the finished lab to the guide that matches the role: web, mail, storage, backup, or hardening. Apache HTTP Server being installed is not the same as the role being ready. The role guide has its own proof. Do not skip it because the package manager exited without an error.
A second person reads the hostname, the address, and the rollback path aloud before you build the next host. If they cannot find those three in the ticket, the notes are not done. Silence is not agreement. The check is the sentence they repeat back.
Store the working notes next to the image version. A month from now Apache HTTP Server will still boot from that pair, and the chat where you remembered a flag will be gone. The file is the memory. The host is replaceable. That is the whole point of writing this hour down.
Apache HTTP Server checks before a public listener
Confirm this before you call the change done: Apache HTTP Server is the process that is listening, confirmed on the host. The lab site binds to 127.0.0.1, not to every address. The config test passed before the reload. A fetch of the test page from the host itself succeeded. The admin or dashboard port is not reachable from a public address. The document root is readable by the worker and not writable by it. No certificate was requested for a name you do not control. The generator draft was edited until it matched this file. The previous config is saved. prompt-for-this was not left in a password field. Logs from the test do not contain a secret. A second person read the listen address. apachectl configtest passed on the file you reloaded. No Nginx directive is in the vhost. .htaccess is absent or listed in the ticket. And the listen address is loopback for the lab. If one of those fails, stop.
Tools for this guide
These tools run in the browser on this site. They do not log into your machines.
- Apache HTTP Server Virtual Host Config Generator
- Apache HTTP Server Reverse Proxy Config Generator
- Apache HTTP Server SSL/TLS Config Generator
Related pillar guides
Guides in this cluster
These supporting pages belong to this pillar.
- Cheat Sheet: Apache HTTP Server Config Cheat Sheet
- Troubleshooting: Apache HTTP Server Troubleshooting Guide
- How-To: How to Configure Virtual Host on Apache HTTP Server
- How-To: How to Configure Reverse Proxy on Apache HTTP Server
- How-To: How to Configure SSL/TLS on Apache HTTP Server
- How-To: How to Configure HTTP to HTTPS Redirect on Apache HTTP Server
- How-To: How to Configure WWW Redirect on Apache HTTP Server
- How-To: How to Configure Gzip & Brotli Compression on Apache HTTP Server
- How-To: How to Configure Browser Caching on Apache HTTP Server
- How-To: How to Configure Rate Limiting on Apache HTTP Server
- How-To: How to Configure Basic Authentication on Apache HTTP Server
- How-To: How to Configure Security Headers on Apache HTTP Server
- How-To: How to Configure CORS on Apache HTTP Server
- How-To: How to Configure WebSocket Proxy on Apache HTTP Server
- How-To: How to Configure PHP-FPM on Apache HTTP Server
- How-To: How to Configure IP Allow/Deny on Apache HTTP Server
- How-To: How to Configure Custom Error Pages on Apache HTTP Server
- How-To: How to Configure URL Rewrite on Apache HTTP Server
- How-To: How to Configure Access Log Format on Apache HTTP Server
- How-To: How to Configure Static Site Hosting on Apache HTTP Server
- How-To: How to Configure Maintenance Mode on Apache HTTP Server
- How-To: How to Configure Hotlink Protection on Apache HTTP Server
- How-To: How to Configure Directory Listing Control on Apache HTTP Server
- How-To: How to Configure Request Size Limits on Apache HTTP Server
- How-To: How to Configure Timeout Tuning on Apache HTTP Server
- How-To: How to Configure Multiple Sites on One Server on Apache HTTP Server