Запуск Python 3 на веб-сервере nginx в Gentoo

Данное руководство позволяет запустить 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/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *