Выполнение 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 в первую очередь. Возможно, вы могли бы опубликовать его для нас? Я сделал прямой пример копирования/вставки с сайта блога, не глядя на то, что я скопировал. Это была моя ошибка.