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://github.com/gnosek/fcgiwrap.git
cd fcgiwrap
autoreconf -i
./configure
make
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/spawn-fcgi.pid -- /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/spawn-fcgi.pid -- /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/www.example.com; # 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/www.example.com/cgi-bin because we defined root /srv/www/www.example.com; in the location /cgi-bin {} container:
mkdir /srv/www/www.example.com/cgi-bin
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 -> hello_world.pl):
vi /srv/www/www.example.com/cgi-bin/hello_world.cgi
#!/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/www.example.com/cgi-bin/hello_world.cgi
Open a browser and test the script:
http://www.example.com/cgi-bin/hello_world.cgi
If all goes well, you should get the following output:
4 Links
- Nginx: http://nginx.org/
- Nginx Wiki: http://wiki.nginx.org/
- Thttpd: http://acme.com/software/thttpd/
- nginx ThttpdCGI: http://wiki.nginx.org/ThttpdCGI
- nginx Fcgiwrap: http://wiki.nginx.org/Fcgiwrap
About The Author
Falko Timme is the owner of