我在DigitalOcean Droplet中使用Ubuntu 16.04服务器,Python 2.7.12和Apache 2.4.18。
我将index.py
上传到了网络根目录。该脚本的内容如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Turn on debug mode.
import cgitb
import platform
cgitb.enable()
# Print necessary headers.
print "Content-Type: text/html\n"
print "<html><body>Python Version: %s</body></html>" % (platform.python_version())
如果我将index.py
设置为644(没有执行权限),则脚本将返回500 Internal Server Error。日志说:
[2018年12月28日星期五04:05:18.035946] [cgi:error] [pid 29045] [client 202.75.86.173:54912]标头之前的脚本输出结束:index.py
从另一个答案中,建议我应该通过chmod +x index.py
添加许可权:
-rwxr-xr-x 1 root www-data 254 Dec 28 04:05 index.py
添加执行权限后,Python脚本可以正常运行。
这是Apache站点配置:
<VirtualHost *:80>
ServerName abc.example.com
DocumentRoot /var/www/vhosts/abc.example.com
<Directory /var/www/vhosts/abc.example.com/>
Options -Indexes
Options +ExecCGI
DirectoryIndex index.py
AllowOverride All
Order allow,deny
allow from all
</Directory>
AddHandler cgi-script .py
ErrorLog ${APACHE_LOG_DIR}/abc-apache2.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access-logfile.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =abc.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
更新:
这个问题与我遇到的错误无关,正如我在问题中提到的那样,我已经使脚本工作了。我只是担心安全。简而言之,不是重复的。
答案 0 :(得分:1)
1。。是的,您做对了。
您说过要Apache将.py文件作为cgi-script执行。 这意味着如果授权,apache将“执行”您的index.py文件。然后,您必须授予apache权限才能执行python文件。
在index.py文件中,有一个shebang,用于指示要使用哪个解释器执行该文件。
2。。根据您的情况,您可以像这样设置良好的安全性:
chown www-data:www-data index.py
chmod 550 index.py
然后只有root用户才能修改或删除文件。 而且只有apache用户和apache组才能读取或执行脚本(假设您的apache用户/组是www-data)。