Apache and cgi python

Содержание
  1. Как установить Python как CGI модуль в Apache в Linux
  2. Как настроить Python в качестве CGI модуля в Apache на Debian (Ubuntu, Linux Mint, Kali Linux)
  3. Настройка Python CGI для одной директории
  4. Настройка Python CGI для всего веб-сервера
  5. Как настроить Python в качестве CGI модуля в Apache на Arch Linux (Manjaro, BlackArch)
  6. Настройка Python CGI для одной директории
  7. Настройка Python CGI для всего веб-сервера
  8. Ошибки при настройке Python CGI
  9. Вместо выполнения, веб-сервер показывает исходный код скрипта Python, либо скачивается файл вместо выполнения
  10. Ошибка сервера «Error 500. End of script output before headers» только для скриптов Python (в остальном веб-сервер работает нормально)
  11. Ошибка сервера «Error 500. malformed header from script ‘test.py’: Bad header»
  12. Ошибка «This site can’t be reached. localhost refused to connect»
  13. Полезные ссылки:
  14. Как настроить веб-сервер Apache на запуск Python в Windows
  15. 1. Установите Python
  16. 2. Настройка Apache на запуск Python CGI
  17. 3. Перезапустите Apache
  18. 4. Запустите тестовую страницу Python

Как установить Python как CGI модуль в Apache в Linux

Python поддерживает Common Gateway Interface (CGI), то есть программы (скрипты), написанные на Python могут взаимодействовать с информационными серверами, такими как, такими как HTTP-серверы (Apache, например).

Веб-сервер может запускать скрипты Python и выводить полученные данные даже если Python не установлен как модуль CGI веб-сервера.

Например, в следующем примере PHP скрипт получает данные из формы методом POST и затем запускает программу Python, передавая полученные данные в качестве аргументов командной строки:

После завершения выполнения скрипта Python, будет выведена информация, полученная от script.py.

Несмотря на преимущества этого способа — не нужно настраивать Python как модуль CGI веб-сервера — имеются и недостатки.

Читайте также:  Include element in array php

Если Python не установлен как модуль CGI, то:

  1. Для запуска скриптов Python необходимо использовать PHP
  2. Скрипты Python не будут иметь прямой доступ к данным переданным методами GET и POST.

Соответственно, настройка Python в качестве CGI модуля веб-сервера делает возможным запуск скриптов напрямую и доступ к переменным окружения веб-сервера напрямую, в том числе к данным переданным методами GET и POST.

Далее рассмотрено подключение Python к Apache как CGI для двух групп дистрибутивов:

  • Debian и производных дистрибутивов (Ubuntu, Linux Mint, Kali Linux)
  • Arch Linux производных дистрибутивов (Manjaro, BlackArch)

Этап установки Python в операционную систему пропущен, поскольку для большинства ОС Python предустановлен по умолчанию. Если в вашем Linux отсутствует Python, то предварительно установите его.

Возможны 2 варианта настройки:

  • скрипты Python обрабатываются модулем CGI только если они помещены в специальную директорию на веб-сервере (например, cgi-bin)
  • скрипты Python обрабатываются модулем CGI в любой папке веб-сервера

Как настроить Python в качестве CGI модуля в Apache на Debian (Ubuntu, Linux Mint, Kali Linux)

Настройка Python CGI для одной директории

Выполните команду для включения модуля CGI:

Перезапустите веб-сервер, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Создайте файл /usr/lib/cgi-bin/test.py:

sudo gedit /usr/lib/cgi-bin/test.py

Скопируйте в этот файл следующее содержимое:

#!/usr/bin/python3 print ("Content-type: text/html") print ("") print ("") print ("") print ("") print ("") print ("Hello.") print ("")

Сделайте этот файл исполнимым:

sudo chmod +x /usr/lib/cgi-bin/test.py

Если всё настроено правильно, то вы должны увидеть в веб-браузере строку

Примечание: Если вместо директории /usr/lib/cgi-bin/ вы хотите для CGI скриптов использовать другую папку, то укажите её в файле /etc/apache2/conf-enabled/serve-cgi-bin.conf.

Настройка Python CGI для всего веб-сервера

Выполните команду для включения модуля CGI:

Откройте файл /etc/httpd/conf/httpd.conf — конфигурационный файл веб-сервера:

sudo gedit /etc/httpd/conf/httpd.conf
 Options Indexes FollowSymLinks AllowOverride None Require all granted 
 Options Indexes FollowSymLinks ExecCGI AllowOverride None Require all granted 

ВНИМАНИЕ: набор опций у вас может быть другим.

В конец файла добавьте следующую строку:

AddHandler cgi-script .cgi .py

Перезапустите веб-сервер, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Создайте файл /var/www/html/test.py:

