Apache error codes are three-digit numbers returned by the Apache web server when something goes wrong during the processing of HTTP requests.
Some common Apache error codes include:
200 – OK
A 200 response code means the connection has been successful and the browser will serve the websites content.
You can see these in the access log files.
143.244.42.95 - - [16/Mar/2023:15:21:48 +0000] "GET / HTTP/1.0" 200 109196 "http://mydomain.io/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
206 – Partial Content
This code explains that the connection is only requesting parts of the website such as just the code with a wget command, this code can be fairly common.
301 – Moved Permanently
This code lets the browser know that the url has been moved permanently to a new location and to forward all future request to the new location.
302 – Moved Temporarily
This code is very similar to 301 but instead of a permanent move, it is temporary.
303 – See Other
This code is a way to redirect web applications to a new URL.
304 – Not Modified
This indicates that the browser has a cached copy of the website and the website has not had any modications since the browsers last visit.
400 – Bad Request
The server is not able to process the clients request due to something wrong with the client (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
401 – Unauthorized
Similar to 403 Forbidden, but specifically for when authentication is required to continue to the website.
403 – Forbidden
The request was valid, however the server is refusing the connection due to configuration settings.
404 – Not Found
The file requested resource could not be found but may be available again in the future. You might also run into a few other error codes that convey the same thing. Common variants include “Page Not Found” or “File Not Found.” Depending on which website you’re browsing, you might also see messages like “Product not Found.”
So, let’s take a look at some things you can do to try to fix a 404 error. In most cases, it’s likely that the page you’re looking for was moved or deleted. But, you can try this on the client end.
Refresh the Page
Double Check the Address
Perform a Search
Clear Your Browser Cache
Change your DNS Server
Check if the Website Has Temporary Issues
405 – Method Not Allowed
A request was made to the website which was different than it was programmed to handle such as using GET on a form which requires data to be presented via POST, or using PUT on a read-only resource.
406 – Not Acceptable
This code means that the server has blocked the request via mod_security.
413 – Request Entity Too Large
The request is larger than the server is willing or able to process.
500 – Internal Server Error
This error is generally specific to something written in the .htaccess file that is not valid syntax or the website file permissions are in correct.
501 – Not Implemented
The server was not programmed to handle the type of request, or it was not able to fulfill the request.
Now that we have the codes, let’s take a look at how to check for errors.
The commands that you will commonly use to troubleshoot Apache across most Linux distributions are:
systemctl – Used to control and interact with Linux services via the systemd service manager.
journalctl – Used to query and view the logs that are generated by systemd.
apachectl – When troubleshooting, this command is used to check Apache’s configuration.
Generally when you are troubleshooting Apache, you will use these commands in the order indicated here, and then examine log files for specific diagnostic data.
systemctl
Commands for Apache
On Ubuntu and Debian.
sudo systemctl status apache2.service -l --no-pager
The -l
flag will ensure that output is not truncated or ellipsized. The --no-pager
flag will make sure that output will go directly to your terminal without requiring any interaction on your part to view it.
Output
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-03-14 15:14:14 CDT; 1 day 18h ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 577 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Process: 7904 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
Main PID: 606 (apache2)
Tasks: 6 (limit: 2337)
Memory: 36.8M
CPU: 9.846s
CGroup: /system.slice/apache2.service
├─ 606 /usr/sbin/apache2 -k start
├─7909 /usr/sbin/apache2 -k start
├─7910 /usr/sbin/apache2 -k start
├─7911 /usr/sbin/apache2 -k start
├─7912 /usr/sbin/apache2 -k start
└─7913 /usr/sbin/apache2 -k start
Mar 14 15:14:12 my.hostname.io systemd[1]: Starting The Apache HTTP Server...
To inspect the Apache process on CentOS and Rocky systems run:
sudo systemctl status httpd.service -l --no-pager
Make a note of the “Active line” in the output. If your Apache server does not show active (running) there may be an error. If there is a problem, you will have a line like the following in your output (note the highlighted failed portion):
Active: failed (Result: exit-code) since Tue 2020-07-14 20:01:29 UTC; 1s ago
If there is an error it may look like the following:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2023-03-16 10:15:04 CDT; 1min 7s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 9835 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
CPU: 23ms
Mar 16 10:15:04 my.hostname.io systemd[1]: Starting The Apache HTTP Server...
Mar 16 10:15:04 my.hostname.io apachectl[9838]: AH00526: Syntax error on line 93 of /etc/apache2/apache2.conf:
Mar 16 10:15:04 my.hostname.io apachectl[9838]: Invalid command 'Time', perhaps misspelled or defined by a module not included in the server configuration
Mar 16 10:15:04 my.hostname.io apachectl[9835]: Action 'start' failed.
Mar 16 10:15:04 my.hostname.io apachectl[9835]: The Apache error log may have more information.
Mar 16 10:15:04 my.hostname.io systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
Mar 16 10:15:04 my.hostname.io systemd[1]: apache2.service: Failed with result 'exit-code'.
Mar 16 10:15:04 my.hostname.io systemd[1]: Failed to start The Apache HTTP Server.
From here we can see the error and correct it:
Mar 16 10:15:04 my.hostname.io apachectl[9838]: AH00526: Syntax error on line 93 of /etc/apache2/apache2.conf:
journalctl
Commands for Apache
To inspect the systemd
logs for Apache, you can use the journalctl
command. The systemd
logs for Apache will usually indicate whether there is a problem with starting or managing the Apache process.
These logs are separate from Apache’s request and error logs. journalctl
displays logs from systemd
that describe the Apache service itself, from startup to shutdown, along with any process errors that may be encountered along the way.
On Ubuntu and Debian
sudo journalctl -u apache2.service --since today --no-pager
The --since today
flag will limit the output of the command to log entries beginning at 00:00:00 of the current day only. Using this option will help restrict the volume of log entries that you need to examine when checking for errors. You should receive output like the following:
Output for a successful start
Journal file /var/log/journal/6639af0b46c646bea8905dc9470e5494/system@0005f4acc1d412c5-8cf425b3c42a967e.journal~ is truncated, ignoring file.
-- Journal begins at Fri 2022-09-23 21:48:54 CDT, ends at Thu 2023-03-16 09:56:58 CDT. --
Mar 16 00:00:41 my.hostname.io systemd[1]: Reloading The Apache HTTP Server.
Mar 16 00:00:41 my.hostname.io systemd[1]: Reloaded The Apache HTTP Server.
If you are using a CentOS or Fedora based system, use this version of the command:
sudo journalctl -u httpd.service --since today --no-pager
Output
Jul 14 20:13:09 centos8 systemd[1]: Starting The Apache HTTP Server...
. . .
Jul 14 20:13:10 centos8 httpd[21591]: Server configured, listening on: port 80
If there is an error, you will have a line in the output that is similar to the following:
Mar 16 10:15:04 centos8 systemd[1]: Failed to start The Apache HTTP Server.
If your Apache server has errors in the journalctl logs the next step to troubleshoot using the apachectl command line tool.
apachectl
Run the command like this on Ubuntu, Debian, CentOS, and Fedora based distributions:
sudo apachectl configtest
Output for success
Syntax OK
If there is an error in your Apache configuration, apachectl will detect it and attempt to notify you.
Here is an error for example:
AH00526: Syntax error on line 93 of /etc/apache2/apache2.conf:
Invalid command 'Time', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
The Apache error log may have more information.
In this example the there is a Syntax error on line 93 of /etc/apache2/apache2.conf.
Apache Log Files
The log files are a goldmine for information.
For errors on a Fedora, CentOS, or RedHat server, examine the /var/log/httpd/error_log file.
For Debian or Ubuntu derived system, examine /var/log/apache2/error.log for errors.
Use “tail” to view logs:
Tail Examples
Tail the log in real time allow you to load the page to see the errors live.
Debian or Ubuntu
sudo tail -f /var/log/apache2/error.log
View the last 5 lines:
sudo tail -n 5 /var/log/apache2/error.log
On CentOS or Rocky
sudo tail -f /var/log/httpd/error_log
View the last 5 lines:
sudo tail -n 5 /var/log/httpd/error_log
Read the information to see if there is a specific error.