zaLinux.ru

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


Оглавление

1. Как запустить скрипт Python на веб-сервере

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

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

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

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

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

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

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

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

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

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

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

5. Полезные ссылки


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

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

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

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

<?php

echo shell_exec ('python /srv/http/test-python/script.py ' . $_POST["name"] . ' ' . $_POST["surname"] . ' '. $_POST["info"]);

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

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

Если 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 получить данные от веб-страницы методами GET и POST

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

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

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

sudo a2enmod 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 ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

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

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

Откройте в веб-браузере адрес http://localhost/cgi-bin/test.py


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

Hello.

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

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

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

sudo a2enmod cgi

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

sudo gedit /etc/httpd/conf/httpd.conf

Найдите там группу строк

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

и замените их на

<Directory /var/www/>
	Options Indexes FollowSymLinks ExecCGI
	AllowOverride None
	Require all granted
</Directory>

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

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

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 ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

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

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

Откройте в веб-браузере адрес http://localhost/test.py

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

Hello.

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

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

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

sudo mkdir /srv/http/cgi-bin/

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


sudo gedit /etc/httpd/conf/httpd.conf

Найдите группу строк:

<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

И замените её на:

<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Require all granted
</Directory>

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

Найдите группу строк

<IfModule mpm_prefork_module>
	#LoadModule cgi_module modules/mod_cgi.so
</IfModule>

И замените на

<IfModule mpm_prefork_module>
	LoadModule cgi_module modules/mod_cgi.so
</IfModule>

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


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

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 ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

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

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

Откройте в веб-браузере адрес http://localhost/cgi-bin/test.py

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

Hello.

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

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

sudo gedit /etc/httpd/conf/httpd.conf

Найдите группу строк

<IfModule mpm_prefork_module>
	#LoadModule cgi_module modules/mod_cgi.so
</IfModule>

И замените на

<IfModule mpm_prefork_module>
	LoadModule cgi_module modules/mod_cgi.so
</IfModule>

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

Затем найдите строку

Options Indexes FollowSymLinks

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

Options Indexes FollowSymLinks ExecCGI

Теперь найдите строку:

#AddHandler cgi-script .cgi

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

AddHandler cgi-script .cgi .py

Закройте файл.

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

sudo systemctl restart httpd.service

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

sudo gedit /srv/http/test.py

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

#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

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

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

Откройте в веб-браузере адрес http://localhost/test.py

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

Hello.

Ошибки при настройке 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, после которой укажите полный путь до файла:

ls -l /srv/http/cgi-bin/test.py

Пример вывода:

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

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

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

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

Ошибка сервера «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: <html><head>

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 ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

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

#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

Ошибка «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

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


Рекомендуемые статьи:

Оставить комментарий

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