环境:Ubuntu 16,Apache 2.4
我最近三次尝试设置 Apache 来提供 Python 时都遇到了同样的问题:Apache 希望让我下载脚本,而不是运行它并在浏览器中提供 html。每次我弄清楚时,结果都是一些我无法完全弄清楚的事情的组合。
为简单起见:
我的文件顶部有以下内容:#!/usr/bin/env python2.7
冉sudo apt-get install libapache2-mod-python
跑步a2enmod python
回报Module python already enabled
添加了各种 apache2.conf 指令,但它们都不起作用:
<Directory /var/www/html>
Options Indexes FollowSymLinks
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AddHandler cgi-script .cgi
</Directory>
根据此链接,这就是所需的全部内容:
<Directory /srv/www/yoursite/public_html>
Options +ExecCGI
AddHandler cgi-script .py
</Directory>
并且,这个可以在另一台机器上运行,但不能在当前机器上运行:
<Directory /var/www/>
Options +ExecCGI
AddHandler cgi-script .py
PythonHandler mod_python.publisher
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/html/index.py>
Options +ExecCGI
</Directory>
*抱歉,如果这些 apache2.conf 看起来很乱,或者有多余的行,我已经尝试了一切方法。
跑步sudo a2enmod cgi
回报:
您的 MPM 似乎是线程化的。选择 cgid 而不是 cgi。模块 cgid 已启用
.py 脚本是可执行的,归 www-data 所有。
请帮忙!这太令人沮丧了。我还有啥没试过的?我希望这是我最后一次这么做。每次我接近阿帕奇时,我都心存恐惧;也许它能闻到我的气味。
仅供参考:我已尝试过这些网站(以及许多其他网站)上的所有(故障排除)步骤:
https://www.linux.com/blog/configuring-apache2-run-python-scripts
为什么我会收到错误,无效命令‘PythonHandler’?
Apache 无法通过浏览器处理 Python 脚本 (*.py)
更新
所以,就是这样。我使用 /var/www/html/ 中的 test.py 来不更改源目录。也许我的浏览器或访问方式有问题?
$ ls -ltr /var/www/html/test.py
-rwxr-xr-x 1 www-data www-data 71 Mar 31 17:29 test.py
$ cat /var/www/html/test.py
#!/usr/bin/python2
print("Content-type:text/html\n\n")
print("hello")
$ grep -A 3 '<Directory /var/www/html/>' /etc/apache2/apache2.conf
<Directory /var/www/html/>
Options +ExecCGI
AddHandler cgi-script .py
</Directory>
$ ./test.py
Content-type:text/html
hello
我查看了日志文件。access.log 中没有任何异常,但 error.log 中有一个关于 Python 版本不匹配的错误。根据这个关联,这应该不是问题。无论如何,我通过运行以下命令解决了该错误:
$ apt-get remove libapache2-mod-python libapache2-mod-wsgi
$ apt-get build-dep libapache2-mod-python libapache2-mod-wsgi
证明:脚本下载
还是没运气。我注意到即使停止后,apache2 服务仍在运行。我以为这可能是僵尸进程,于是我终止了所有进程(它一直弹出),卸载并清除了 apache2,重新启动并重试。
答案1
您已获得以下配置:
<Directory /var/www/html>
Options Indexes FollowSymLinks
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AddHandler cgi-script .cgi
</Directory>
这会告诉您的 Apache 服务器,以 结尾的文件.cgi
应作为脚本处理。但您已将脚本命名为test.py
。
请将脚本重命名为test.cgi
或将配置更改为
AddHandler cgi-script .py
答案2
你可能已经接近了。
这是我在 Ubuntu 上添加到 Apache2 设置的唯一内容
注意烫发
#ls -ltr /var/www/html/python/char.py
-rwxr-xr-x 1 www-data www-data 71 Mar 31 17:16 /var/www/html/python/char.py
简单的 python2 脚本 - 确保你设置了内容类型
# cat /var/www/html/python/char.py
#!/usr/bin/python2
print("Content-type:text/html\n\n")
print("hello")
在本地运行良好
#/var/www/html/python/char.py
Content-type:text/html
hello
配置
# grep -A 3 '<Directory /var/www/html/python/>' /etc/apache2/apache2.conf
<Directory /var/www/html/python/>
Options +ExecCGI
AddHandler cgi-script .py
</Directory>
答案3
我遇到了同样的问题,并尝试了您执行的所有故障排除步骤。我遇到的问题是,我的 php 文件中有指向 cgi 脚本的链接,当我的 php 服务器运行时(使用 php -S localhost:8000),cgi 脚本会从浏览器下载。但是,当我停止 php 服务器,然后使用 localhost/myScript.php 从浏览器访问 php 脚本(因此单击按钮即可从那里访问 cgi)时,它就起作用了。
因此,如果您还在运行 php 服务器,请尝试停止它,然后从浏览器运行 php 文件。