Starbug1 on nginx

nginxでStarbug1を動かすにあたり、いくつかStarbug1側で修正を行ないました。 動かし方を書いておきます。nginxやfastcgiについて無知なので、間違いがあれば連絡ください。 以下、 Ubuntuでの設定例です。

参考

Starbug1

  • Starbug1をダウンロードして、コンパイルして/var/vhosts/demo.starbug1.com/starbug1に配置する。
$ tar zxf starbug1-1.6.00.tar.gz
$ cd starbug1
$ make INITIAL_LOCALE=ja_JP static webapp
$ sudo mkdir /var/vhosts/demo.starbug1.com
$ sudo cp -r dist/starbug1 /var/vhosts/demo.starbug1.com/
$ sudo chown -R www-data:www-data /var/vhosts/demo.starbug1.com/starbug1

fastcgi

  • 必要なモジュールのインストール
$ sudo apt-get install nginx libfcgi-perl libfcgi-procmanager-perl spawn-fcgi

ラッパーの用意

  • /usr/local/bin/cgiwrap-fcgi.pl
#!/usr/bin/perl
use FCGI;
use Socket;
use FCGI::ProcManager;
sub shutdown { FCGI::CloseSocket($socket); exit; }
sub restart  { FCGI::CloseSocket($socket); &main; }
use sigtrap 'handler', \&shutdown, 'normal-signals';
use sigtrap 'handler', \&restart,  'HUP';
require 'syscall.ph';
use POSIX qw(setsid);
 
END()   { }
BEGIN() { }
{
  no warnings;
  *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 {
  $proc_manager = FCGI::ProcManager->new( {n_processes => 5} );
  $socket = FCGI::OpenSocket( "/var/run/nginx/cgiwrap-dispatch.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,
  &FCGI::FAIL_ACCEPT_ON_INTR );
  $proc_manager->pm_manage();
  if ($request) { request_loop() }
  FCGI::CloseSocket($socket);
}
 
sub request_loop {
  while ( $request->Accept() >= 0 ) {
    $proc_manager->pm_pre_dispatch();
 
    #processing any STDIN input from WebServer (for CGI-POST actions)
    $stdin_passthrough = '';
    { no warnings; $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 );
      pipe( PARENT_ERR, CHILD_ERR );
      my $pid = open( CHILD_O, "-|" );
      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;
      }
      $oldfh = select(PARENT_ERR);
      $|     = 1;
      select(CHILD_O);
      $| = 1;
      select($oldfh);
      if ( $pid > 0 ) {
        close(CHILD_RD);
        close(CHILD_ERR);
        print PARENT_WR $stdin_passthrough;
        close(PARENT_WR);
        $rin = $rout = $ein = $eout = '';
        vec( $rin, fileno(CHILD_O),    1 ) = 1;
        vec( $rin, fileno(PARENT_ERR), 1 ) = 1;
        $ein    = $rin;
        $nfound = 0;
 
        while ( $nfound = select( $rout = $rin, undef, $ein = $eout, 10 ) ) {
          die "$!" unless $nfound != -1;
          $r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1;
          $r2 = vec( $rout, fileno(CHILD_O),    1 ) == 1;
          $e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1;
          $e2 = vec( $eout, fileno(CHILD_O),    1 ) == 1;
 
          if ($r1) {
            while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) {
              print STDERR $errbytes;
            }
            if ($!) {
              $err = $!;
              die $!;
              vec( $rin, fileno(PARENT_ERR), 1 ) = 0
              unless ( $err == EINTR or $err == EAGAIN );
            }
          }
          if ($r2) {
            while ( $bytes = read( CHILD_O, $s, 4096 ) ) {
              print $s;
            }
            if ( !defined($bytes) ) {
              $err = $!;
              die $!;
              vec( $rin, fileno(CHILD_O), 1 ) = 0
              unless ( $err == EINTR or $err == EAGAIN );
            }
          }
          last if ( $e1 || $e2 );
        }
        close CHILD_RD;
        close PARENT_ERR;
        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(PARENT_ERR);
        close(STDIN);
        close(STDERR);
 
        #fcntl(CHILD_RD, F_DUPFD, 0);
        syscall( &SYS_dup2, fileno(CHILD_RD),  0 );
        syscall( &SYS_dup2, fileno(CHILD_ERR), 2 );
 
        #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";
    }
  }
}

ラッパーの起動

$ chmod 755 /usr/local/bin/cgiwrap-fcgi.pl
$ mkdir /var/run/nginx/
$ chown www-data:www-data /var/run/nginx/
$ /usr/local/bin/cgiwrap-fcgi.pl &> /dev/null &

nginx のサイト定義追加

  • /etc/nginx/sites-available/demo.starbug1.com
server {
	server_name	demo.starbug1.com;
	listen 80;
 
	root	 /var/vhosts/demo.starbug1.com;
	index	index.cgi index.html;
 
	location / {
		if (-e $request_filename) {
		    rewrite index.cgi /index.cgi last;
		    rewrite admin.cgi /admin.cgi last;
		}
	}
	location ~ \.cgi($|/) {
		gzip off;
		fastcgi_pass   unix:/var/run/nginx/cgiwrap-dispatch.sock;
		fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
		fastcgi_param  SERVER_SOFTWARE    nginx;
		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  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_split_path_info ^((?U).+\.cgi)(/?.+)$;
		fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
		fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
		fastcgi_param  PATH_INFO          $fastcgi_path_info;
 
	}
 
	access_log  /var/log/nginx/demo.starbug1.com.access.log combined;
	error_log  /var/log/nginx/demo.starbug1.com.error.log;
}