sudo gedit /var/www/html/test.py

Скопируйте в этот файл следующее содержимое:

#!/usr/bin/python3 print ("Content-type: text/html") print ("") print ("") print ("") print ("") print ("") print ("Hello.") print ("")

Сделайте этот файл исполнимым:

sudo chmod +x /var/www/html/test.py

Если всё настроено правильно, то вы должны увидеть в веб-браузере строку

Как настроить Python в качестве CGI модуля в Apache на Arch Linux (Manjaro, BlackArch)

Настройка Python CGI для одной директории

Создайте директорию /srv/http/cgi-bin/ — здесь будут располагаться скрипты Python:

Откройте файл /etc/httpd/conf/httpd.conf — конфигурационный файл веб-сервера:

sudo gedit /etc/httpd/conf/httpd.conf
 AllowOverride None Options None Require all granted 
 AllowOverride None Options ExecCGI Require all granted 

Примечание: если вы не видите разницу, то обратите внимание на директиву «Options» — добавлена опция «ExecCGI».

 #LoadModule cgi_module modules/mod_cgi.so 
 LoadModule cgi_module modules/mod_cgi.so 

То есть раскомментируйте строку.

Обратите внимание на строку

ScriptAlias /cgi-bin/ "/srv/http/cgi-bin/"

Менять её необязательно, но при желании вы можете вместо /srv/http/cgi-bin/ использовать любую другую папку, достаточно только создать новую папку и указать её с этой директивой вместо /srv/http/cgi-bin/.

Перезапустите веб-сервер, чтобы изменения вступили в силу:

sudo systemctl restart httpd.service

Создайте файл /srv/http/cgi-bin/test.py:

sudo gedit /srv/http/cgi-bin/test.py

Скопируйте в этот файл следующее содержимое:

#!/usr/bin/python3 print ("Content-type: text/html") print ("") print ("") print ("") print ("") print ("") print ("Hello.") print ("")

Сделайте этот файл исполнимым:

sudo chmod +x /srv/http/cgi-bin/test.py

Если всё настроено правильно, то вы должны увидеть в веб-браузере строку

Настройка Python CGI для всего веб-сервера

Откройте файл /etc/httpd/conf/httpd.conf — конфигурационный файл веб-сервера:

sudo gedit /etc/httpd/conf/httpd.conf
 #LoadModule cgi_module modules/mod_cgi.so 
 LoadModule cgi_module modules/mod_cgi.so 

То есть раскомментируйте строку.

Options Indexes FollowSymLinks

и добавьте к ней ExecCGI. Должна получиться такая строка (ВНИМАНИЕ: набор опций у вас может быть другим):

Options Indexes FollowSymLinks ExecCGI

Раскомментируйте её, то есть удалите символ # в начале строки и добавьте к концу строки .py. Новая строка будет выглядеть примерно так:

AddHandler cgi-script .cgi .py

Перезапустите веб-сервер, чтобы изменения вступили в силу:

sudo systemctl restart httpd.service

Создайте файл /srv/http/test.py:

Скопируйте в этот файл следующее содержимое:

#!/usr/bin/python3 print ("Content-type: text/html") print ("") print ("") print ("") print ("") print ("") print ("Hello.") print ("")

Сделайте этот файл исполнимым:

sudo chmod +x /srv/http/cgi-bin/test.py

Если всё настроено правильно, то вы должны увидеть в веб-браузере строку

Ошибки при настройке Python CGI

Вместо выполнения, веб-сервер показывает исходный код скрипта Python, либо скачивается файл вместо выполнения

Это означает, что настройка CGI не выполнена или не завершена. Причинами могут быть:

  • веб-сервер не перезагружен после внесения изменений в конфигурационные файлы
  • вы отредактировали неверный конфигурационный файл
  • вы настроили выполнение скриптов CGI только в одной папке, но при этом пытаетесь запустить скрипт в другой

Ошибка сервера «Error 500. End of script output before headers» только для скриптов Python (в остальном веб-сервер работает нормально)

Пример ошибки, которую показывает веб-браузер при попытке выполнить скрипт Python на веб-сервере:

Server error! The server encountered an internal error and was unable to complete your request. Error message: End of script output before headers: test.py If you think this is a server error, please contact the webmaster. Error 500

Причинами ошибки могут быть:

  • файл Python не является исполнимым (отсутствует разрешение на выполнение)
  • программа Python имеет ошибку синтаксиса, которая приводит к преждевременному завершению работы скрипта

Чтобы проверить, имеет ли скрипт разрешение на запуск можно использовать утилиту ls с опцией -l, после которой укажите полный путь до файла:

