#986: Remove Nginx?
--------------------------+-------------------------------------------------
Reporter: anna | Owner:
Type: task | Status: new
Priority: major | Milestone: 4.6
Component: Architecture | Severity: New Ticket
Keywords: | Who will test this: And
--------------------------+-------------------------------------------------
Sam has suggested some ways to think of removing Nginx from the Plumi
stack, and rely upon Apache alone.
I've added all his notes here.
In general EM might want to consider simplifying their server
architecture. Plone with just Apache server in front of it, and a disk
cache configured in Apache, can serve busy sites very nicely ... this
one for example that we manage: http://www.ethicaljobs.com.au/ (see
somewhat dated visitor stats here:
http://www.ethicaljobs.com.au/news/ethicaljobs.com.au-
celebrates-115-000-visitors).
An additional advantage is that the buildout is simplified quite a bit
too - no nginx, varnish, ...
On 11/12/14 11:58 PM, Markos Gogoulos wrote:
> We had a really bad time with timeouts so after research we ended up in
nginx + nginx upload module (before that we were on Apache).
> Even if 2-3G file uploads are supported by apache/nginx (which I doubt),
the combination with uwsgi makes things much complex.
>
> In fact the nginx upload module uploads files in a /tmp dir, and when
the whole file is uploaded it handles it to zope, that moves it in
blobstorage etc.
>Nginx is used so that large files can be uploaded (we have tested with up
to 3G files), we are using an nginx's plugin for this. Without this
plugin, apache/nginx timeouts after some minutes of video uploading.
>
> On Thu, Dec 11, 2014 at 1:57 PM, Sam Stainsby
<[email protected]> wrote:
>
> On 11/12/14 19:41, Markos Gogoulos wrote:
>
> > Nginx is used so that large files can be uploaded (we have tested
with
> > up to 3G files), we are using an nginx's plugin for this. Without
this
> > plugin, apache/nginx timeouts after some minutes of video
uploading.
>
> Any recent mainstream web server (Apache, Nginx, ..) should handle
large
> (or long) file uploads just fine. Are you sure it's not a proxy
timeout
> you're seeing?
>
> Cheers,
> Sam.
>
I can think of at least three multimedia projects I've build that can do
this with plain Apache, so I suspect your timeout problems lies with
what runs behind your web server rather than the web server itself ...
or with bad proxy settings ... or just a bad network, in which case a
chunked, resumeable uploader Javascript library could be the solution.
In fact, the last system I built with file uploads wasn't designed with
large files in mind, but out of curiosity I'm testing it right now with
a 2.3GB upload. It's been running fine for 1.5 hours so far.
Unfortunately, at my ADSL1 network speed (current upload progress is at
7%!), it will probably take all day ... possibly more. As it's taking up
too much upstream bandwidth, I may have to stop it soon.
If interested, below are some technical details ...
The Apache virtual host is very plain and boring:
<VirtualHost 106.187.99.62:80>
ServerName admin.realbreakthroughs.net
CustomLog ${APACHE_LOG_DIR}/admin.realbreakthroughs.log combined
ErrorLog ${APACHE_LOG_DIR}/admin.realbreakthroughs.error.log
DocumentRoot /var/www/realbreakthroughs/admin_ui
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Location />
AuthType Basic
AuthName "RB restricted area"
AuthUserFile /etc/apache2/realbreakthroughs_password
Require user rbadmin
</Location>
RewriteEngine On
RewriteRule ^/api/(.*) http://localhost:3122/$1 [P,L,E=proxy-
timeout:200s]
</VirtualHost>
- the front end uses angular-file-upload.js and the back end behind
Apache is a RESTful node.js API server. It streams uploaded files
directly into MongoDB GridFS using about 80 lines of code. Seriously,
this is the upload handing code in the node.js part:
exports.insert = function(db) {
var gridfs = GridFS(db, mongodb);
return function(req, res) {
var form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
if (err) {
res.status(500);
return res.send(err);
}
try {
var metadata = JSON.parse(fields.metadata);
var fileKeys = Object.keys(files);
var nKeys = fileKeys.length;
if (nKeys < 1 || nKeys > 1) {
return res.send(422, 'wrong file count: ' + nKeys);
}
var file = files[fileKeys[0]][0];
var filename = file.originalFilename;
var ctype = file.headers && file.headers['content-type'] ||
'application/octet-stream';
var writeOption = {
filename: filename,
mode: 'w',
content_type: ctype,
metadata: metadata
};
var tmpPath = file.path;
var outstream = gridfs.createWriteStream(writeOption);
outstream.on('error', function(err) {
console.log('ERROR: FAILED storing file');
return res.send(500, err);
});
outstream.on('close', function(data) {
return res.send(201, data);
});
var instream = fs.createReadStream(tmpPath);
instream.pipe(outstream);
} catch(err) {
console.log('UPLOAD ERROR: ' + err);
res.status(500);
return res.send(err);
}
});
};
};
Cheers,
Sam.
--
Ticket URL: <http://plumi.org/ticket/986>
Plumi <http://plumi.org/>
Plumi - FOSS Video Sharing Platform
_______________________________________________
Discuss mailing list
[email protected]
http://lists.plumi.org/listinfo/discuss