サイトの有効化

$ cd /etc/nginx/sites-enabled
$ sudo ln -s /etc/nginx/sites-available/demo.starbug1.com

nginx再起動

$ sudo /etc/init.d/nginx restart

これで、Starbug1を http://demo.starbug1.com/starbug1/ にアクセスして、nginxで動かすことができました。

14 Comments

  • Simon Davies many Thanks for this i been looking and trnyig all day and the only detail you have that no one else i could find was the last bit regarding the reconfigure your domain with Plesk’ and restarting of the psa.Much appreciated.

  • I told my grandmother how you helped. She said, “bake them a cake!”

  • >No widzisz, że to banalnie proste?>Te formalizmy o których piszesz dopiero dopracowujemy […]Pozycyjny system zapisu liczb znany jest od 4 tys. lat.WiÄ™c nic nie trzeba dopracowywać, bo to już daaaawnoistnieje…:D

  • It’s posts like this that make surfing so much pleasure

  • Asalamualaikum Wr.Wb,saya ingin memiliki Ebook motivasi diri kayaknya bagus buku itu, bgaimana cara membelinya ya..? silahkan hubngi saya di email : atau WasalamBharata Danujingga

  • стоимость ландшафтных работ – вертикальное озеленение помещения, ландшафтное проектирование сада.

  • купить шестигранник латунный – медная лента цена, лист медный москва.

  • курс доллар рубль – курс евро по цб, курс валют на завтра.

  • cheap dresses online – 3d watch, long dress.

  • одежда от производителя украина – одежда от производителя дешево, верхняя одежда большой размер.

  • Expiry Bets – up and down bet, Double Down Bets.

  • Has any previous World Cup been built by slave labor on the backs of thousands of dead workers in order to construct virtually all the infrastructure needed to host it? Has any previous World Cup been played in such a desert it needed innovative technology to be remotely feasible in summer, and then failed to deliver? Has any previous World Cup needed to be moved to winter to prevent players dropping dead on the pitch? Has any previous World Cup been such a stupendously bad idea it didn’t even need any actual evidence for pretty much everyone to be convinced it had been fully bought and paid for the instant it was announced, to the extent it proved FIFA didn’t even care how corrupt people thought it was?

  • Услуги Интернет-магазина “Авалор” будут полезны как обычным гражданам, так и владельцам ресторанов, банков, магазинов и прочих учреждений, в помещении которых могут находиться дети. Наша компания реализует детские замки на окна, использование которых гарантируют безопасность ребёнка во многоэтажном помещении. К слову, такие блокираторы будет вполне уместно устанавливать даже в одноэтажных домах.

    Довольно часто детский замок может стать достойной альтернативой традиционным оконным решёткам.Таким образом, Вы сможете защитить свой дом от грабителей, надежность и высокое качество детских замков мы гарантируем.

    Блокиратор, в большинстве случаев, закрепляется на нижнюю створку окна и не даёт ребёнку открывать створки нараспашку.В том случае, если Вам нужно будет открыть окно, к примеру, для того, чтобы полить цветы, Вы сможете воспользоваться специальным ключом.

    На сайте нашего интернет – магазина Вы найдете замки, которые крепятся на пластиковые или металлические окна.Благодаря большому разнообразию цветов, Вы легко сможете подобрать именно то изделие, которое Вам больше всего подойдет.У нас можно купить коричневый, серый, золотой блокиратор и не только.Мы реализуем продукцию проверенных и известных брендов, в числе которых:BabySafeLock BSL, Roto и другие.

    Обратите внимание на то, что в магазине “Авалор” можно подобрать замок не только по критериям внешнего вида, но и по принципу действия.Наши блокираторы могут быть: врезными, с тросиком, с цилиндром, с поворотной лапкой.

    Хотите разобраться в разнообразии изделий и выбрать наиболее оптимальный вариант именно для Вашей квартиры?Звоните нашим специалистам, чтобы получить подробную консультацию по интересующему Вам вопросу.Свяжитесь с нами по телефону, и мы обязательно поможем Вам сделать правильный выбор. Заявку на сайте Вы можете оставить в любой удобный момент.

    Сделав заказ на оконные замки с тросиком, мы отправляем товар во все населённые пункты России, и предоставляем одновременно несколько вариантов оплаты заказа.Перевести деньги можно:

    • на банковский счет нашей компании;
    • при помощи популярных электронных платежных систем;
    • при использовании услуг логистической компании, которая доставляет заказ. Обратите внимание на то, что наличие наложенного платежа существенно увеличивает стоимость услуг транспортной компании.

    Переходите на сайт Интернет-магазина Avalor прямо сейчас, чтобы в считанные секунды оформить заказ, и обезопасить детей от рисков.

  • http://mic-shop.com/ 【揚歌-教學麥克風直營店】官方線上購物網站─JM-180B有線麥克風擴音器│無線麥克風擴音器│揚歌小蜜蜂│專營教學麥克風及教學擴音器 – 關於自有品牌揚歌-專營教學用麥克風

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.