OTRS in Nginx met FCGI

OTRS is een Trouble Ticketing Systeem wat erg uitgebreid is. Het is geschreven in Perl, wat een heel aantal voordelen heeft, maar vooral op het gebied van performance is dat een nadeel.
Een oplossing daarvoor is om OTRS in mod_perl te draaien. Daar gaat de performance van OTRS behoorlijk van vooruit, maar ook mod_perl brengt weer een nadeel met zich mee. Het is namelijk niet te combineren met mod_itk, een module om verschillende sites als verschillende gebruikers te laten draaien. Als je dus mod_perl zou kiezen ben je genoodzaakt om alles als www-data (of het equivalent in jouw distributie) te laten draaien.

Ik ben op zoek gegaan naar een oplossing om OTRS snel te laten draaien, maar wel met de mogelijkheid om OTRS als aparte user te draaien.
OTRS heeft zelf al rekening gehouden met de mogelijkheid om fcgi te gebruiken, maar de documentatie daarvan is erg beperkt en leverde mij niet het gewenste resultaat. Vooral het draaien als aparte user lijkt een uitdaging te zijn.
Ik ben uiteindelijk uitgekomen bij Nginx (een andere webserver zal waarschijnlijk ook prima voldoen) in combinatie met spawn-fcgi. Deze how-to gaat uit van Ubuntu en gaat alleen in op het installeren van OTRS voor wat betreft de webserver configuratie.

Installatie

  • Software:

    We maken naast wat programma’s die wel in Ubuntu zitten ook gebruik van multiwatch. Daar is wel een apt-repository voor beschikbaar. Voeg die als volgt toe aan je systeem:

    root@otrs:~# wget -O /etc/apt/sources.list.d/multiwatch.list http://www.tuxis.nl/uploads/howtos/otrs-fcgi/multiwatch.list
    root@otrs:~# apt-key adv --keyserver keys.gnupg.net --recv-keys 80121CD2479689D8
    root@otrs:~# apt-get update

    Installeer nu alle software:

    root@otrs:~# apt-get install mysql-server nginx spawn-fcgi libnet-dns-perl libio-socket-ssl-perl libnet-ldap-perl libgd-text-perl libgd-graph-perl libpdf-api2-perl libsoap-lite-perl libuser libcgi-fast-perl multiwatch
  • OTRS:
    • Maak een nieuwe gebruiker voor OTRS aan:
      root@otrs:~# adduser otrs --disabled-login
      Adding user `otrs' ...
      Adding new group `otrs' (1001) ...
      Adding new user `otrs' (1001) with group `otrs' ...
      Creating home directory `/home/otrs' ...
      Copying files from `/etc/skel' ...
      Changing the user information for otrs
      Enter the new value, or press ENTER for the default
              Full Name []: OTRS Webuser
              Room Number []: 
              Work Phone []: 
              Home Phone []: 
              Other []: 
      Is the information correct? [Y/n] y
      
    • Zorg nu dat je de nieuwe gebruiker wordt en download OTRS en pak het uit. Maak een symlink met de naam ‘otrs’, zodat je bij upgrades niet allemaal zaken hoeft te wijzigen. Zorg ook dat Kernel/Config.pm bestaat, en zorg dat het path naar OTRS daar juist staat.
      root@otrs:~# su - otrs
      otrs@otrs:~$ wget http://ftp.otrs.org/pub/otrs/otrs-2.4.7.tar.bz2
      otrs@otrs:~$ tar xjvf otrs-2.4.7.tar.bz2
      otrs@otrs:~$ ln -s otrs-2.4.7 otrs
      otrs@otrs:~$ mv otrs/Kernel/Config.pm.dist otrs/Kernel/Config.pm
      
    • Edit otrs/Kernel/Config.pm en zet het path juist, in dit geval “/home/otrs/otrs/”

Configuratie

Spawn-fcgi wordt niet per request gestart. Het doel is namelijk performance, en het iedere keer opnieuw starten van ‘index.pl’ is niet efficient. Dus moeten we van tevoren spawn-fcgi alle benodigde processen laten starten.
Je kunt daarvoor een eigen script maken maar je kunt ook dit script gebruiken. Het zorgt dat voor de gebruiker(s) die je opgeeft netjes de Nginx- en de Fcgi-setup gedaan wordt. Het gaat uit van Upstart van Ubuntu dus als je op een ander operatingsystem zit kan het niet zo goed werken..

