Проблема с запуском python script как cgi под apache (ubuntu 12)
Раскрытие информации: я много искал, и я не думаю, что на мой вопрос (для моей конфигурации) ответят здесь. Например
запустить python script как cgi apache server
не отвечает на него.
Итак:
У меня есть самый простой способ script:
#!/usr/bin/env python
print "Content-type: text/html"
print ""
print "<h1>Hello from Python!</h1>"
Когда я запускаю его в браузере, он буквально отображает себя вместо ожидаемого
Привет от Python!
Я сделал следующее для запуска:
a) он исполняется всеми; Он отлично работает в оболочке.
b) он находится в виртуальном каталоге, который имеет следующую конфигурацию (в/etc/apache2/sites-available/my_cgi_dir):
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/my_cgi_dir/>
Options Indexes +ExecCGI FollowSymLinks MultiViews
AddHandler cgi-script .cgi .py
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Как вы видите, он имеет
Options Indexes +ExecCGI FollowSymLinks MultiViews
и
AddHandler cgi-script .cgi .py
c) Я убедился, что apache поддерживает python, запустив
sudo apt-get install libapache2-mod-python
d) Да, я перезапустил apache.
Тем не менее, я просто вижу источник script вместо "Hello Python".
Что мне не хватает?
Пожалуйста, помогите.
PS: если это может помочь, вот что я запускаю:
Linux ip-172-31-37-178 3.2.0-40-virtual # 64-Ubuntu SMP Mon Mar 25 21:42:18 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Версия сервера: Apache/2.2.22 (Ubuntu)
Python 2.7.3
Ответы
Ответ 1
Что также может вызвать эти симптомы, так это то, что модуль apache2 cgi не загружен. Это также будет генерировать сообщение журнала в /var/log/apache2/access.log
с ошибкой HTTP 304:
192.168.2.3 - - [26/Jul/2014:11:56:34 +0200] "GET /cgi-bin/hello.py HTTP/1.1" 304 179 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"
Проверьте загруженные модули с помощью
apache2ctl -M
Ищите:
cgid_module (shared)
Если он не загружен, загрузите его с помощью
a2enmod cgid
Затем перезапустите apache2:
service apache2 reload
Затем обновите браузер и очистите кеш браузера (CTRL + F5). И/или перезагрузите браузер, чтобы убедиться, что он запрашивает фактическую страницу, вместо использования кеша браузера.
Ответ 2
попробуйте это
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
cgi script
import cgi
import cgitb; cgitb.enable()
print "Content-type: text/html\n\n"
print "<h1>Hello from Python!</h1>"
Почему бы вам не настроить такую функцию? здесь.
ScriptAlias /cgi-bin/ /var/www/my_cgi_dir/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
Ответ 3
В моем случае я допустил ошибку с моей директивой ScriptAlias
. Я раскоментировал оригинальный, но забыл настроить новый.
Как только я правильно изменил и сохранил конфигурационный файл sites-available/default
из этого:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
.. к этому:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
.. и перезагрузили apache2, он просто сработал: он прекратил показывать мои сценарии как текст и начал запускать их как script. Кроме того, он больше не отображает /var/www/cgi-bin
как каталог в браузере, но теперь корректно отображает ошибку:
Forbidden
You don't have permission to access /cgi-bin/ on this server.
Ответ 4
У меня была такая же проблема и я пробовал все вышеперечисленное. Ничего не помогло. В конце концов это оказалось действительно глупой ошибкой. Поскольку у многих людей есть проблемы с этим, я все равно отправлю его:
Я не привязал свой сайт по умолчанию от "sites-available" до "sites-enabled", как описано в верхней части файла apache.conf:
[...] Конфигурационные файлы в моделях с поддержкой модов и сайтах/каталогов содержат определенные фрагменты конфигурации, которые управляют модулями или виртуальными хост конфигураций, соответственно.
Они активируются путем ссылки на имеющиеся файлы конфигурации из их соответствующие * -доступные/аналоги. Они должны управляться с помощью нашего помощники a2enmod/a2dismod, a2ensite/a2dissite. Видеть их соответствующие страницы руководства для получения подробной информации. [...]
Таким образом, все мои изменения в файле по умолчанию не были прочитаны apache. Как только я сделал символическую ссылку, она сработала.
Ответ 5
Это сработало для меня,
как предлагалось @flyking_, выполните дополнительные шаги в том же порядке.
Мне пришлось сменить в каталоге - я использую raspberrypi (версия NOOB linux)
/etc/apache 2/sites-available/default
поддерживайте те, что добавляются
+ ExecCGI, а также
Addhander cgi- script.cgi.py, как показано ниже
<Directory /var/www/>
Options Indexes +ExecCGI FollowSymLinks MultiViews
AddHandler cgi-script .cgi .py
AllowOverride None
Order allow,deny
allow from all
Затем перезапустите apache
service apache2 restart
Это должно перезапустить службу и проверить, работает ли python script без ошибок в терминале, прежде чем запускать его в браузере.
Если ошибок нет, то sampe script будет работать нормально.
import cgi
import cgitb; cgitb.enable()
print "Content-type: text/html\n\n"
print "<h1>Hello from Python!</h1>"
Imp: позже мой script работал отлично даже без обоих импортов.
Примечание. Очистите кеш в браузере или загрузите его заново ctrl + F5.
Надеюсь, это должно решить.
Если это не решит, попробуйте это как @user2449877.
Проверьте загруженные модули на:
apache2ctl -M
Ищите:
cgid_module (shared)
Если он не загружен, загрузите его с помощью
a2enmod cgid
Перезапустите apache, а затем обновите браузер
Ответ 6
В моем случае (который является общей машиной unix), мне также нужно создать скрытый файл ".htaccess" со следующим:
Options +ExecCGI
SetHandler cgi-script
Также важно установить соответствующие разрешения (755 - группа и прочее без прав на запись, но разрешение на выполнение), а также иметь:
#!/usr/bin/python
как первая строка CGI python script.