簡體   English   中英

Nginx 在響應數據之前添加來自其緩沖區的發布請求正文內容?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM