2013-04-13 109 views
5

我在Linux上和perl dancer一起玩,如果浏览器通过局域网直接连接到服务器,所有人都很好,并且dany。但是,当我通过广域网连接浏览器为IE9时,偶尔忙碌的光标不会消失。当阅读GET请求时,舞者随机挂起

我可以通过重新加载页面apx连续10次来挑起这个问题。即使在每次重新加载之间等待整整一秒时,我也会遇到这个问题。页面本身非常简单,并通过w3c检查。

如果我以root用户身份运行dancer,或者端口是80还是3000,那么这并没有什么区别。同时也用apache测试过一个页面的频繁重新加载,这似乎没有问题。

我运行strace,并且我有一个印象,那就是当舞者尝试读取请求数据时有时候并不是有效的。这是跟踪的样子

当它的工作原理:

{sa_family=AF_INET, sin_port=htons(52073), sin_addr=inet_addr("78.42.213.92")}, [16]) = 4 
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfab5028) = -1 ENOTTY (Inappropriate ioctl for device) 
_llseek(4, 0, 0xbfab5070, SEEK_CUR)  = -1 ESPIPE (Illegal seek) 
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfab5028) = -1 ENOTTY (Inappropriate ioctl for device) 
_llseek(4, 0, 0xbfab5070, SEEK_CUR)  = -1 ESPIPE (Illegal seek) 
fcntl64(4, F_SETFD, FD_CLOEXEC)   = 0 
getpeername(4, {sa_family=AF_INET, sin_port=htons(52073), sin_addr=inet_addr("78.42.213.92")}, [16]) = 0 
read(4, "G", 1)       = 1 
read(4, "E", 1)       = 1 
read(4, "T", 1)       = 1 

当它挂起

{sa_family=AF_INET, sin_port=htons(52225), sin_addr=inet_addr("78.42.213.92")}, [16]) = 4 
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfab5028) = -1 ENOTTY (Inappropriate ioctl for device) 
_llseek(4, 0, 0xbfab5070, SEEK_CUR)  = -1 ESPIPE (Illegal seek) 
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfab5028) = -1 ENOTTY (Inappropriate ioctl for device) 
_llseek(4, 0, 0xbfab5070, SEEK_CUR)  = -1 ESPIPE (Illegal seek) 
fcntl64(4, F_SETFD, FD_CLOEXEC)   = 0 
getpeername(4, {sa_family=AF_INET, sin_port=htons(52225), sin_addr=inet_addr("78.42.213.92")}, [16]) = 0 
read(4, 

,然后坐下,直到永远。任何想法我能做什么?

回答

4

我碰到一个similar problem,IE9连接到Catalyst dev服务器。埃里克劳伦斯(IE团队领导!?)建议这可能是由于IE9的后台连接功能。 IE9打开后台TCP连接以加速未来对服务器的请求,但这显然会导致单线程服务器出现问题。如果您正在运行Dancer的默认开发服务器(HTTP :: Server :: Simple :: PSGI),you won't be able to handle IE9

我通过Apache的代理解决了这个问题。它使开发更多的麻烦,但只有当我必须测试IE9。

+0

我也看到IE9在普拉克用HTTP :: Server :: Simple运行的舞者上持有锁。我的临时解决方案一直是使用Firefox,而我的长期解决方案是在某些时候使用Plack的高端Web服务器。 Dancer为不同的web服务器(如nginx)提供配置文档 - 类似于@wes的解决方案。 –

+0

@wes我把舞者放在apache后面,看起来都很好。谢谢 –