Поиск по сайту:

Установка FcgiWrap и включение динамических языков Perl, Ruby и Bash в Gentoo LEMP


Это руководство строго связано с предыдущим руководством по установке LEMP в Gentoo и рассматривает другие расширенные проблемы сервера, такие как включение динамических языков сценариев, таких как Perl, Bash или Ruby, через Fcgiwrap Gateway, а также редактирование файлов конфигурации виртуальных хостов Nginx для предоставлять динамический контент с помощью сценариев .pl, .rb и .cgi.

Требования

  1. Стек LEMP установлен в Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Шаг 1. Включите FCGIWRAP в Gentoo LEMP

Fcgiwrap является частью Общего интерфейса шлюза Nginx FastCGI, который обрабатывает другие языки динамических сценариев, такие как сценарии Perl, Bash или Ruby, и работает путем обработки запросов, полученных от Nginx, через TCP или Unix Sockets независимо возвращает полученный результат обратно в Nginx, который, в свою очередь, пересылает ответы конечным клиентам.

1. Давайте сначала начнем с установки процесса FCcgiwrap в Gentoo Linux с помощью следующей команды.

emerge --ask www-misc/fcgiwrap

2. По умолчанию пакет Fcgiwrap не предоставляет никаких сценариев init в Gentoo для управления этим процессом. После компиляции и установки пакетов создайте следующие сценарии init, которые помогут вам управлять процессом Fcgiwrap, используя три подхода: либо запуск процесса с использованием Unix Domain Sockets, либо использование локального < b>TCP-сокеты или использование обоих одновременно.

Использование сценария TCP-сокета

Создайте файл инициализации по пути /etc/init.d/ со следующим содержимым.

nano /etc/init.d/fcgiwrap

Добавьте следующее содержимое файла.

#!/sbin/runscript

ip="0.0.0.0"
port="12345"

