Skip to content

Instantly share code, notes, and snippets.

@stran12
Created November 26, 2011 00:43
Show Gist options
  • Star 32 You must be signed in to star a gist
  • Fork 14 You must be signed in to fork a gist
  • Save stran12/1394757 to your computer and use it in GitHub Desktop.
Save stran12/1394757 to your computer and use it in GitHub Desktop.
Step-by-step installation of cGit with Nginx

How to install cGit on Nginx (Ubuntu server)

Step-by-step installtion of cGit on nginx without funky rewrite rules.

Pre-requisites

This is for :

sudo aptitude install build-essential
                      autoconf 
                      automake 
                      libtool 
                      libfcgi-dev 
                      spawn-fcgi 
                      fcgiwrap 
git clone https://github.com/gnosek/fcgiwrap.git
git clone git://hjemli.net/pub/git/cgit

Setting up fcgiwrap

Now lets install fcgiwrap. Alternatively, you can :

git clone https://github.com/gnosek/fcgiwrap.git
cd fcgiwrap/
autoreconf -i
./configure
make
sudo make install
cp fcgiwrap /usr/bin/.

Setting up spawn-fcgi

Then, I pasted this perl script into /usr/bin/spawn-fcgi which will create a socket to pass .cgi to it :

cat > /usr/bin/spawn-fcgi
#!/usr/bin/perl

use strict;
use warnings FATAL => qw( all );

use IO::Socket::UNIX;

my $bin_path = '/usr/bin/fcgiwrap';
my $socket_path = $ARGV[0] || '/tmp/cgi.sock';
my $num_children = $ARGV[1] || 1;

close STDIN;

unlink $socket_path;
my $socket = IO::Socket::UNIX->new(
    Local => $socket_path,
    Listen => 100,
);

die "Cannot create socket at $socket_path: $!\n" unless $socket;

for (1 .. $num_children) {
    my $pid = fork;
    die "Cannot fork: $!" unless defined $pid;
    next if $pid;

    exec $bin_path;
    die "Failed to exec $bin_path: $!\n";
}

Then make sure to give it executable permissions :

chmod +x /usr/bin/spawn-fcgi

The following script will be use to automate the respawning of FastCGI(fcgi) socket :

cat > /etc/init.d/spawn-fcgi
#!/bin/bash
C_SCRIPT=/usr/bin/spawn-fcgi
USER=www-data
GROUP=www-data
RETVAL=0
case "$1" in
        start)
                echo "Starting fastcgi"
                sudo -u $USER $C_SCRIPT
                chown $USER:$GROUP /tmp/cgi.sock
                RETVAL=$?
  ;;
        stop)
                echo "Stopping fastcgi"
                killall -9 fcgiwrap
                RETVAL=$?
  ;;
        restart)
                echo "Restarting fastcgi"
                killall -9 fcgiwrap
                $sudo -u $USER $C_SCRIPT
                RETVAL=$?
  ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
  ;;
esac
exit $RETVAL

Again, make that executable and start it up! :

chmod +x /etc/init.d/spawn-fcgi
sudo /etc/init.d/spawn-fcgi start

After you start the spawn-fcgi you should see a new file in /tmp folder with the name cgi.sock. That file is our socket to pass .cgi scripts to.

Configuring nginx fcgi_param's

The next step is optional, but I like it because it neatens things up a bit. :

cat > /etc/nginx/fastcgi_params
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
fastcgi_param  REMOTE_USER        $remote_user;

Setting up cGit

Go into the cgit directory that you cloned in the pre-req's and run the following cmomands :

git submodule init
git submodule update
make
sudo make install

This will have installed cgit.cgi cgit.png and cgit.css into /var/www/htdocs/cgit/. That should be fine if you have all the correct permissions set up. :

# prepend this string to every url
virtual-root=/

# title, heading, desc, about...
root-title=Intecs git repositories
root-desc=here lies our code!
root-readme=/files/web/example.com/code/about.html


# styling
css=/htdocs/cgit/cgit.css
logo=/htdocs/cgit/cgit.png


#
# "STATIC" REPOSITORIES
#
# Add them one by one, or include a file...
section=Hosted repos

# First repository
repo.url=<project_name>
repo.owner=<user>
repo.path=/path/to/git_repo/.git
repo.desc=A test project.

Now here is where we configure nginx to run cgit :

server {
    listen 80;
    server_name localhost;

    # Serve static files
    location ~* ^.+\.(css|png|ico)$ {
        root /var/www/htdocs/cgit;
        expires 30d;
    }

    location / {
        fastcgi_pass   unix:/tmp/cgi.sock;
        fastcgi_param   SCRIPT_FILENAME /var/www/htdocs/cgit/cgit.cgi;
        fastcgi_param   PATH_INFO       $uri;
        fastcgi_param   QUERY_STRING    $args;
    }

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;
}

References

Copy link

ghost commented Jun 27, 2016

Nice manual, I used it, it works. Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment