Serving CGI Scripts With Nginx On OpenSUSE 11.4 - Page 2

3 Using Fcgiwrap

Fcgiwrap is a CGI wrapper that can be used for shared hosting environments because it allows each vhost to use its own cgi-bin directory.

As there's no fcgiwrap package for OpenSUSE, we must build it ourselves. First we install some prerequisites:

zypper remove patterns-openSUSE-minimal_base
zypper install git patch automake glibc-devel gcc flex compat-readline4 db-devel wget gcc-c++ make vim libtool FastCGI-devel

Create the following symlinks:

ln -s /usr/include/fastcgi/fastcgi.h /usr/local/include/
ln -s /usr/include/fastcgi/fcgi_config.h /usr/local/include/
ln -s /usr/include/fastcgi/fcgi_stdio.h /usr/local/include/
ln -s /usr/include/fastcgi/fcgiapp.h /usr/local/include/
ln -s /usr/include/fastcgi/fcgimisc.h /usr/local/include/
ln -s /usr/include/fastcgi/fcgio.h /usr/local/include/
ln -s /usr/include/fastcgi/fcgios.h /usr/local/include/

Now we can build fcgiwrap as follows:

cd /usr/local/src/
git clone git://
cd fcgiwrap
autoreconf -i
make install

This installs fcgiwrap to /usr/local/sbin/fcgiwrap.

Next we install the spawn-fcgi package which allows us to run fcgiwrap as a daemon:

zypper install spawn-fcgi

We can now start fcgiwrap as follows:

spawn-fcgi -u nginx -g nginx -s /var/run/fcgiwrap.socket -S -M 0700 -F 1 -P /var/run/ -- /usr/local/sbin/fcgiwrap

You should now find the fcgiwrap socket in/var/run/fcgiwrap.socket, owned by the user and group nginx.

If you don't want to start fcgiwrap manually each time you boot your system, open /etc/init.d/boot.local...

vi /etc/init.d/boot.local

... and add the spawn-fcgi command at the end of the file - this will automatically start fcgiwrap at the end of the boot process:

/usr/bin/spawn-fcgi -u nginx -g nginx -s /var/run/fcgiwrap.socket -S -M 0700 -F 1 -P /var/run/ -- /usr/local/sbin/fcgiwrap

Now open your vhost configuration file...

vi /etc/nginx/nginx.conf

... and add a location /cgi-bin {} section to the server {} container:

server {
   location /cgi-bin/ {
     # Disable gzip (it makes scripts feel slower since they have to complete
     # before getting gzipped)
     gzip off;
     # Set the root to /usr/lib (inside this location this means that we are
     # giving access to the files under /usr/lib/cgi-bin)
     root  /srv/www/;
     # Fastcgi socket
     fastcgi_pass  unix:/var/run/fcgiwrap.socket;
     # Fastcgi parameters, include the standard ones
     include /etc/nginx/fastcgi_params;
     # Adjust non standard parameters (SCRIPT_FILENAME)
     fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;

Reload nginx:

/etc/init.d/nginx reload

Next we create our cgi-bin directory - /srv/www/ because we defined root /srv/www/; in the location /cgi-bin {} container:

mkdir /srv/www/

Now we place our CGI scripts in it and make them executable. For testing purposes I will create a small Hello World Perl script (instead of hello_world.cgi you can also use the extension .pl ->

vi /srv/www/
#!/usr/bin/perl -w
     # Tell perl to send a html header.
     # So your browser gets the output
     # rather then <stdout>(command line
     # on the server.)
print "Content-type: text/html\n\n";
     # print your basic html tags.
     # and the content of them.
print "<html><head><title>Hello World!! </title></head>\n";
print "<body><h1>Hello world</h1></body></html>\n";
chmod 755 /srv/www/

Open a browser and test the script:

If all goes well, you should get the following output:



About The Author

Falko Timme is the owner of Boost Your Site mit Timme Hosting - ultra-schnelles nginx-WebhostingTimme Hosting (ultra-fast nginx web hosting). He is the lead maintainer of HowtoForge (since 2005) and one of the core developers of ISPConfig (since 2000). He has also contributed to the O'Reilly book "Linux System Administration".

Share this page:

0 Comment(s)