start() {
ebegin "Starting fcgiwrap process..."
       /usr/sbin/fcgiwrap -s tcp:$ip:$port &
        tcp_sock=`netstat -tulpn | grep fcgiwrap`
        echo "Socket details: $tcp_sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap process..."
                pid=`ps a | grep fcgiwrap | grep tcp | cut -d" " -f1`
kill -s 1 $pid
                tcp_sock=`netstat -tulpn | grep fcgiwrap`
                 if test $tcp_sock =  2> /dev/null ; then
                 echo "Fcgiwrap process successfully stoped"
                tcp_sock=`netstat -atulpn | grep $port`
                if test $tcp_sock =  2> /dev/null ; then
                echo "No open fcgiwrap connection found..."
                else
                echo "Wait to close fcgiwrap open connections...please verify with 'status'"
                echo -e "Socket details: \n$tcp_sock"
                 fi
                else
                echo "Fcgiwarp process is still running!"
        echo "Socket details: $tcp_sock"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap process..."
      tcp_sock=`netstat -atulpn | grep $port`
    if test $tcp_sock =  2> /dev/null ; then
                       echo "Fcgiwrap process not running"
                     else
                echo "Fcgiwarp process is running!"
                 echo -e "Socket details: \n$tcp_sock"
                fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

Как вы можете видеть, файл сценария содержит две переменные в начале, соответственно ip и port. Измените эти переменные в соответствии с вашими потребностями и убедитесь, что они не пересекаются с другими службами в вашей системе, особенно с переменной порта (по умолчанию здесь используется 12345) — измените соответствующим образом.

Использование переменной 0.0.0.0 для IP позволяет процессу привязываться и прослушивать любой IP-адрес (доступный извне, если у вас нет брандмауэра), но из соображений безопасности вам следует изменить его на прослушивание только локально. на 127.0.0.1, если только у вас нет других причин, таких как удаленная настройка шлюза Fcgiwrap на другом узле для повышения производительности или балансировки нагрузки.

3. После создания файла добавьте разрешения на выполнение и управляйте процессом демона с помощью переключателей запуска, остановки или состояния. Переключатель состояния покажет вам соответствующую информацию о сокете, такую как пара IP-PORT, которую он прослушивает, и было ли инициализировано какое-либо активное соединение. Кроме того, если у процесса есть активные соединения в состоянии TIME_WAIT, вы не сможете перезапустить его, пока все TCP-соединения не закроются.

chmod +x /etc/init.d/fcgiwrap
service start fcgiwrap
/etc/init.d/fcgiwrap status

Использование сценария сокета Unix

Как было показано ранее, Fcgiwrap может запускаться одновременно с использованием обоих сокетов, поэтому мы немного изменим имя второго скрипта на fcgiwrap-unix-socket, чтобы обеспечить возможность запуска и выполнения обоих сценариев одновременно.

nano /etc/init.d/fcgiwrap-unix-socket

Используйте следующее содержимое файла для сокета UNIX.

#!/sbin/runscript
sock_detail=`ps a | grep fcgiwrap-unix | head -1`

start() {
ebegin "Starting fcgiwrap-unix-socket process..."
        /usr/sbin/fcgiwrap -s unix:/run/fcgiwrap-unix.sock &
        sleep 2
        /bin/chown nginx:nginx /run/fcgiwrap-unix.sock
        sleep 1
        sock=`ls -al /run/fcgiwrap-unix.sock`
        echo "Socket details: $sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap-unix-socket process..."
                pid=`ps a | grep fcgiwrap | grep unix | cut -d" " -f1`
                rm -f /run/fcgiwrap-unix.sock                 
                kill -s 1 $pid
                echo "Fcgiwrap process successfully stoped"
                #killall /usr/sbin/fcgiwrap
        sleep 1
        echo "Socket details: $sock"
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap-unix-socket process..."
  if test -S /run/fcgiwrap-unix.sock; then
       echo "Process is started with socket: $sock_detail"
        else
        echo "Fcgiwrap process not running!"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

4. Еще раз убедитесь, что этот файл является исполняемым, и используйте те же сервисные переключатели: start, stop или status. Я установил путь по умолчанию для этого сокета в системном пути /run/fcgiwrap-unix.sock. Запустите процесс и проверьте его с помощью переключателя status или просмотрите содержимое каталога /run и найдите сокет или используйте ps -a | команда grep fcgiwrap.

chmod +x /etc/init.d/fcgiwrap-unix-socket
service start fcgiwrap-unix-socket
/etc/init.d/fcgiwrap-unix-socket status
ps -a | grep fcgiwrap

Как упоминалось ранее, Fcgiwrap может работать одновременно с сокетами TCP и UNIX, но если вам не нужны подключения к внешнему шлюзу, используйте только сокет домена Unix, поскольку он использует межпроцессное взаимодействие, которое быстрее, чем соединение через TCP-петлевые соединения и меньше накладных расходов TCP.

Шаг 2. Включите сценарии CGI в Nginx

5. Чтобы Nginx мог анализировать и запускать сценарии Perl или Bash через интерфейс Fast Common Gateway, виртуальные хосты должны быть настроены с использованием определений Fcgiwrap в операторах корневого пути или местоположения.

Ниже представлен пример (localhost), который активирует сценарии Perl и CGI для всех файлов, размещенных в корневом пути (/var/www/localhost/htdocs/) с помощью .pl и расширение .cgi с использованием TCP-сокетов Fcgiwrap для пути к корневому документу по умолчанию, второе расположение с использованием Unix Domain Sockets, с файлом index.pl и третье расположение использует сокеты TCP с файлом index.cgi.

Поместите следующее содержимое или только некоторые его части в желаемый файл конфигурации виртуального хоста, в котором вы хотите активировать динамические сценарии Perl или Bash с сокетами UNIX или TCP в разных местах, изменив оператор аргумента fastcgi_pass.

nano /etc/nginx/sites-available/localhost.conf

Отредактируйте localhost.conf, чтобы он выглядел так, как показано в шаблоне ниже.

server {
                                listen 80;
                                server_name localhost;

access_log /var/log/nginx/localhost_access_log main;
error_log /var/log/nginx/localhost_error_log info;

               root /var/www/localhost/htdocs/;
                location / {
                autoindex on;
                index index.html index.htm index.php;
                                }

## PHP –FPM Gateway ###
                            location ~ \.php$ {
                            try_files $uri =404;
                            include /etc/nginx/fastcgi.conf;
                            fastcgi_pass 127.0.0.1:9001;
				}

## Fcgiwrap Gateway on all files under root with TCP Sockets###
location ~ \.(pl|cgi|rb)$ {
                fastcgi_index index.cgi index.pl;
                include /etc/nginx/fastcgi.conf;
fastcgi_pass 127.0.0.1:12345;    
                                }                                                                                                                             

## Fcgiwrap Gateway on all files under root second folder with index.pl using UNIX Sockets###
location /second {
                                index index.pl; 
root /var/www/localhost/htdocs/;
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass unix:/run/fcgiwrap-unix.sock;      
                                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                                             }                                                                                                            
                                                }

## Fcgiwrap Gateway on all files under root third folder with index.cgi using TCP Sockets###
location /third {
                                index index.cgi;               
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                 fastcgi_pass 127.0.0.1:12345;       
                                }                                                                                             
  }

6. После того, как вы закончите редактирование Nginx localhost.conf или вашего конкретного файла конфигурации виртуального хоста, перейдите к корневому пути документа вашего веб-сайта по умолчанию и создайте эти две папки, чтобы отразить ваше местоположение. и создайте индексные файлы для каждого местоположения с его конкретным расширением.

cd /var/www/localhost/htdocs
mkdir second third

Создайте файл index.pl во втором месте со следующим содержимым.

nano /var/www/localhost/htdocs/second/index.pl

Добавьте этот контент, чтобы получить переменные среды.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print <<HTML;
                <html>
                <head><title>Perl Index</title></head>
                <body>
                                <div align=center><h1>A Perl CGI index on second location with env variables</h1></div>
                </body>
HTML
print "Content-type: text/html\n\n"; foreach my $keys (sort keys %ENV) { print "$keys =
$ENV{$keys}<br/>\n";
}
exit;

Затем создайте файл index.cgi в третьем месте со следующим содержимым.

nano /var/www/localhost/htdocs/third/index.cgi

Добавьте этот контент, чтобы получить переменные среды.

#!/bin/bash
echo Content-type: text/html
echo ""
cat << EOF
<HTML>
<HEAD><TITLE>Bash script</TITLE></HEAD>
<BODY><PRE>
<div align=center><h1>A BASH CGI index on third location with env variables</h1></div>
EOF
env
cat << EOF
</BODY>
</HTML>
EOF

7. После завершения редактирования сделайте оба файла исполняемыми, перезапустите сервер Nginx и убедитесь, что оба сокета Fcgiwrap работают.

chmod +x /var/www/localhost/htdocs/second/index.pl
chmod +x /var/www/localhost/htdocs/third/index.cgi
service nginx restart
service fcgiwrap start
service fcgiwrap-unix-socket start

Затем перенаправьте свой локальный браузер на следующий URL-адрес.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Результат должен выглядеть так, как показано на скриншотах ниже.

8. Если все на месте и правильно настроено, включите автоматический запуск обоих демонов Fcgiwrap после перезагрузки, выполнив следующие команды (в случае, если вы настроили Nginx для использования обоих сокетов CGI).

rc-update add fcgiwrap default
rc-update add fcgiwrap-unix-socket default

Шаг 3. Активируйте поддержку Ruby на Fcgiwrap.

9. Если вам нужно запускать динамические сценарии Ruby на Nginx FCGI, вам необходимо установить интерпретатор Ruby на Gentoo с помощью следующей команды.

emerge --ask ruby

10. После того, как пакет скомпилирован и установлен, перейдите в Nginx доступны сайты и отредактируйте файл localhost.conf, добавив перед ним следующие инструкции: последняя фигурная скобка “ } ”, которая активирует поддержку запуска сценариев Ruby в четвертом месте по корневому пути документа по умолчанию, обслуживаемому локальным хостом Nginx.

