File Upload fails for large files


#1

Hi,
I am using mongrel with nginx and I am facing problem when I try to
upload a large file. After googling about this, I came to know that I
need to configure nginx.conf file by setting ‘client_max_body_size’
to
a value of desired maximum file size. I did that but still it does
not
seem to work. Files above 200 KB do not get uploaded. I also get a
weird error about sockets (Given below the nginx.conf file)
What am I doing wrong? Please help.

My nginx.conf lokos like this:

user postgres ;
worker_processes 2;
error_log /var/www/webapps/FileSharing/log/error.log notice;
pid /var/www/webapps/FileSharing/log/nginx.pid;
events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
# no sendfile on OSX uncomment
#this if your on linux or bsd
#sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
upstream mongrel {
server 127.0.0.1:4000;
server 127.0.0.1:4001;
server 127.0.0.1:4002;
}
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
server {
listen 80;
server_name something.com;
access_log /var/www/webapps/FileSharing/log/access.log;
error_log /var/www/webapps/FileSharing/log/error.log;
root /var/www/webapps/FileSharing/public;
access_log on;
rewrite_log on;
#client_max_body_size 1048576k;
client_max_body_size 1024M;
client_body_buffer_size 512k;
client_header_buffer_size 1048576k;
location /ui
{
root /var/www/webapps/FileSharing/public;
}
location ~ ^/$ {
if (-f /index.html){
rewrite (.) /index.html last;
}
proxy_pass http://mongrel;
}
location / {
if (!-f $request_filename.html) {
proxy_pass http://mongrel;
}
rewrite (.
) $1.html last;
}
location ~ .html {
root /Users/ez/nginx/public;
}
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|
bz2|
doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov)$ {
access_log off;
expires 30d;
}
location / {
# needed to forward user’s IP address to rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
#proxy_set_header X_FORWARDED_PROTO https;
#proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect false;
#proxy_max_temp_file_size 1048576k;
proxy_max_temp_file_size 1024M;
# If the file exists as a static file serve it directly
without
# running all the other rewite tests on it
if (-f $request_filename) {
break;
}
# this is the meat of the rails page caching config
# it adds .html to the end of the url and then checks
# the filesystem for that file. If it exists, then we
# rewite the url to have explicit .html on the end
# and then send it on its way to the next config rule.
# if there is no file on the fs then it sets all the
# necessary headers and proxies to our upstream mongrels
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://mongrel;
break;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/webapps/FileSharing/public;
}
}
}
}

Error:

Thu Nov 20 10:47:37 +0530 2008: Error reading HTTP body:
#<RuntimeError: Socket read returned insufficient data: 5672>
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/mongrel/
http_request.rb:107:in read_socket' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/ http_request.rb:77:inread_body’
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/mongrel/
http_request.rb:55:in initialize' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/ mongrel.rb: 149:innew’
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/
mongrel.rb:
149:in process_client' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/ mongrel.rb: 285:inrun’
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/
mongrel.rb:
285:in initialize' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/ mongrel.rb: 285:innew’
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/
mongrel.rb:
285:in run' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/ mongrel.rb: 268:ininitialize’
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/
mongrel.rb:
268:in new' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/ mongrel.rb: 268:inrun’
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/mongrel/
configurator.rb:282:in run' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/ configurator.rb:281:ineach’
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/mongrel/
configurator.rb:281:in run' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails: 128:inrun’
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/…/lib/mongrel/
command.rb:212:in run' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281 /usr/local/bin/mongrel_rails:19:inload’
/usr/local/bin/mongrel_rails:19


#2

Its fixed.

We were using a Javascript to submit the form that held the file
field. When we used a submit button instead of the javascript, it all
started working properly. I wonder whats wrong internally but for now,
the code is working :-). If you are doing something similar, make sure
you use a submit button instead of a Javascript that submits the form.

Chirantan


#3

If you are doing something similar, make sure
you use a submit button instead of a Javascript that submits the form.

Chirantan, look into the responds_to_parent plugin to do it via JS.

http://sean.treadway.info/responds-to-parent/


#4

Oh great. Thanks for this Mark. :slight_smile: