[英]Nginx prepends response data with post request body content from its' buffer?
幾天來,我在一個在ubuntu系統上的 docker 容器中運行並使用laravel/rebing-graphql供應商提供graphql查詢響應的laravel應用程序中遇到了一個奇怪的問題。
所以我使用GraphiQL接口將 graphql 請求發送到我的后端。 我收到的請求結果不僅包括有效響應,還包括我與發布請求一起發送的參數;
"{\"query\":\"query Users {\\n users(pagination: {offset: 0, limit: 1}) {\\n items {\\n id\\n }\\n }\\n}\",\"variables\":null,\"operationName\":\"Users\"}{\"data\":{\"users\":{\"items\":[{\"id\":53}]}}}"
此響應不帶有 content-type: application/json
而是text/html
。 似乎 post 請求正文已添加到我的 API 的響應數據中。 這會導致我的客戶端出現 JSON 解析錯誤。 這里的 API 數據部分本身似乎是有效的。
這個問題最奇怪的是,它發生在每一秒(!)請求上。 因此,我大約 50% 的請求都收到了一個有效的響應,該響應確實以 json 格式出現,並且沒有任何前置的 post 請求正文。
我試圖分析此問題的根本原因,但我無法在代碼中找到將參數作為附加輸出回顯的位置。
nginx 配置是否會導致發布請求正文內容的前置?
在我進一步調查期間,我開始替換 laravel 的公共目錄中的index.php
文件並創建了一個自定義index.php
,其中只包含一個exit("test")
; 執行。 結果出乎意料。 我仍然在每個第二個請求的輸出中附加了我的 post 參數:
"{\"query\":\"query Users {\\n users(pagination: {offset: 0, limit: 1}) {\\n items {\\n id\\n }\\n }\\n}\",\"variables\":null,\"operationName\":\"Users\"}test"
我正在使用來自 nginx:alpine 和 php:7.4-fpm-alpine 的 docker 映像。 docker 容器打開一個端口,該端口從運行在我的根系統上的 apache2 服務器獲取代理。
這是我的 nginx 默認配置:
server {
listen 80;
server_name my-domain.com;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html/public;
index index.php index.html;
location / {
client_max_body_size 100M;
if ($request_method = 'OPTIONS') {
add_header Access-Control-Max-Age 1728000;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, HEAD";
add_header Content-Length 0;
add_header Content-Type "text/plain; charset=UTF-8";
add_header Access-Control-Allow-Headers "Origin,X-Requested-With,Content-Type,Accept,X-CSRF-Token,X-XSRF-TOKEN,Authorization";
return 204;
}
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
location ~ \.php$ {
client_max_body_size 100M;
if ($http_origin ~* "^(blob:)?http(s)?://www.my-domain.com(:[0-9]{2,4})?$") {
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Origin,X-Requested-With,Content-Type,Accept,X-CSRF-Token,X-XSRF-TOKEN,Authorization";
}
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass epapistagephp:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
是否有人已經經歷過這種行為,或者您是否暗示從哪里開始進一步分析?
非常感謝你!
問候朱爾斯
經過一個月的努力和使用變通辦法,如切換到 Apache2 等......我想我找到了一個解決方案。
如我的原始問題所述,問題發生在 nginx 服務器已經運行了一段時間之后。 重新加載 nginx 服務器后,問題暫時消失了。 使用 apache2 我沒有這個問題。 這樣我就可以將問題與 nginx 本身隔離開來。
我現在嘗試通過設置禁用 nginx 的請求緩存:
proxy_request_buffering off; <===
client_max_body_size 500M;
client_body_buffer_size 500M;
我還提高了測試的緩沖大小,現在可以正常工作了。 這個問題似乎與 Laravel、Graphql 或 PHP 完全無關。 對於可能偶然發現此主題的任何人,我將相應地編輯我的原始問題。 我希望這可以在將來對某人有所幫助。
如果使用9000端口,就會出現這個問題。 使用端口 8000。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.