translated by Google

Machine-translated page for increased accessibility for English questioners.

Instructions for using Node.js on FI

Runtime environment Node.js used to create JavaScript programs. This platform is primarily intended for running stand-alone servers listening on a dedicated TCP port, which also applies to web frameworks. However, there are modules that allow you to run under the Apache web server and therefore also on Aise at www.fi.muni.cz . After reading this text, you should have enough information to choose the right solution for you.

We recommend that you read the instructions before proceeding Custom HTML pages , Creating CGI scripts , a Instructions for using PHP on FI . We assume that Apache has access to the directory public_html .

CGI

CGI is a simple interface that can be used in any programming language. In this manual we will use the module cgi-node which provides basic features for easier work with HTTP requests and responses.

First, we will create directories for our new application and support programs:

mkdir --parents ~/public_html/node-app/cgi-bin

Let's download the library cgi-node and set it the right to run:

cd ~/public_html/node-app/cgi-bin
wget -O cgi-node.cgi https://github.com/DEDAjs/cgi-node/releases/download/v0.2/cgi-node.js
chmod u+x cgi-node.cgi

Then in it we change the path to the Node.js binary on the first line to /usr/bin/node and set the path to the directory with the session files (variable SessionPath ) on /tmp :

sed -i "1s|.*|#!/usr/bin/node|" cgi-node.cgi
sed -i "s|SessionPath:.*|SessionPath: '/tmp/'|" cgi-node.cgi

We save the application itself to a file index.js . We will only call a function in it CgiNodeInfo() , which is suitable for testing and lists information about the environment, HTTP query and session:

cd ~/public_html/node-app
echo "CgiNodeInfo();" > index.js

You would write a simple "Hello world" application as follows:

response.headers['Content-Type'] = 'text/plain; charset=utf-8';
write("Hello world!\n");

More details on use node-cgi you will find in documentation or in source code cgi-node.js .

Finally, we tell the Apache web server that it has all the files with the extension .js run with cgi-node.cgi . Replace here and in the following text xlogin own login.

cd ~/public_html/node-app
cat > .htaccess <<'EOF'
AddHandler cgi-node .js
Action cgi-node /~xlogin/node-app/cgi-bin/cgi-node.cgi
DirectoryIndex index.js
EOF

Verify the functionality of the application by visiting https://www.fi.muni.cz/~xlogin/node-app/index.js .

You can also use other modules in the application. Either enter the full path to them ( /home/xlogin/... ) or install them in a directory ~/public_html/node-app/cgi-bin because they are looking relative to location cgi-node.cgi :

cd ~/public_html/node-app/cgi-bin
npm install wonderful-module

FastCGI

When using CGI, you will soon encounter the limits of this technology. Each HTTP request is processed by a newly started process, which in the case of Node.js means a relatively high latency. In addition, you cannot use any of the many frameworks that need a module to function http .

Fortunately, there is a module node-fastcgi which is built on specifications FastCGI . This allows the web server to let a long-running process handle multiple HTTP requests in a row.

First, prepare a directory with the application in which to install the module node-fastcgi :

mkdir --parents ~/public_html/node-fastcgi-app
cd ~/public_html/node-fastcgi-app
npm install node-fastcgi

The application itself index.js may look like this (taken from documentation ):

#!/usr/bin/node

var fcgi = require('node-fastcgi');

var server = fcgi.createServer(function(req, res) {
    if (req.method === 'GET') {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end("Hello, world!\n");
    } else if (req.method === 'POST') {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        var body = "";

        req.on('data', function(data) { body += data.toString(); });
        req.on('end', function() {
            res.end("Received data:\n" + body);
        });
    } else {
        res.writeHead(501);
        res.end();
    }
});
server.listen();

The script must be given execution rights ( x ) for the owner:

chmod u+x index.js

Finally, we tell the Apache web server that it has .js to run files using FastCGI:

cat > .htaccess <<'EOF'
AddHandler fastcgi-script .js
AddType application/x-httpd-javascript .js
DirectoryIndex index.js
EOF

You can test its functionality at https://www.fi.muni.cz/~xlogin/node-fastcgi-app/ .

Express

You can use the FastCGI server as a replacement for the module http . An example is the use with the framework Express . We will install this framework first (notes on the location of modules from the CGI section apply - they are searched relative to the script):

cd ~/public_html/node-fastcgi-app
npm install express

The application can then look like this:

#!/usr/bin/node

var fcgi = require('node-fastcgi');
var express = require('express');
var app = express();

app.get('/~xlogin/node-express-app/', function (req, res) {
    res.set('Content-Type', 'text/plain');
    res.send("Hello World!\n");
});

fcgi.createServer(app).listen();

and will be available at https://www.fi.muni.cz/~xlogin/node-express-app/ .

Nice URL

In order for you and the users of your application to work well with the URL, we recommend setting it in a file .htaccess rewrite URL using mod_rewrite :

cat >> .htaccess <<'EOF'
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/~xlogin/node-express-app/index.js
RewriteRule (.*) /~xlogin/node-express-app/index.js/$1 [L,PT]
EOF

Here is the line with RewriteRule ensures that the URL shape www.fi.muni.cz/~xlogin/node-express-app/LIBOVOLNY_SUFFIX will be serviced by an application stored in index.js . Line s RewriteCond prevents an endless rewriting cycle.

For example, you can connect your application using use under the given prefix and use paths independent of the specific location of the application:

#!/usr/bin/node

var prefix = '/~xlogin/node-express-app';
var fcgi = require('node-fastcgi');
var express = require('express');
var base_app = express();
var app = express();

app.get('/hello', function (req, res) {
    res.set('Content-Type', 'text/plain');
    res.send("Hello\n");
}); 

app.get('/world', function (req, res) {
    res.set('Content-Type', 'text/plain');
    res.send("World!\n");
}); 

base_app.use(prefix, app);

fcgi.createServer(base_app).listen();

You can try addresses https://www.fi.muni.cz/~xlogin/node-fastcgi-app/hello and https://www.fi.muni.cz/~xlogin/node-fastcgi-app/world .

© The text on CGI is based on the instructions of Patrik Vala.