Context
專案遇到一個狀況 :form 是使用 GET 作操作,所以會遇到 url 過長的問題。
Browser URL Limit
其實 browser 可以到 64K 以上,所以如果不是 browser 問題可以看 response 414 的 source 是誰。 如果是 Nginx ,就往下找 Nginx 問題。
Ngnix Problem
Limit File Upload with Nginx
Problem encountered: 414 url is too long error If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client.
Default value: 1 MB
Solution:
Set the client_max_body_size in /etc/nginx/nginx.conf
to the proper size.
1 | Syntax: client_max_body_size size; |
This directive can be set in the http
, server
or location
context.
Reference
Context
調整 client_max_body_size 後可以 accept 的 url 長度有比較多,但是仍沒有顯著改善, 但回傳的已為 400。
找 Nginx log
1 | ssh staging server |
發現是 Puma 問題
1 | [error] 2320#0: *1 connect() to unix:/srv/app/shared/tmp/sockets/puma.sock failed (111: Connection refused) while connecting to upstream, client: 172.31.5.28, server: , request: "GET /health_check HTTP/1.1", upstream: "http://unix:/srv/app/shared/tmp/sockets/puma.sock:/health_check", host: "172.31.25.150" |
找 Puma error log
1 | ssh staging server |
1 | HTTP parse error, malformed request (127.0.0.1/amp/api/v1/properties/count): #<Puma::HttpParserError: HTTP element QUERY_STRING is longer than the (1024 * 10) allowed length (was 10706) |
可以發現已經超過 Puma 可以處理的長度。
結論
這邊有關於超過 Puma QUERY_STRING 最大 size 的相關 issue。偉哉我公司同事後來發了一個 PR 來擴充 Puma QUERY_STRING 的長度,這個問題有解喇。