Bug #2259
lighttpd does not send a 301 redirect immediately when proxying to Apache
| Status: | Reopened | Start date: | 2010-09-17 | ||
|---|---|---|---|---|---|
| Priority: | Normal | Due date: | |||
| Assignee: | - | % Done: | 50% | ||
| Category: | mod_proxy | ||||
| Target version: | 1.4.33 | ||||
| Missing in 1.5.x: | No |
Description
I am using lighttpd as a proxy to an Apache backend. In MediaWiki if a 301 is issued, the redirect takes 15 seconds to complete. This is because by default Apache's KeepAlive timeout is 15 seconds; so lighttpd waits for the connection to be closed, when it should send the redirect to the client right away.
If I lower the keep alive of Apache, then it takes that number of seconds for the redirect to come to the client (eg, setting the keep alive timeout to 5 seconds makes the redirect take 5 seconds), so the problem is clearly that lighttpd waits until the connection is closed.
A redirect taking 15 seconds is of course problematic.
Note that with a 302, this behavior does not happen.
Tested under vanilla-1.4.28.
Associated revisions
Fix mod_proxy waiting for response even if content-length is 0 (fixes #2259)
History
#1 Updated by stbuehler over 2 years ago
Ok, i can reproduce it:
Run a "webserver" to generate 301 responses:
while true; do (echo -en 'HTTP/1.1 301 Moved Permanently\r\nLocation: XYZ\r\nContent-Length: 0\r\n\r\n'; cat) | nc -4 -v -l localhost 8080; echo Connection closed; done
(Press CTRL-D to close an accepted connection)
Lighty config:
proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => 8080 ) ) )
#2 Updated by nitrox over 2 years ago
- Priority changed from High to Normal
Don´t use "High" if it isn´t a severe bug!
Normaly a Status: 301 + Location headers would be all thats needed. Though a manual link in the body section is for users whose browsers do not support this feature. So we need to wait for the body part.
#3 Updated by stbuehler over 2 years ago
We do not really care about such users :)
And we certainly have to respect Content-Length: 0.
Btw: it doesn't work with 302 either (as long as it doesn't contain a body).
I think i found the problem, fix will be coming soon.
#4 Updated by stbuehler over 2 years ago
- Status changed from New to Fixed
- % Done changed from 0 to 100
Applied in changeset r2770.
#5 Updated by elvanor about 1 month ago
- Status changed from Fixed to Reopened
- Target version changed from 1.4.29 to 1.4.33
- % Done changed from 100 to 50
Reopened following a discussion on IRC.
#6 Updated by stbuehler about 1 month ago
It looks like the next request on the same connection waits for the backend connection to end.
#7 Updated by stbuehler about 1 month ago
This isn't really a bug in lighttpd, as the (apache) backend should close the connection after it wrote all data; mod_proxy uses HTTP/1.0 and does not send "Connection:" (keep-alive) headers, so the backend (apache) must not use keep-alive connections.
Also available in: Atom