@drowzeenico

Почему Nginx не загружает файлы?

Доброго дня. Не получается грузить файлы на сервер, а именно через 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), конечно же, пустое.

Как я вижу, приходит только первая часть запроса, только заголовки, без тела. Но куда оно пропало? Учитывая, что во временную папку оно успешно загрузилось?
Я весь день потратил на поиск решения. Пришел сюда, в надежде на помощь.
  • Вопрос задан
  • 1583 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
А чего вы ожидали написав proxy_set_body off ?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы