Выполнение Python script в Apache2

Я пытаюсь выполнить программу Python с помощью Apache. Однако Apache будет обслуживать только файл, а не выполнять его. Разрешения для файла - r/w/x, и он находится в /var/www. После публикации содержимого httpd.conf и программного кода. Я также попытался запустить python script как файл .cgi, но это не сработало. У меня есть оба модуля mod_python и mod_wsgi, загруженные в apache.

Пример Python:

#!/usr/bin/python

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"

httpd.conf:

AddHandler cgi-script .cgi .pl
AddHandler python-program .py

Я знаю его небольшой файл httpd.conf, но когда я установил apache, ничего не было в файле. Я должен также упомянуть, что это просто так, что я изучаю основы работы python в apache. Он не предназначен для производства. Спасибо за помощь!

Изменить

Я использую Ubuntu 10.04, а версия apache - 2. У меня есть версия python 2.6, которая автоматически используется при вызове #!/usr/bin/env python.
Я получаю две основные ошибки: во-первых, файл не найден, хотя права доступа к файлу и папке 777. Ошибка из журнала

[Sun Feb 05 13:29:44 2012] [error] [client 192.168.1.3] File does not exist: /var/www/poit-0.1

Эта ошибка для другого питона script, который я не писал. Странно, что файл отображается в индексе папки при доступе из окна браузера. Однако, когда я перехожу к файлу, я получаю вышеуказанную ошибку.

Другая ошибка, которую я получаю, - это преждевременный конец заголовков. Ошибка ниже:

[Sun Feb 05 12:10:19 2012] [error] (8)Exec format error: exec of '/var/www/pyth.py' failed
[Sun Feb 05 12:10:19 2012] [error] [client 192.168.1.3] Premature end of script headers: pyth.py

Ответ 1

Первая строка httpd.conf: AddHandler cgi-script .cgi .pl не имеет значения, так как вы тестируете скрипты python, а не perl-скрипты. И вы должны определить эти директивы в месте расположения вашего python script и сообщить apache, что он должен выполнять скрипты cgi в этом месте: Options +ExecCGI. Этот фрагмент будет началом:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
</Directory>

Добавление 1:

Как и в моем последнем комментарии, попробуйте этот script. Он должен плевать на информацию о среде cgi.

#!/usr/bin/python
import cgi
cgi.test()

Добавление 2:

Я получил ваш script для работы с вышеуказанной конфигурацией. Проблема в том, что script написан на python2. И интерпретатор по умолчанию apache вызывает выполнение script, это python3 (по крайней мере, в моем случае, и, скорее всего, это будет для вас одинаково).

Это версия python3 мира hello script:

#!/usr/bin/env python

# enable debugging
import cgitb
cgitb.enable()

print("Content-Type: text/plain;charset=utf-8")
print()

print("Hello World!")

Добавление 3:

Для первой ошибки убедитесь, что разрешения и права собственности на любой каталог и файлы, которые вы пытаетесь развернуть, правильно установлены. И попробуйте добавить эти директивы в httpd.conf:

Order allow,deny
Allow from all

Что вы получите:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
  Order allow,deny
  Allow from all
</Directory>

Для второй ошибки, если я что-то не хватает, похоже, что apache вызывает интерпретатор python 3 для выполнения вашего script. Чтобы исключить эту возможность, вы можете попробовать следующее:

ls -al /usr/bin/python*

Здесь перечислены интерпретаторы python, доступные в вашей системе. Если у вас несколько интерпретаторов, вы получите что-то похожее на этот вывод:

/usr/bin/python -> python3*
/usr/bin/python2.6*  
/usr/bin/python3*  

Если нет, это будет такой вывод:

/usr/bin/python -> python2.6*
/usr/bin/python2.6*  

Чтобы убедиться, что это не проблема, которую вы испытываете, попробуйте этот модифицированный образец script:

#!/usr/bin/python2.6

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"

Вы заметите, что я явно упомянул версию интерпретатора apache, которая должна вызывать, что является уродливым. Но ради тестирования вы можете это сделать. Конечно, вы должны сопоставить #!/usr/bin/python2.6 с любым бинарным файлом на вашем сервере и убедиться, что вы не смешиваете совместимый код python 3 с интерпретатором python 2 и наоборот.

Ответ 2

Re: ошибка формата Exec.

Я забегал к этому сам пару раз. У меня было то же самое (загадочное) сообщение об ошибке.

Я разрабатывал скрипты Python (3) для использования через CGI в Notepad ++ на моей машине с Windows, а затем загружал их на свой Linux-сервер.

После многих разочарований я обнаружил, что эта проблема связана с концами строк, и вам нужно преобразовать окончание строк Windows (\ r\n) в конец строки UNIX (\n).

В Notepad ++ (6.1.5) вы можете добиться этого, перейдя в меню "Правка" и выбрав вариант преобразования EOL, а затем сохраните файл.

Ответ 3

** Для версии apache2 версии 2.4

sudo apt-get install python
sudo apt-get install apache2

изменить файл /etc/apache 2/conf-enables/serve-cgi-bin.conf

==== комментарий старого раздела и добавить код ниже:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AddHandler cgi-script .py
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

=========================================

изменить файл /etc/apache 2/apache2.conf *** добавьте код ниже:

<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

<Directory /usr/local/apache2/cgi-bin>
Require all granted
</Directory>

Внимание!

use for apache2.4 
  file python keep in directory: /var/www/cgi-bin/
  You can test :go to http://localhost/cgi-bin/<namefile>.py

referrence https://www.linux.com/blog/configuring-apache2-run-python-scripts

Ответ 4

В моем случае это была тривиальная проблема. Мне пришлось добавить эту строку:

#!/usr/bin/python3

в начало каждого файла .py, который я хотел запустить.

Затем все начало работать правильно.

Ответ 5

У меня был тот же симптом, и мой конфиг выглядел хорошо по сравнению с ответами выше.

Я обнаружил, что моя новая установка не была настроена для загрузки mod_cgi.so

Загрузка необходимого модуля выглядит примерно так. Если перезагрузка сервера приведет к ошибке, что файл не найден, выясните, где файл соответствующим образом настроил путь.

LoadModule cgi_module modules/mod_cgi.so

Ответ 6

Я предполагаю, что вы используете firefox. Я читал где-то еще в сети, что это может быть связано с дополнениями firefox, установленными на машине.

Я получал эту ошибку, и я использую firefox 20. Перешел в Opera, и я больше не получал ошибок, и скрипты python, казалось, выполнялись просто отлично.

Изменить: это был вызов метода eval(), который я упустил, добавив "(" и ")" к результатам script, которые вызвали мой отказ. Как только я удалил их, это сработало для меня.

Я заметил, что вы не публиковали javascript, html или что-то, что вы используете для вызова script в первую очередь. Возможно, вы могли бы опубликовать его для нас? Я сделал прямой пример копирования/вставки с сайта блога, не глядя на то, что я скопировал. Это была моя ошибка.