Nginx - аплоад больших файлов аля native


nginx.conf

# <NATIVE_UPLOAD>
location /doupload {
  auth_request                   /upload/authenticate;
  
  #limit_except POST              { deny all; } 

  client_body_temp_path          /tmp/;
  client_body_in_file_only       on;
  client_body_buffer_size        128K;
  client_max_body_size           50M;
  proxy_pass_request_headers     on;
  proxy_set_header               X-File $request_body_file; 
  proxy_set_body                 off;
  proxy_pass                     http://xxxxxxxxxxxxxx/upload.php; 
  proxy_redirect                 off;
}

location = /upload/authenticate {
  internal;
  proxy_set_body                 off;
  proxy_pass_request_body        off;
  proxy_pass                     http://xxxxxxxxxxxxxx/auth.php;
  proxy_set_header Content-Length "";
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size 0;
}
# </NATIVE_UPLOAD>


upload.php

<?php

analyze $_SERGER['HTTP_X_FILE'];

?>


auth.php

<?php

if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('HTTP/1.0 401 Unauthorized');
}
else {
  // OK!
}
?>

Для проверки можем кинуть файл с помощью CURL:

$ curl --data-binary x1.dat http://xxxxxxxxxxxxxx/doupload

Метод хорош тем, что позволяет использовать jQuery и Ajax
и минимально нагружает веб-приложение, а плох тем, что 
не позволяет строить простой progress процесса загрузки.