我的場景是這樣的,使用workerman的http協(xié)議監(jiān)聽8088端口實現(xiàn)一個API接口,然后使用nginx反向代理轉(zhuǎn)發(fā)到8088端口,但是nginx總是大多數(shù)情況下或響應(yīng)超時。直接訪問8088端口也會超時,但是業(yè)務(wù)邏輯的耗時應(yīng)該是很短的,在傳統(tǒng)非常駐內(nèi)存的框架里這段代碼的響應(yīng)時間幾乎是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/
如果業(yè)務(wù)沒有調(diào)用 $connection->send(),瀏覽器得不到數(shù)據(jù)就會一直等待,直到超時
我嘗試跟蹤系統(tǒng)調(diào)用發(fā)現(xiàn)
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}
重啟后第一次請求響應(yīng)時間只用啦3.8ms,然后一直阻塞在這個地方,再次請求就會大概率出現(xiàn)請求超時,而且沒有看到系統(tǒng)調(diào)用
lsof端口號的結(jié)果
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)