[英]ngnix transfers data to a unix domain socket incompletely
我的應用程序正在偵聽傳入數據的unix域套接字(UDS),而nginx正在使用PHP發送數據。 發送幾個KB的較小數據塊可以很好地工作,但是一旦達到某個限制,瀏覽器就會收到錯誤504 Gateway Time-out
,nginx logs
上游超時(110:連接超時)從上游讀取響應頭,客戶端:127.0.0.1,服務器:_,請求:“GET /foo/bar.php HTTP / 1.1”,上游:“fastcgi:// unix :/run/php/php7.0-fpm.sock“,主持人:”localhost“
套接字仍然獲取一些數據(總是減少大約1.5 MB)並回復但網絡服務器似乎沒有得到響應。 是否有必須調整的UDS流限制或nginx變量?
PHP代碼:
public function send ($msg)
{
$str = "{$msg}".chr(27);
$ret = socket_write($this->socket, $str, strlen($str));
if ($ret == FALSE)
{
return false;
}
else
{
$response = "";
while (($chunk = socket_read($this->socket, 2048, PHP_BINARY_READ)) !== FALSE)
{
$response .= $chunk;
if (substr($chunk, -1) == chr(27))
break;
}
//close the connection
if ($this->connected !== false)
{
socket_shutdown($this->socket);
socket_close($this->socket);
$this->connected = false;
}
return $response;
}
}
好的州議員Nginx與這個問題無關,這是非常明顯的PHP發送和接收數據。
您的遠程系統很可能沒有在正確的時間關閉套接字,或者只是需要很長時間才能響應。
while (($chunk = socket_read($this->socket, 2048, PHP_BINARY_READ)) !== FALSE)
{
$response .= $chunk;
if (substr($chunk, -1) == chr(27))
break;
}
如果遠程系統沒有關閉連接/套接字並告訴你它將繼續嘗試讀取並等待2048(比特或字節 - 我永遠不記得哪個),這個代碼塊有可能是這個代碼的無限循環它要求肯定一條評論將通知)要通過的數據或在讀取完成之前關閉的套接字。
因此,嘗試降低讀取字節的一些事情將其設置為128
,將套接字放入套接字(需要在PHP中進行異步編程)讀取,以便在28秒后終止它,使代碼再執行2秒(安全出口)。 或使用set_time_limit
來增加時間限制。
如果確實增加了時間限制,則需要增加允許nginx從PHP連接獲取響應的時間來設置fastcgi_read_timeout
該錯誤表明Nginx和上游服務器之間的連接超時。
您的請求需要超過1分鍾才能完成嗎?
嘗試按照以下更改nginx位置,並閱讀fastcgi_read_timeout
location ~* \.php$ {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_read_timeout 120;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.