Инструменты пользователя

Инструменты сайта


doc:different:helpdesks:otrs_and_nginx

Интегрируем OTRS с nginx

Источник: http://www.zlonet.ru/page/47

На офф. сайте сказано, как нужно настроить Apache для работы OTRS. Но нам это неинтересно :), т.к. мы юзаем nginx.

Итак, виртуальный сервер для работы otrs в nginx:

server {
    listen 80;
    server_name localhost;
    root /usr/local/otrs/var/httpd/htdocs;
    access_log  /var/log/nginx/otrs.nginx_access.log;
    index index.html;
    location /otrs-web {
        gzip on;
        alias /usr/local/otrs/var/httpd/htdocs;
    }
    location ~ ^/otrs/(.*.pl)(/.*)?$ {
        gzip off; #gzip makes scripts feel slower since they have to complete before getting gzipped
        #    fastcgi_pass  unix:/.$1.sock;
        fastcgi_pass unix:/var/run/perl-fcgi.sock;
        #    fastcgi_pass  127.0.0.1:8999;
        fastcgi_index index.pl;
        fastcgi_param SCRIPT_FILENAME   /usr/local/otrs/bin/fcgi-bin/$1;
        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 GATEWAY_INTERFACE CGI/1.1;
        fastcgi_param SERVER_SOFTWARE   nginx;
        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 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-wrapper, помещаем в /usr/local/sbin:

#!/usr/bin/perl
use FCGI;

#perl -MCPAN -e 'install FCGI'

use Socket;
use POSIX qw(setsid);
#use Fcntl;

require 'sys/syscall.ph';

&daemonize;

#this keeps the program alive or something after exec'ing perl scripts
END() { } BEGIN() { }
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; };
eval q{exit};
if ($@) {
        exit unless $@ =~ /^fakeexit/;
};

&main;

sub daemonize() {
        chdir '/'                 or die "Can't chdir to /: $!";
        defined(my $pid = fork)   or die "Can't fork: $!";
        exit if $pid;
        setsid                    or die "Can't start a new session: $!";
        umask 0;
}

sub main {
        #$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 ); #use IP sockets
        $socket = FCGI::OpenSocket( "/var/run/perl-fcgi.sock", 10 ); #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!
         $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket );
        if ($request) { request_loop()};
        FCGI::CloseSocket( $socket );
}

sub request_loop {
        while( $request->Accept() >= 0 ) {

        #processing any STDIN input from WebServer (for CGI-POST actions)
        $stdin_passthrough ='';
        $req_len = 0 + $req_params{'CONTENT_LENGTH'};
        if (($req_params{'REQUEST_METHOD'} eq 'POST') && ($req_len != 0) ){
                my $bytes_read = 0;
                while ($bytes_read < $req_len) {
                my $data = '';
                my $bytes = read(STDIN, $data, ($req_len - $bytes_read));
                last if ($bytes == 0 || !defined($bytes));
                $stdin_passthrough .= $data;
                $bytes_read += $bytes;
                }
        }

        #running the cgi app
        if ( (-x $req_params{SCRIPT_FILENAME}) &&  #can I execute this?
                (-s $req_params{SCRIPT_FILENAME}) &&  #Is this file empty?
                (-r $req_params{SCRIPT_FILENAME})     #can I read this file?
        ){
                pipe(CHILD_RD, PARENT_WR);
                my $pid = open(KID_TO_READ, "-|");
                unless(defined($pid)) {
                        print("Content-type: text/plain\r\n\r\n");
                        print "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";
                        next;
                }
                               if ($pid > 0) {
                        close(CHILD_RD);
                        print PARENT_WR $stdin_passthrough;
                        close(PARENT_WR);
                        while(my $s = <KID_TO_READ>) { print $s; }
                        close KID_TO_READ;
                        waitpid($pid, 0);
                } else {
                        foreach $key ( keys %req_params){
                   $ENV{$key} = $req_params{$key};
                        }
                # cd to the script's local directory
                        if ($req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/) {
        chdir $1;
        }
                        close(PARENT_WR);
                        close(STDIN);
                        #fcntl(CHILD_RD, F_DUPFD, 0);
                        syscall(&SYS_dup2, fileno(CHILD_RD), 0);
                        #open(STDIN, "<&CHILD_RD");
                        exec($req_params{SCRIPT_FILENAME});
                        die("exec failed");
                }
}
else {
print("Content-type: text/plain\r\n\r\n");
print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";
}
}
}

Скрипт perl-fcgi, помещаем в /usr/local/sbin:

#!/bin/sh

PROGG=/usr/local/sbin
PROGNAME=perl-fcgi

pidfile='/var/run/perl-fcgi.pid'

fc_test(){
        ps aux|grep perl|grep fast|awk '{print $2}'
}

case $1 in
        stop)
        if [ -n "$pidfile" -a -f "$pidfile" ];then
                if [ `cat $pidfile` = `fc_test` ];then
                        kill `cat $pidfile`
                fi
                rm $pidfile
        else
                if [ -f "$pidfile" ];then
                        rm $pidfile
                fi
        fi
        ;;
        start)
        $PROGG/fastcgi-wrapper
        fc_test >/dev/null
        if [ $? -eq 0 ];then
                fc_test > ${pidfile}
        fi
        ;;
        status)
        if [ -f $pidfile ];then
                if [ `cat $pidfile` = `fc_test` ];then
                        echo ${PROGNAME} is runnig
                        exit 254
                fi
        fi
        ;;
        *)
        ;;
esac

Скрипт perl-fcgi.rc, помещаем в /usr/local/etc/rc.d:

#!/bin/sh
#
# PROVIDE: perl-fcgi
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf to enable perl-fcgi:
# perl_fcgi_enable="YES"
#

. /etc/rc.subr

name="perl_fcgi"
rcvar=`set_rcvar`

command=/usr/local/sbin/perl-fcgi

pidfile=/var/run/perl-fcgi.pid
start_cmd=fcgi_start
stop_cmd=fcgi_stop
restart_cmd=fcgi_restart
status_cmd=fcgi_status

fcgi_start(){
        $command stop
        $command start
}
fcgi_stop(){
        $command stop
}
fcgi_restart(){
        $command status
        $command stop
        $command start
}
fcgi_status(){
        $command status
}

load_rc_config $name
run_rc_command "$1"

TAG:

/var/www/wiki.itcall.ru/data/pages/doc/different/helpdesks/otrs_and_nginx.txt · Последнее изменение: d.m.Y H:i — dbehterev