Доброго дня. Не получается грузить файлы на сервер, а именно через nginx. Схема приложения банальна: запросы принимает nginx, а обрабатывает их nodejs(с помощью npm multer). Собственно, локально, без nginx, все работает отлично, файлы грузятся. Как только появляется nginx вся загргузка ломается. Конфиг виртуального хоста:
server {
listen 80;
server_name app.dev;
access_log /home/nicota/code/app/build/access.log req_len;
error_log /home/nicota/code/app/build/error.log debug;
location = /upload/file {
proxy_http_version 1.1;
limit_except POST { deny all; }
client_body_temp_path /tmp/;
client_body_in_file_only on;
client_body_buffer_size 2M;
client_max_body_size 100М;
client_body_timeout 10s;
proxy_pass_request_headers on;
proxy_set_header X-FILE $request_body_file;
proxy_set_body off;
proxy_redirect off;
proxy_set_header Connection "";
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 X-Forwarded-Proto $scheme;
proxy_set_header X-File-Name $request_body_file;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:3000/upload/file;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Что есть на данный момент: nginx грузит файл во временную папку /tmp и на это все.
Больше этот файл никуда не идет. То есть, в nodejs тело запроса и другие данные просто отсутстуют.
Пример запроса curl:
curl -v -F 'photo=@/path/to/fome/file.png' http://app.dev/upload/file/
дает:
* Trying 127.0.100.2...
* Connected to app.dev (127.0.100.2) port 80 (#0)
> POST /upload/file/ HTTP/1.1
> Host: app.dev
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 248498
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------7194e139a35c069f
>
< HTTP/1.1 100 Continue # здесь кажется, что требуется продолжение, но все резко обрубается
< HTTP/1.1 400 Bad Request
< Server: nginx/1.10.3 (Ubuntu)
< Date: Wed, 18 Dec 2019 16:39:48 GMT
< Content-Type: application/json; charset=utf-8
< Content-Length: 2
< Connection: keep-alive
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< ETag: W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
* HTTP error before end of send, stop sending
<
* Closing connection 0
{}%
Что есть в access.log на этот запрос:
127.0.0.1 -[18/Dec/2019:19:39:48 +0300] "POST /upload/file/ HTTP/1.1" 400 "curl/7.47.0" "248718"(это размер тела запроса в байтах) "multipart/form-data; boundary=------------------------7194e139a35c069f"(это Content-Type) "/var/lib/nginx/body/0048769492"(это временной файл)
В error.log при этом ничего не записывается.
Что видит nodejs-приложение (заголовки, req.headers):
{ connection: 'upgrade',
host: 'app.dev',
'content-length': '248498',
'user-agent': 'curl/7.47.0',
accept: '*/*',
'content-type': 'multipart/form-data; boundary=------------------------823d2202257dc89a' }
Тело запроса в приложении(req.body), конечно же, пустое.
Как я вижу, приходит только первая часть запроса, только заголовки, без тела. Но куда оно пропало? Учитывая, что во временную папку оно успешно загрузилось?
Я весь день потратил на поиск решения. Пришел сюда, в надежде на помощь.