Draai nu het script voor de gebruiker die je hebt aangemaakt. Het kan zijn dat het vraag om de hostname als wie je wilt dat de vhost draait:

root@otrs:~# ./ngfcgiotrs otrs
Created upstart config for customer.pl
Created upstart config for index.pl
Created upstart config for installer.pl
Created upstart config for public.pl
Starting service: customer.pl ... index.pl ... installer.pl ... public.pl ... Create vhost-config for otrs.tuxis.net

Er zijn nu voor iedere file in fcgi-bin upstart jobs aangemaakt. Dat houdt in dat deze altijd blijven draaien, ongeacht of de webserver draait. Als een proces crasht, zal een nieuw proces in de plaats gestart worden. Je kunt de files terugvinden in:

  • /etc/init/otrs/otrs/index.pl.conf
  • /etc/init/otrs/otrs/installer.pl.conf
  • /etc/init/otrs/otrs/customer.pl.conf
  • /etc/init/otrs/otrs/public.conf
  • /etc/nginx/sites-available/<vhost-naam>

Nu is het alleen nog een kwestie van de vhost in nginx aanzetten, en OTRS kan geinstalleerd worden.

root@otrs:~# cd /etc/nginx/sites-enabled/
root@otrs:/etc/nginx/sites-enabled# ln -s ../sites-available/otrs.tuxis.net 
root@otrs:/etc/nginx/sites-enabled# /etc/init.d/nginx restart
Restarting nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
nginx.

Na de installatie draait OTRS volledig. Als het nodig is om de fcgi-services te stoppen of te starten, kun je dat doen met:

root@otrs:~# stop otrs/$username/index.pl
root@otrs:~# start otrs/$username/index.pl

Waar $username uiteraard de gebruiker is van wie je de service wilt herstarten.

installer.pl heeft een aangepaste versie van het init-script, waardoor het niet automatisch zal starten na de installatie. Als je de installatie nog eens nodig hebt of je wilt een upgrade doen, dan kun je de installer weer beschikbaar maken door het volgende te typen:

root@otrs:~# start otrs/$username/installer.pl

Automatisch PGP keys importeren vanuit maildrop

Het kan soms handig zijn om automatisch PGP-keys te importeren op het moment dat je ze binnenkrijgt. Als je bijvoorbeeld GPG in OTRS aangezet hebt, is het lastig om iedere keer op een shell op de betreffende server in te loggen om de key te downloaden.

Door middel van maildrop (of procmail, maar de laatste versie daarvan is uit 2001) kun je op het moment van afleveren proberen die keys automatisch te downloaden. Je kunt dat met onderstaand script doen. Je moet hier uiteraard wel een mailserver hebben die maildrop ondersteunt.

if (/.*BEGIN PGP SIGNATURE.*/:b)
{
    foreach /^From: (.*)$/
    {  
        foreach (getaddr $MATCH) =~ /.+/
        {  
            flock "gnupg.lock" {
                `grep -iqx "$MATCH" senders.txt 2>/dev/null || { 
                echo "$MATCH" >> senders.txt ; 
                SENDERKEY=$(gpg --batch --no-tty --search-key "$MATCH"  | tr 'n' ' ' 
                    | sed -e 's/.*key ([0-9A-F]+).*/1/'); 
                gpg --recv-keys --batch --no-tty "$SENDERKEY"; 
                exit 1; 
                }`
            }
        }
    }
}

Eudata Communications

[box]
[quote]Het bevalt me -heel- goed! Perfecte performance, stabiel… ik heb helemaal niets te klagen. (Erik Naarsing – Eudata Communications)[/quote]
Neemt af:

[/box]

Eudata Communications was voor de webshop www.penstore.nl op zoek naar webhosting. De eisen waren: stabiliteit, snelheid, duidelijke communicatie en SSL-afhandeling. Geen problemen dus voor Tuxis Webhosting.

Door het gebruik van eaccelerator en voldoende server capaciteit is de site altijd snel. Toen een zoekmachine wel heel aggressief de webshop aan het doorzoeken was hebben Eudata en Tuxis in goede samenwerking gezocht naar een oplossing die ervoor zou zorgen dat de zoekmachine wel zijn werk kon doen, maar geen overlast veroorzaakt werd voor de overige gebruikers.