Данное руководство позволяет запустить Python 3 в связке с веб-сервером nginx и расширить стек LEMP на ОС Gentoo GNU/Linux.
Настройка LEMP-сервера для Gentoo описана здесь: https://dondub.com/2021/07/zapusk-lemp-servera-v-gentoo/
Устанавливаем необходимые пакеты
# emerge --ask python nginx fcgiwrap
Затем открываем основной файл конфигурации nginx
# nano /etc/nginx/nginx.conf
и в секции server меняем значения listen и server_name, например так:
server {
...
listen 192.168.1.45;
server_name gvm45.homenet.local;
...
}
После этого запускаем службу nginx и включаем её в автозагрузку
# rc-service nginx start # rc-update add nginx default
Далее создадим два каталога в директории /var/www/localhost/: htdocs для хранения html и/или прочих файлов и scripts для скриптов Python
# mkdir /var/www/localhost/{htdocs,scripts}/
и для /var/www/localhost/scripts/ создадим необходимые права
# chmod 755 /var/www/localhost/scripts/
Затем создадим файл конфигурации /etc/nginx/fcgiwrap.conf
# touch /etc/nginx/fcgiwrap.conf
откроем его
# nano /etc/nginx/fcgiwrap.conf
и внесём в него такие строки:
location /scripts/ {
gzip off;
root /var/www/localhost;
fastcgi_pass unix:/var/run/fcgiwrap-unix.sock;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Также в основном файле конфигурации nginx в самом конце секции server перед закрывающей скобкой добавим строчку для включения файла конфигурации fcgiwrap.conf:
server {
...
include /etc/nginx/fcgiwrap.conf;
}
Теперь создадим 2 файла для работы служб fcgiwrap и fcgiwrap-unix-socket и зададим им права на запуск
# touch /etc/init.d/{fcgiwrap,fcgiwrap-unix-socket}
# chmod +x /etc/init.d/{fcgiwrap,fcgiwrap-unix-socket}
Откроем первый — /etc/init.d/fcgiwrap
# nano /etc/init.d/fcgiwrap
и впишем скрипт:
#!/sbin/runscript
ip="127.0.0.1"
port="9001"
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 "Fcgiwrap 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 "Fcgiwrap process is running!"
echo -e "Socket details: \n$tcp_sock"
fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}
Данный скрипт был взят отсюда: https://ru.linux-console.net/?p=874
Откроем второй — /etc/init.d/fcgiwrap-unix-socket
# nano /etc/init.d/fcgiwrap-unix-socket
и впишем такой скрипт:
#!/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..."
}
Данный скрипт был взят отсюда: https://ru.linux-console.net/?p=874
Теперь запустим обе службы и включим их в автозагрузку
# rc-service fcgiwrap start # rc-upddate add fcgiwrap default # rc-service fcgiwrap-unix-socket start # rc-update add fcgiwrap-unix-socket default
а также пора перезапустить службу nginx
# rc-service nginx restart
Готово! Теперь создадим проверочный Python-скрипт welcome.py и откроем его
# touch /var/www/localhost/scripts/welcome.py # chmod 755 /var/www/localhost/scripts/welcome.py # nano /var/www/localhost/scripts/welcome.py
запишем в него такие строки:
#!/usr/bin/python3
print('Content-Type: text/html; charset=utf-8')
print('')
print('<h1>Файл welcome.py работает!</h1>')
На другой машине в сети в адресной строке браузера введём http://IP_адрес_или_имя_хоста/scripts/welcome.py и увидим страницу с сообщением:
Файл welcome.py работает!
Для подключения к базе данных PostgreSQL с помощью скриптов Python 3 необходимо будет установить пакет psycopg2
# emerge --ask psycopg
Скрипт подключения к БД PostgreSQL можно взять отсюда: https://dondub.com/2022/03/podklyuchenie-python-3-k-bd-postgresql/