我的场景是这样的,使用workerman的http协议监听8088端口实现一个API接口,然后使用nginx反向代理转发到8088端口,但是nginx总是大多数情况下或响应超时。直接访问8088端口也会超时,但是业务逻辑的耗时应该是很短的,在传统非常驻内存的框架里这段代码的响应时间几乎是2毫秒,有人遇到过这类情况吗 或者该从那里着手分析原因呢
我的nginx配置
#PROXY-START/
location ~* \.(php|jsp|cgi|asp|aspx)$
{
proxy_pass http://127.0.0.1:8088;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
}
location /Service
{
proxy_pass http://127.0.0.1:8088;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
add_header Cache-Control no-cache;
expires 12h;
}
#PROXY-END/
如果业务没有调用 $connection->send(),浏览器得不到数据就会一直等待,直到超时
好的 我查一下看看 谢谢你 这一点没有想到
我尝试跟踪系统调用发现
12:45:26.318928 select(4, [3], [], [], {tv_sec=100, tv_usec=0}) = 0 (Timeout)
12:47:06.418908 select(4, [3], [], [], {tv_sec=100, tv_usec=0}) = 0 (Timeout)
12:48:46.518309 select(4, [3], [], [], {tv_sec=100, tv_usec=0}) = 0 (Timeout)
12:50:26.615896 select(4, [3], [], [], {tv_sec=100, tv_usec=0}
重启后第一次请求响应时间只用啦3.8ms,然后一直阻塞在这个地方,再次请求就会大概率出现请求超时,而且没有看到系统调用
进程空闲的时候会调用select,是正常的。
我觉得可能是8088端口的问题 换了一个端口正常啦 可能是nginx的问题
lsof端口号的结果
lsof -i:8088
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 6560 root 3u IPv4 220473 0t0 TCP :radan-http (LISTEN)
php 6561 root 3u IPv4 220473 0t0 TCP :radan-http (LISTEN)
nginx 16453 www 12u IPv4 727211 0t0 TCP localhost:56158->localhost:radan-http (ESTABLISHED)
nginx 16453 www 14u IPv4 727270 0t0 TCP localhost:56162->localhost:radan-http (ESTABLISHED)
php 16839 root 3u IPv4 720711 0t0 TCP *:radan-http (LISTEN)