Установка FcgiWrap и включение динамических языков Perl, Ruby и Bash в Gentoo LEMP
Это руководство строго связано с предыдущим руководством по установке LEMP в Gentoo и рассматривает другие расширенные проблемы сервера, такие как включение динамических языков сценариев, таких как Perl, Bash или Ruby, через Fcgiwrap Gateway, а также редактирование файлов конфигурации виртуальных хостов Nginx для предоставлять динамический контент с помощью сценариев .pl, .rb и .cgi.
Требования
- Стек 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, добавив динамическую функциональность вашему веб-сайту.