nano /etc/nginx/sites-available/localhost.conf

Используйте следующие директивы Nginx.

## Fcgiwrap Gateway on all files under root fourth folder with index.rb under TCP Sockets###
                location /fourth {
                                index index.rb;
                                location ~ \.rb$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass 127.0.0.1:12345;       
                                                }                                                                                                             
                               }             
## Last curly bracket which closes Nginx server definitions ##
}

11. Теперь, чтобы протестировать конфигурацию, создайте четвертый каталог по пути /var/www/localhost/htdocs и создайте исполняемый скрипт индекса Ruby с .rb и добавьте следующий контент.

mkdir /var/www/localhost/htdocs/fourth
nano /var/www/localhost/htdocs/fourth/index.rb

Пример Ruby index.rb.

#!/usr/bin/ruby
puts "HTTP/1.0 200 OK"
puts "Content-type: text/html\n\n"
puts "<html><HEAD><TITLE>Ruby script</TITLE></HEAD>"
puts "<BODY><PRE>"
puts "<div align=center><h1>A Ruby CGI index on fourth location with env variables</h1></div>"
system('env')

12. После добавления разрешений на выполнение файла перезапустите демон Nginx, чтобы применить конфигурации.

chmod +x /var/www/localhost/htdocs/fourth/index.rb
service nginx restart

Откройте браузер и перейдите по URL-адресу http://localhost/fourth/, который должен предоставить вам следующий контент.

На данный момент вы настроили Nginx для обслуживания динамических сценариев Perl, Ruby и Bash на шлюзе FastCGI, но имейте в виду, что запуск такого рода интерпретируемых сценариев на шлюзе Nginx CGI может быть опасным и создавать серьезные риски для безопасности вашего сервера, поскольку они запускается с использованием активных оболочек в вашей системе, но может расширить статический барьер, налагаемый статическим HTML, добавив динамическую функциональность вашему веб-сайту.