Nginx Tornado File Upload

I am trying to upload file via nginx_upload_module 2.2.0. I have nginx
1.0.4 setup as a reverse proxy with a tornado server at the backend.
Below is my nginx.conf :

#user nobody;
worker_processes 1;

error_log /var/log/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

pid /var/log/nginx.pid;

events {
worker_connections 1024;
}

http {
include mime.types;
index index.html
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] $request

'“$status” $body_bytes_sent “$http_referer” ’

‘“$http_user_agent” “$http_x_forwarded_for”’;

#access_log access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

gzip on;

upstream frontends {
server 127.0.0.1:8888;
}

server {
listen 80;
server_name localhost;

#charset koi8-r;

Allow file uploads max 50M for example

client_max_body_size 50M;

#access_log  logs/host.access.log  main;

#POST URLn
location /upload {
# Pass altered request body to this location
upload_pass @after_upload;

    # Store files to this directory
    upload_store /tmp;

    # Allow uploaded files to be read only by user
    upload_store_access user:rw;

    # Set specified fields in request body
    upload_set_form_field $upload_field_name.name

“$upload_file_name”;
upload_set_form_field $upload_field_name.content_type
“$upload_content_type”;
upload_set_form_field $upload_field_name.path
“$upload_tmp_path”;

    # Inform backend about hash and size of a file
    upload_aggregate_form_field “$upload_field_name.md5”

“$upload_file_md5”;
upload_aggregate_form_field “$upload_field_name.size”
“$upload_file_size”;

    #upload_pass_form_field “some_hidden_field_i_care_about”;

    upload_cleanup 400 404 499 500-505;
}

location / {
root /opt/local/html;
}

location @after_upload {
    proxy_pass   http://127.0.0.1:8888;
}

}
}

I have already tested the setup, and nginx does forward the request to
tornado. But when I try to upload the file it gives me a 400: Bad
Request http status code. With the tornado log stating that, it’s
missing the upfile.path in the request. And when I try to go to the
folder where nginx should have supposedly stored the uploaded file it
isn’t there. And hence the 400 error.

Can anyone point why is nginx not storing the file at the specified
directory /tmp ?

Tornado Log : WARNING:root:400 POST /upload (127.0.0.1): Missing

argument upfile_path WARNING:root:400 POST /upload (127.0.0.1) 2.31ms

Nginx Error Log : 127.0.0.1 - - [14/Jul/2011:13:14:31 +0530] "POST

/upload HTTP/1.1" 400 73 “http://127.0.0.1/” “Mozilla/5.0 (X11; Linux
i686; rv:6.0) Gecko/20100101 Firefox/6.0”

Posted at Nginx Forum:

On Thu, Jul 14, 2011 at 05:30:01AM -0400, akash.gangil wrote:

Hi there,

I am trying to upload file via nginx_upload_module 2.2.0. I have nginx
1.0.4 setup as a reverse proxy with a tornado server at the backend.

I’m not using tornado, but I’m not seeing any obvious problems when I
mimic the nginx side of your configuration.

    upload_set_form_field $upload_field_name.path

“$upload_tmp_path”;

That ends in “.path”.

Tornado Log : WARNING:root:400 POST /upload (127.0.0.1): Missing

argument upfile_path WARNING:root:400 POST /upload (127.0.0.1) 2.31ms

That ends in “_path”.

That’s the only odd-looking thing I can see. Might that be a cause of
the problem?

Good luck,

f

Francis D. [email protected]

I have already tried that, with no success :expressionless:

Posted at Nginx Forum:

On Thu, Jul 14, 2011 at 02:22:49PM -0400, akash.gangil wrote:

I have already tried that, with no success :expressionless:

In that case, the debug log is the next thing to try. It will tell you
what nginx thinks is happening.

http://wiki.nginx.org/Debugging

http://nginx.org/en/docs/debugging_log.html

f

Francis D. [email protected]

Here is the debug Log:
http://pastebin.com/4NVCdmrj

Posted at Nginx Forum:

Also Here is the Tornado Server Code if it helps:
http://codepad.org/hdw063eg

Posted at Nginx Forum:

Finally solved it, thanks for your help! :slight_smile:

Posted at Nginx Forum:

On Fri, Jul 15, 2011 at 03:37:07AM -0400, akash.gangil wrote:

Finally solved it, thanks for your help! :slight_smile:

Good news!

And, to help the next person who has a similar problem and finds this
thread when using a search engine, can you share what the solution was?

The debug log shows:

hashed path: /tmp/0000000001

and then eventually

finished cleanup of file “/tmp/0000000001” after http status 400 while
closing request

which may explain why you didn’t see the file in /tmp when you went
looking for it.

And it also shows

http script var: “upfile”
http script copy: “.path”
http script copy: ““”
http script var: “/tmp/0000000001”
http script copy: “””

so nginx thinks it is setting upfile.path correctly in what was sent to
the backend.

So presumably the problem was elsewhere.

Cheers,

f

Francis D. [email protected]