When working with Apache 2.2's mod_proxy, a common yet perplexing error emerges in error logs:
[Wed May 18 21:03:29 2011] [error] [client 172.20.10.10] (70007)The timeout specified has expired:
proxy: error reading status line from remote server super-load1-ga.test.com,
referer: https://tester2.test.com/boom/ga/inside.asp
This error typically occurs when:
- The backend server (super-load1-ga.test.com) fails to respond within Apache's configured timeout period
- The TCP connection to the backend server is established but hangs before sending HTTP headers
- Network issues interrupt the connection after establishment but before full response
The default Timeout
directive in httpd.conf (usually 300 seconds) governs this behavior. When the proxy doesn't receive the HTTP status line (like "HTTP/1.1 200 OK") within this period, Apache terminates the connection and logs this error.
As noted in the original scenario, this often coincides with Apache exhausting its MaxClients
. Each hanging proxy connection:
1. Occupies a worker thread
2. Consumes memory buffers
3. Potentially creates backlog in the TCP connection queue
For the given ProxyPass configuration:
ProxyPass /boom/ga https://super-load1-ga.test.com
ProxyPassReverse /boom/ga https://super-load1-ga.test.com
Consider these enhancements:
# Set separate timeouts for connection establishment vs data transfer
Timeout 60
ProxyTimeout 300
# Configure connection pool settings
ProxySet connectiontimeout=5 timeout=300
# Enable connection reuse
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
When debugging persistent issues:
# Enable detailed logging
LogLevel debug
ProxyStatus On
# Add timing headers
Header set X-Backend-Response-Time "%D"
For TCP-level investigation:
# Capture network traffic
tcpdump -i eth0 'host super-load1-ga.test.com and port 443' -w proxy_debug.pcap
When seeing this error pattern:
- Verify backend server's keepalive settings match Apache's
- Consider implementing a reverse proxy health check
- Evaluate if the backend service needs horizontal scaling
Example health check implementation:
ProxyPass /boom/ga-healthcheck !
<Location /boom/ga-healthcheck>
SetHandler server-status
Require ip 127.0.0.1
</Location>
The error message you're seeing in your Apache 2.2 error_log:
[Wed May 18 21:03:29 2011] [error] [client 172.20.10.10] (70007)The timeout specified has expired: proxy: error reading status line from remote server super-load1-ga.test.com
indicates that Apache's mod_proxy is timing out while waiting for a response from your backend server (super-load1-ga.test.com). This typically happens when the backend takes longer to respond than Apache's configured timeout period.
The main timeout-related directives in Apache that affect this behavior are:
Timeout 300 # Default 300 seconds (5 minutes)
ProxyTimeout 300 # Specific timeout for proxy connections
When you see Apache quickly exhausting its MaxClients alongside these timeout errors, it suggests your proxy connections are hanging and tying up worker processes.
Here are several approaches to resolve this:
1. Adjust Timeout Values
# In your httpd.conf or virtual host configuration
Timeout 600
ProxyTimeout 600
This gives your backend more time to respond. However, be cautious about setting this too high as it may lead to resource exhaustion.
2. Implement Health Checks
<Proxy https://super-load1-ga.test.com>
ProxySet enablereuse=on
ProxySet connectiontimeout=5
ProxySet timeout=600
</Proxy>
3. Optimize Proxy Configuration
# More robust proxy configuration
ProxyPass /boom/ga https://super-load1-ga.test.com retry=5 timeout=600 acquire=3000
ProxyPassReverse /boom/ga https://super-load1-ga.test.com
Add these directives to get more detailed proxy debugging information:
LogLevel debug
ProxyErrorOverride On
CustomLog logs/proxy_access_log combined
KeepAlive On
KeepAliveTimeout 15
MaxKeepAliveRequests 100
<Proxy *>
ProxySet keepalive=On
ProxySet acquire=3000
ProxySet timeout=600
</Proxy>
- Verify network connectivity between Apache and backend
- Check backend server logs for slow responses
- Monitor backend server resources (CPU, memory)
- Consider implementing a load balancer if backend is overloaded