Infelizmente, parece que esse é um bug conhecido do Apache e do código mod_proxy: link
Eu mudei para uma solução alternativa agora.
Eu tenho um servidor web (instância do Amazon Linux EC2 executando o Apache2), vamos chamá-lo de "servidor A", no qual configurei o proxy reverso usando:
# (All the appropriate modules are loaded higher up in the conf file)
# ...
ProxyRequests off
ProxyPass /booth5/ http://localhost:8005/
ProxyHTMLURLMap http://localhost:8005 /booth5
<location /booth5/>
ProxyPassReverse /
SetOutputFilter proxy-html
ProxyHTMLURLMap / /booth5/
ProxyHTMLURLMap /booth5 /booth5
RequestHeader unset Accept-Encoding
</location>
Em que localhost:8005
é uma porta encaminhada através de uma conexão ssh com um servidor localizado atrás de um firewall.
Essa configuração funciona bem e é executada por um tempo, mas depois de algum tempo o servidor A não envia novas solicitações para o servidor proxy.
As conexões do servidor com o servidor proxy estão permanecendo:
# netstat -napt | grep 8005
tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 22675/sshd
tcp 1 0 127.0.0.1:38860 127.0.0.1:8005 CLOSE_WAIT 28910/httpd
tcp 1 0 127.0.0.1:39453 127.0.0.1:8005 CLOSE_WAIT 28548/httpd
tcp 1 0 127.0.0.1:44596 127.0.0.1:8005 CLOSE_WAIT 28542/httpd
tcp 1 0 127.0.0.1:38774 127.0.0.1:8005 CLOSE_WAIT 28549/httpd
tcp 1 0 127.0.0.1:39997 127.0.0.1:8005 CLOSE_WAIT 29889/httpd
tcp 1 0 127.0.0.1:39135 127.0.0.1:8005 CLOSE_WAIT 28544/httpd
tcp 0 0 ::1:8005 :::* LISTEN 22675/sshd
Acredito que isso esteja "esgotando" todos os canais no túnel ssh e quero que o servidor A se comporte de forma a enviar solicitações http para o servidor proxy, conforme necessário, mas depois limpa as conexões.
Inicialmente, suspeitei que isso se devesse ao Apache no servidor proxy, fazendo conexões persistentes, então atualizei a configuração para incluir:
# Timeout: The number of seconds before receives and sends time out.
# Timeout 300
Timeout 30
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
KeepAlive On
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#MaxKeepAliveRequests 100
MaxKeepAliveRequests 6
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
KeepAliveTimeout 5
Ainda não tentei definir KeepAlive Off
. Eu estava tentando obter algum benefício de conexões curtas / persistentes, mas elas não estão fechando.
A configuração do Apache é o local correto para resolver isso? Em vez disso, é parte da configuração do ssh para o túnel? (config para que pode ser fornecido, se necessário).
Infelizmente, parece que esse é um bug conhecido do Apache e do código mod_proxy: link
Eu mudei para uma solução alternativa agora.