|Subject:||FCGI breaks with IIS 7.5|
|Date:||Tue, 18 Dec 2012 09:00:43 +0200|
|To:||bug-FCGI [...] rt.cpan.org|
|From:||Johannes Wilke <johannes.wilke [...] striata.com>|
Good day, I have found that FCGI using IIS 7.5 can get in to a state that brings down your website. When you do many post requests in a short period of time IIS at some point will not send the TYPE 5 terminating packet (ZERO content length). IIS continues to send the FCGI packets for new requests that comes in but, FCGI is stuck in a state where it ignores any new packets cause it is waiting for the TYPE 5 terminating packet for Request ID N. This leaves your web service in a state that you constantly get an 500 internal server error. Only when IIS restart the process (specified by the IIS settings for FCGI) will the service be back up and running. This is an actual IIS issue cause they are at fault for not sending the TYPE 5 terminating packet at some point in time, but FCGI is left in a very bad state. I saw that PHP users complains about intermittent 500 internal server errors when using IIS. I believe that the PHP FCGI interface probably drops the incomplete packet but continue processing new requests coming in. Can FCGI maybe handle this more appropriately instead of discarding all new incoming packets. Please find attached (iistype5.txt) a TCP log between IIS and Perl FCGI showing the missing TYPE 5 terminating packet from IIS and that Perl FCGI rejects every request afterwards. 1) Load the file with Wireshark. Set the filter options to "tcp.port == 57696" 2) Entry no 1972 shows FCGI TYPE 1 packet for Request ID 0x91 3) Entry no 1974 shows FCGI TYPE 4 packet (PARAMS) for Request ID 0x91 4) Entry no 1977 shows FCGI TYPE 4 terminating packet 5) Entry no 1979 shows FCGI TYPE 5 (DATA_IN) packet 6) Entry no 1981 shows FCGI TYPE 5 terminating packet 7) Entry no 1983 shows FCGI TYPE 6 data out packet. In this same TCP packet is the TYPE 6 terminating packet and TYPE 3 end request packet. 8) This was the last successfull packet. Note that the TYPE 1 packets are all RESPONSE role packets meaning that TYPE 6 packets can be sent before teh TYPE 5 terminating packet. If the log file is inspected you will note that most of the time the TYPE 6 packet is sent before the TYPE 5 terminating packet is received. 1) Entry no 1985 shows the FCGI TYPE 1 packet for request ID 0x92 2) Entry no 1987 shows the FCGI TYPE 4 packet 3) Entry no 1990 shows the FCGI TYPE 4 terminating packet. 4) Entry no 1992 shows the FCGI TYPE 5 packet. 5) Entry no 1994 shows the FCGI TYPE 6 packet, with its terminating packet and the TYPE 3 end request packet. 6) Entry no 1996 shows the FCGI TYPE 1 packet for Request ID 0x93. NOTE: IIS Never sent the TYPE 5 terminating packet for Reuqest Id 0x92. 7) Entry no 1998 shows the TYPE 3 end request packet for Request Id 0x93. From this point Perl FCGI is ending all requests cause the Request Id does not match 0x92. -- *Johannes Wilke* Striata - Software Engineer Office: +27(81)308-1837 Email: *firstname.lastname@example.org* <mailto:email@example.com> Striata on: *Twitter* <> | *LinkedIn* < > | *Facebook* < > | *striata.com* < > *Latest blog post: < > This email and all contents are subject to the following disclaimer: *
Message body is not shown because sender requested not to inline it.