Apache is not starting up
Troubleshooting Apache Startup Failures: A Comprehensive Guide by revWhiteShadow
Experiencing an Apache server that refuses to start after a configuration reload can be a frustrating and time-consuming ordeal, especially when the core configuration appears sound. At revWhiteShadow, we understand the critical nature of a functional web server and the impact that downtime can have. When you encounter the perplexing error “Apache is not starting up” after executing commands like sudo service httpd reload, it’s crucial to have a systematic approach to diagnose and resolve the issue. We’ve meticulously analyzed common causes and provide in-depth solutions to get your Apache HTTP Server back online swiftly and efficiently.
Your observation that sudo httpd -t (or sudo httpd -d if that’s what you’ve configured) reports your configuration as “OK” is a common starting point. This command verifies the syntax of your configuration files but doesn’t always expose runtime issues or permission discrepancies that prevent the server from binding to ports or writing log files. The provided snippet from your /var/log/httpd/error_log is particularly telling, highlighting the core problem: AH00015: Unable to open logs and subsequently AH00019: Unable to open logs, exiting. This clearly indicates that Apache cannot create or write to the specified log files, which is a critical failure preventing startup.
The specific error message (13)Permission denied: AH00091: httpd: could not open error log file /var/www/html/logs/error.log. points directly to a permission issue preventing the apache user (or the user Apache runs as) from accessing or creating the log directory and its files. Let’s delve into the likely causes and how to rectify them.
Understanding the Apache Startup Process and Common Pitfalls
Apache’s startup sequence involves several critical steps. It must initialize its modules, read configuration files, bind to network sockets (ports), and then begin listening for incoming requests. During this process, it relies on being able to write to its log files for operational messages and error reporting. If any of these steps fail, Apache will terminate.
The errors you’re seeing are predominantly related to:
- Log File Access: Apache needs to write to its
ErrorLogandCustomLogfiles. If the directory or the files within it do not have the correct permissions for the user Apache runs as, startup will fail. - Virtual Host Configuration: While your
httpd -ttest might pass, a misconfiguration within a virtual host file, particularly regardingErrorLogorCustomLogpaths, can lead to these issues. - SELinux Contexts: On systems like CentOS or RHEL, Security-Enhanced Linux (SELinux) can impose strict access controls that might prevent Apache from accessing directories or files even if traditional file permissions appear correct.
- Firewall Restrictions: While less likely to cause a “permission denied” error for log files, an improperly configured firewall can prevent Apache from binding to its listening port, leading to a different set of startup errors.
Deep Dive into Log File Permissions and Directory Structure
Your ll /var/www/ output shows that cgi-bin and html directories are owned by root:root with standard read/execute permissions. This is typical. However, the critical directive in your virtual host file is:
ErrorLog /var/www/html/logs/error.log
CustomLog /var/www/html/logs/requests.log combined
This directive explicitly tells Apache to use log files located within a logs subdirectory inside /var/www/html.
Verifying and Correcting Log Directory Permissions
The primary culprit for the “permission denied” error when opening log files is that the apache user does not have the necessary permissions to create the logs directory itself, or to write files within it. Even though /var/www/html might be accessible, the sub-directory logs might not exist, or its parent directories might have restrictive permissions that prevent the apache user from creating it.
Check for the
logsdirectory: First, confirm if thelogsdirectory actually exists within/var/www/html.ls -ld /var/www/html/logsIf this command returns “No such file or directory,” this is your primary issue. Apache cannot create this directory by default.
Create the
logsdirectory and set appropriate permissions: You need to create thelogsdirectory and ensure theapacheuser has write permissions to it. The most straightforward way to achieve this is by creating the directory and then changing its ownership and permissions.Create the directory:
sudo mkdir /var/www/html/logsSet ownership to the Apache user: The Apache user on most systems is
apache. We need to ensure this user owns the directory and its contents.sudo chown apache:apache /var/www/html/logsSet permissions for writing: The
apacheuser needs read, write, and execute permissions on thelogsdirectory to create files within it.sudo chmod 755 /var/www/html/logs(This grants read and execute to others, and full permissions to the owner). Alternatively,
chmod 700would restrict access to only the owner. However,755is often sufficient and allows read access for other potential administrative tasks.
Ensuring Parent Directory Accessibility
While less common, it’s worth ensuring that the apache user can traverse up to the logs directory. The html directory and its parents (/var/www, /var) generally have permissive enough settings, but it’s good practice to verify.
- Check permissions for
/var/www/html:It should have execute permissions for thels -ld /var/www/htmlapacheuser to traverse into it.drwxr-xr-x(755) is standard and should be fine.
Reapplying Configuration and Testing
After making these changes, attempt to restart Apache:
sudo service httpd restart
Or if you prefer a graceful reload, although a full restart is often better for resolving startup issues:
sudo service httpd reload
Now, tail the error log again to see if the “permission denied” error for logs has disappeared:
sudo tail -f /var/log/httpd/error_log
If Apache starts successfully, you’ve identified and resolved the primary issue.
Addressing Potential SELinux Context Issues
If the above permission changes do not resolve the problem, SELinux is a very strong candidate for the cause. SELinux operates on a principle of mandatory access control, assigning security contexts to files, directories, and processes. By default, Apache (httpd_t context) is restricted in where it can read, write, and execute. The httpd_t context typically allows writing to /var/log, but custom locations like /var/www/html/logs might not have the correct context by default.
Checking SELinux Status and Booleans
First, check if SELinux is enforcing:
sestatus
If it’s in enforcing mode, it’s actively restricting access.
You can temporarily set SELinux to permissive mode to test if it’s the cause. Note: This is for testing only; do not leave SELinux in permissive mode on production systems.
sudo setenforce 0
Then, try restarting Apache. If it starts, SELinux is indeed the culprit. Remember to set it back to enforcing:
sudo setenforce 1
Setting Correct SELinux Contexts for Log Files
To allow Apache to write logs to /var/www/html/logs, you need to assign the correct SELinux context to this directory. The httpd_log_t context is appropriate for log directories used by Apache.
Set the
httpd_log_tcontext recursively:sudo semanage fcontext -a -t httpd_log_t "/var/www/html/logs(/.*)?"This command adds a file context rule for the
/var/www/html/logsdirectory and anything within it.Apply the context changes: After defining the context, you need to apply it to the filesystem.
sudo restorecon -Rv /var/www/html/logsThe
-Rflag applies recursively, and-vshows the changes being made.Verify the context: Check if the context has been applied correctly:
ls -Zd /var/www/html/logsYou should see something like
unconfined_u:object_r:httpd_log_t:s0or similar, indicating the correct context.
After applying the SELinux context, try restarting Apache again:
sudo service httpd restart
Understanding and Adjusting SELinux Booleans
There are also SELinux booleans that control specific behaviors of services. For example, httpd_can_network_connect might be relevant if you’re doing anything network-related, but for basic log writing, context is usually the primary concern. You can list relevant booleans with:
sudo getsebool -a | grep httpd
If you suspect a boolean issue, consult SELinux documentation or search for specific booleans related to your setup. For instance, httpd_enable_homedirs could be relevant if you were serving user home directories, but not for logs.
Reviewing Virtual Host Configuration Details
While your main httpd.conf looks standard, let’s re-examine your virtual host file for any subtle issues that might manifest during a reload.
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html
ErrorLog /var/www/html/logs/error.log
CustomLog /var/www/html/logs/requests.log combined
</VirtualHost>
This configuration is straightforward and generally correct. However, consider these points:
- Typos: Double-check for any accidental typos in directory paths or directive names. Even a single misplaced character can cause issues.
- Directory directives for DocumentRoot: Ensure that the
DocumentRootpath (/var/www/html) is covered by a<Directory>block in your main configuration or included files that grants sufficient permissions (likeRequire all granted). Yourhttpd.confincludes:This looks correct and should allow Apache to access<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>/var/www/html. The issue is more likely with creating thelogssubdirectory and its files. - Port Conflicts: Ensure no other service is using port 80. This typically results in a different error during startup (e.g.,
Address already in use), but it’s a fundamental check. You can usesudo netstat -tulnp | grep :80to see what’s listening on port 80.
Firewall Considerations
Your mention of the firewall is valid, although typically a firewall blocks external access to a port, not the server’s ability to write log files. However, if Apache is failing to bind to port 80 due to a firewall rule that somehow interferes with the socket binding process (highly unlikely, but worth a mention), it would prevent startup.
Check
firewalld(Common on CentOS/RHEL):sudo firewall-cmd --list-allEnsure
httporhttps(depending on your configuration) is listed underservicesfor the active zone. If not, add it:sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reloadCheck
iptables: If you’re not usingfirewalld, checkiptablesrules:sudo iptables -L -n -vLook for rules that might explicitly deny traffic on port 80.
Again, firewall issues usually present as connection refusals rather than “permission denied” errors for log files.
Alternative Logging Locations and Configurations
If you continue to face issues with /var/www/html/logs, consider using the default logging locations managed by the system, which often have correct permissions and SELinux contexts by default.
Your httpd.conf has these directives:
ErrorLog "logs/error_log"
CustomLog "logs/access_log" combined
If you were not using a virtual host that overrides these, Apache would use these relative paths. The key is that these paths are relative to ServerRoot, which is /etc/httpd. So, these would resolve to /etc/httpd/logs/error_log and /etc/httpd/logs/access_log. These directories usually exist and have the correct permissions out-of-the-box.
Switching to Default Log Locations Temporarily
To isolate the issue, you could temporarily comment out the ErrorLog and CustomLog directives in your virtual host file and rely on the global ones in httpd.conf.
# VirtualHost *:80>
#
# ServerName www.example.com
# ServerAlias example.com
# DocumentRoot /var/www/html
# # ErrorLog /var/www/html/logs/error.log
# # CustomLog /var/www/html/logs/requests.log combined
#</VirtualHost>
Then, ensure your httpd.conf has valid ErrorLog and CustomLog directives pointing to the /etc/httpd/logs directory:
ErrorLog "logs/error_log"
CustomLog "logs/access_log" combined
And that /etc/httpd/logs has the correct permissions and SELinux contexts. Restart Apache. If it starts, it confirms that the problem lies specifically with the custom log file path in your virtual host configuration. You can then re-address the permissions and SELinux contexts for /var/www/html/logs.
Advanced Debugging with strace
If all else fails, and you need to go deeper, strace can be invaluable. It traces system calls and signals. You can use it to see exactly which system call is failing for Apache when it tries to open the log file.
Start Apache in the foreground with debugging:
sudo httpd -D FOREGROUNDThis will keep Apache running in the foreground, printing errors directly to your terminal.
Attach
straceto the Apache process: While Apache is running in the foreground (or if you can identify its PID), you can usestraceto monitor its activity. Find the PID of the httpd process:pgrep httpdLet’s assume the PID is
12345. Then run:sudo strace -p 12345 -e trace=open,openat,write,closeThis will show you all attempts to open, write, and close files. Look for lines indicating failure (often returning
-1witherrnolikeEACCESfor permission denied).
This is a more advanced technique but can pinpoint the exact operation that is failing.
Summary of Key Actions
To recap, the most probable cause for Apache not starting up with the error AH00015: Unable to open logs after a reload, despite httpd -t passing, is a permission or SELinux context issue with the specified log directory in your virtual host file (/var/www/html/logs).
Here’s a checklist to ensure your Apache server starts correctly:
- Verify and Create Log Directory: Ensure
/var/www/html/logsexists. If not, create it:sudo mkdir /var/www/html/logs. - Set Ownership: Assign ownership of the log directory to the Apache user:
sudo chown apache:apache /var/www/html/logs. - Set Permissions: Grant appropriate permissions:
sudo chmod 755 /var/www/html/logs. - Check/Apply SELinux Context: Ensure the directory has the correct SELinux context (
httpd_log_t):sudo semanage fcontext -a -t httpd_log_t "/var/www/html/logs(/.*)?"sudo restorecon -Rv /var/www/html/logs
- Restart Apache: Attempt a full restart:
sudo service httpd restart. - Monitor Logs: Check
/var/log/httpd/error_logfor any new errors. - Firewall: Briefly verify firewall rules if other steps fail, though unlikely to be the cause of this specific error.
By systematically addressing these potential issues, particularly the log file permissions and SELinux contexts, you should be able to resolve the “Apache is not starting up” problem and restore your web server’s functionality. At revWhiteShadow, our goal is to provide clear, actionable solutions to keep your online presence robust and operational.