Introduction
Apache 500 Internal Server Error is a generic error indicating the server encountered an unexpected condition. The actual cause is logged in Apache's error log and requires investigation to identify.
Symptoms
Browser error:
``` Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request. ```
curl test:
```bash $ curl -I http://example.com
HTTP/1.1 500 Internal Server Error Content-Type: text/html; charset=iso-8859-1 ```
Apache error log:
```bash $ tail /var/log/apache2/error.log
[Mon Apr 15 10:00:00.123456 2024] [core:error] [pid 12345] [client 1.2.3.4:12345] AH00126: Invalid URI in request GET /path HTTP/1.1 ```
Common Causes
- 1..htaccess syntax error - Invalid directives or rules
- 2.File permissions - Wrong ownership or mode
- 3.PHP errors - Fatal errors in PHP scripts
- 4.Missing modules - Required Apache module not loaded
- 5.Configuration errors - Invalid Apache configuration
- 6.Resource limits - Memory or process limits exceeded
- 7.Script errors - CGI, Python, or other script failures
Step-by-Step Fix
Step 1: Check Apache Error Log
```bash # Check recent errors tail -50 /var/log/apache2/error.log
# Follow error log in real-time tail -f /var/log/apache2/error.log
# Search for specific error grep -i "error|fatal|syntax" /var/log/apache2/error.log | tail -20
# Check virtual host specific error log tail -50 /var/www/example.com/logs/error.log ```
Step 2: Enable Verbose Error Logging
```apache # In Apache configuration or .htaccess LogLevel debug
# For specific module LogLevel php:debug LogLevel ssl:debug
# Restart Apache to apply systemctl restart apache2 ```
Step 3: Check .htaccess Syntax
```bash # Check .htaccess syntax apache2ctl configtest
# Common .htaccess errors: # - Invalid directive # - Missing module # - Rewrite rule syntax error
# Temporarily disable .htaccess to test mv /var/www/html/.htaccess /var/www/html/.htaccess.bak
# If error goes away, .htaccess is the problem ```
```apache # Fix common .htaccess errors:
# Wrong: RewriteRule ^(.*)$ index.php?param=$1 [L] # Missing RewriteEngine On
# Correct: RewriteEngine On RewriteRule ^(.*)$ index.php?param=$1 [L]
# Check for typos in directives # php_value vs php_flag php_value upload_max_filesize 10M php_flag display_errors Off ```
Step 4: Check File Permissions
```bash # Check directory permissions ls -la /var/www/html/
# Correct permissions for web content chown -R www-data:www-data /var/www/html find /var/www/html -type d -exec chmod 755 {} \; find /var/www/html -type f -exec chmod 644 {} \;
# For writable directories chmod 775 /var/www/html/uploads
# Check .htaccess permissions chmod 644 /var/www/html/.htaccess ```
Step 5: Check PHP Errors
```bash # Enable PHP error display (development only) # In .htaccess: php_flag display_errors on php_value error_reporting 32767
# Or in php.ini: display_errors = On error_reporting = E_ALL
# Check PHP error log tail -f /var/log/php_errors.log
# Check for PHP fatal errors grep -i "fatal|parse|syntax" /var/log/php_errors.log
# Test PHP configuration php -v php -m | grep -i required_module ```
Step 6: Check Apache Modules
```bash # List loaded modules apache2ctl -M
# Check if required module is loaded apache2ctl -M | grep rewrite apache2ctl -M | grep ssl apache2ctl -M | grep php
# Enable missing module a2enmod rewrite a2enmod ssl a2enmod php8.1
# Restart Apache systemctl restart apache2 ```
Step 7: Check Apache Configuration
```bash # Test Apache configuration apache2ctl configtest
# Check virtual host configuration apache2ctl -S
# Check main configuration cat /etc/apache2/apache2.conf
# Check virtual host file cat /etc/apache2/sites-enabled/example.com.conf
# Reload configuration systemctl reload apache2 ```
Step 8: Check Resource Limits
```bash # Check Apache memory usage ps aux | grep apache2 | awk '{sum+=$6} END {print "Total Memory: " sum/1024 " MB"}'
# Check current limits ulimit -a
# Check MaxRequestWorkers setting grep -r "MaxRequestWorkers|MaxClients" /etc/apache2/
# Increase if needed # In /etc/apache2/mods-enabled/mpm_prefork.conf: MaxRequestWorkers 150 ServerLimit 150
# Check if hitting limits apachectl fullstatus ```
Step 9: Check Script Errors
```bash # For CGI scripts # Check script permissions ls -la /usr/lib/cgi-bin/
# CGI scripts need execute permission chmod +x /usr/lib/cgi-bin/script.cgi
# Check shebang line head -1 /usr/lib/cgi-bin/script.cgi # Should be: #!/usr/bin/perl or #!/usr/bin/python
# Test script directly /usr/lib/cgi-bin/script.cgi
# Check CGI error log tail -f /var/log/apache2/error.log | grep CGI ```
Step 10: Debug with Simplified Configuration
```apache # Create minimal test configuration <VirtualHost *:80> ServerName test.example.com DocumentRoot /var/www/test
<Directory /var/www/test> Options -Indexes AllowOverride None Require all granted </Directory>
ErrorLog ${APACHE_LOG_DIR}/test_error.log CustomLog ${APACHE_LOG_DIR}/test_access.log combined </VirtualHost>
# Create test page echo "<?php phpinfo(); ?>" > /var/www/test/index.php
# Enable site and test a2ensite test systemctl reload apache2 curl http://test.example.com ```
Common 500 Error Causes
| Error Message | Cause | Solution |
|---|---|---|
| Invalid command | Unknown directive | Check module, fix typo |
| Permission denied | File permissions | Fix ownership/mode |
| Segmentation fault | Memory/process issue | Increase resources |
| Premature end of script headers | CGI failure | Fix script, permissions |
| MaxRequestWorkers | Connection limit | Increase limit |
Verification
```bash # After fixing the error # Test configuration apache2ctl configtest
# Should show: Syntax OK
# Restart Apache systemctl restart apache2
# Test site curl -I http://example.com
# Should show: HTTP/1.1 200 OK
# Check error log for new errors tail -10 /var/log/apache2/error.log
# Should show no recent errors ```
Prevention
To prevent Apache 500 internal server error issues from recurring, implement these proactive measures:
1. Monitor Apache Error Rate
groups:
- name: apache-errors
rules:
- alert: ApacheHigh500Errors
expr: |
rate(apache_responses_total{status="500"}[5m]) > 0.01
for: 2m
labels:
severity: warning
annotations:
summary: "High rate of Apache 500 errors"2. Validate Configuration Before Reload
```bash # Always test before reload apache2ctl configtest && systemctl reload apache2
# Or use graceful restart apache2ctl graceful
# Create pre-commit hook for config files cat << 'EOF' > .git/hooks/pre-commit #!/bin/bash if git diff --cached --name-only | grep -q "apache.*\.conf"; then apache2ctl configtest || exit 1 fi EOF ```
3. Set Up Log Monitoring
```bash # Monitor error log for critical issues tail -f /var/log/apache2/error.log | grep -E "(error|critical|alert)"
# Set up log rotation # /etc/logrotate.d/apache2: /var/log/apache2/*.log { daily missingok rotate 14 compress delaycompress notifempty create 640 root adm } ```
Best Practices Checklist
- [ ] Monitor Apache 500 error rate
- [ ] Validate configuration before reload
- [ ] Set up log monitoring
- [ ] Test configuration changes in staging
- [ ] Keep modules updated
- [ ] Use graceful restarts
Related Issues
- [Fix Apache 403 Forbidden Access](/articles/fix-apache-403-forbidden-access)
- [Fix Apache mod_rewrite Loop](/articles/fix-apache-mod-rewrite-loop)
- [Fix Apache SSL Certificate Not Found](/articles/fix-apache-ssl-certificate-not-found)
Related Articles
- [WordPress troubleshooting: Fix CloudFormation Access Denied 403 - C](fix-cloudformation-access-denied-403-u1p0)
- [WordPress troubleshooting: Fix EC2 Configuration Error - Complete T](fix-ec2-configuration-error-szi0)
- [WordPress troubleshooting: Fix CloudFormation Configuration Error -](fix-cloudformation-configuration-error)
- [WordPress troubleshooting: Fix ELB Configuration Error - Complete T](fix-elb-configuration-error-2d3l)
- [WordPress troubleshooting: Fix S3 Access Denied 403 - Complete Trou](fix-s3-access-denied-403-g5cv)
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Fix Apache 500 Internal Server Error", "description": "Troubleshoot Apache 500 internal server errors. Check error logs, fix .htaccess issues, and correct permissions.", "url": "https://www.fixwikihub.com/fix-apache-500-internal-server-error", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2026-04-04T01:47:48.759Z", "dateModified": "2026-04-04T01:47:48.759Z" } </script>