-rwxr-xr-x 1 root root 127 May 20 13:11 /srv/http/cgi-bin/test.py

Буквы «x» означают, что имеет привилегии на запуск как программы.

Чтобы проверить, имеются ли ошибки синтаксиса, запустите скрипт в командной строке, указав до него полный путь:

Ошибка сервера «Error 500. malformed header from script ‘test.py’: Bad header»

Server error! The server encountered an internal error and was unable to complete your request. Error message: malformed header from script 'test.py': Bad header:  If you think this is a server error, please contact the webmaster. Error 500

Ключевым является сообщение «malformed header from script», то есть неправильный заголовки.

Имеются ввиду заголовки HTTP протокола. Когда Python работает как CGI, скрипт должен начинать свой вывод с отправки HTTP заголовка, а затем двух пустых строк.

Например, следующий код вызовет ошибку:

#!/usr/bin/python3 print ("") print ("") print ("") print ("Hello.") print ("")

Чтобы ошибка не возникала, код должен быть таким:

#!/usr/bin/python3 print ("Content-type: text/html") print ("") print ("") print ("") print ("") print ("") print ("Hello.") print ("")

Ошибка «This site can’t be reached. localhost refused to connect»

Если после внесения изменений в конфигурационный файл Apache вы стали получать сообщение об ошибке:

This site can’t be reached localhost refused to connect.

То, скорее всего, неправильно выполнена конфигурация Apache, в результате чего не удалось перезапустить веб-сервер.

Ошибка может быть связана с неверным синтаксисом.

Чтобы посмотреть статус веб-сервера в Debian и производных дистрибутивах выполните команду:

sudo systemctl status apache2

Чтобы посмотреть статус веб-сервера в Arch Linux и производных дистрибутивах выполните команду:

sudo systemctl status httpd.service

Полезные ссылки:

Источник

Как настроить веб-сервер Apache на запуск Python в Windows

Скрипты Python можно запускать в окружении Apache аналогично запуску скриптов PHP. Для этого нужно сделать небольшую настройку.

Я устанавливал веб-сервер по этой инструкции, если вы устанавливали по другой инструкции, то отредактируйте пути под свои значения.

1. Установите Python

Если у вас ещё не установлен Python, то скачайте установщик здесь: https://www.python.org/downloads/windows/ (файл Windows x86-64 executable installer).

Я установил в предлагаемый путь, но также выбрал добавление папки с исполнимыми файлами Python в переменные окружения (возможно, это делать необязательно).

Забегая вперёд скажу — путь до папки с установленным Python нужно будет указывать в начале каждого Python cgi скрипта, поэтому или выберите более простую папку, куда вы устанавливаете Python, либо запомните имя путь до предложенной директории.

В конце программа установки предложила снять максимальное ограничение на длину пути — я согласился (возможно, это делать необязательно):

2. Настройка Apache на запуск Python CGI

Теперь откройте для редактирования файл httpd.conf, у меня он расположен по пути C:\Server\bin\Apache24\conf\httpd.conf.

Options Indexes FollowSymLinks

и добавьте к ней ExecCGI. Должна получиться такая строка (ВНИМАНИЕ: набор опций у вас может быть другим):

Options Indexes FollowSymLinks ExecCGI

Раскомментируйте её, то есть удалите символ # в начале строки и добавьте к концу строки .py. Новая строка будет выглядеть примерно так:

AddHandler cgi-script .cgi .py

3. Перезапустите Apache

c:\Server\bin\Apache24\bin\httpd.exe -k restart

4. Запустите тестовую страницу Python

В папке для ваших сайтов (у меня это C:\Server\data\htdocs\) создайте файл test.py и скопируйте в него:

#!C:\Users\Alex\AppData\Local\Programs\Python\Python37\python.exe print ("Content-type: text/html\n\n") print print ("") print ("") print ("") print ("Hello.") print ("")

Обратите внимание на самую верхнюю строку, то есть на C:\Users\Alex\AppData\Local\Programs\Python\Python37\python.exe — вам нужно заменить её на своё значение, указав путь до файла python.exe. Даже если вы выбрали предложенную по умолчанию папку, как минимум, вам нужно заменить имя пользователя Alex на имя своего пользователя.

ПРИМЕЧАНИЕ: обратите внимание, что путь до файла python.exe может различаться в зависимости от выбранной папки для установки, имени пользователя (если вы установили в C:\Users\), а также в зависимости от версии, например, это может быть папка Python39:

#!C:\Users\ПОЛЬЗОВАТЕЛЬ\AppData\Local\Programs\Python\Python39\python.exe

Отредактируйте самую верхнюю строку в соответствии с вашей установкой.

Должна будет появиться надпись

Как показано на скриншоте ниже:

Источник

Оцените статью