【发布时间】:2018-10-06 22:31:58
【问题描述】:
我正在尝试在 python 中构建一个可以从 XAMPP 的 Apache 运行的应用程序,因此我安装了 flask ($ pip install flask) 并按照以下说明安装 mod_wsgi http://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html。
我正在使用来自 XAMPP 的 Apache,版本 2.4.29 和来自 anaconda 的 python 3.6.4。我通过从https://github.com/GrahamDumpleton/mod_wsgi/releases 下载并使用以下命令构建了 mod_wsgi 文件(版本 4.6.4):
$ ./configure --with-apxs=/Applications/XAMPP/xamppfiles/bin/apxs --with-python=/Users/pauline/anaconda3/bin/python3.6 --disable-framework
紧随其后的是make和sudo make install。我也尝试过使用和不使用--disable-framework。安装后,我检查了otool -L mod_wsgi.so,它给了我(看起来正确):
SCARLET10siMac4:modules pauline$ otool -L mod_wsgi.so
mod_wsgi.so:
@rpath/libpython3.6m.dylib (compatibility version 3.6.0, current version 3.6.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1452.23.0)
此外,当检查 Apache 加载的模块时(通过运行此命令:/Applications/XAMPP/xamppfiles/bin/httpd -M),它也会显示wsgi_module (shared)。 sys.prefix 的输出是 /Users/pauline/anaconda3 和 sys.version 的输出是 3.6.4
我的应用程序 (image_download.py) 有以下简单代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
if __name__ == "__main__":
app.run()
还有我的wsgi文件(image_download.wsgi)如下:
import sys
sys.path.insert(0,"/Users/pauline/Documents/Code/platform_projects/image_download/image_download")
from image_download import app as application
最后,我的 http.conf 虚拟主机部分是:
WSGIPythonHome /Users/pauline/anaconda3
<VirtualHost *:80>
DocumentRoot "/Users/pauline/Documents/Code/platform_projects/image_download"
ServerName imageDownload.localhost
ServerAlias imageDownload.localhost
WSGIDaemonProcess image_download user=daemon group=daemon threads=5 home=/Users/pauline/Documents/Code/platform_projects/image_download python-path=/Users/pauline/Documents/Code/platform_projects/image_download:/Users/pauline/anaconda3/lib/python3.6/site-packages
WSGIScriptAlias / /Users/pauline/Documents/Code/platform_projects/image_download/image_download.wsgi
<Directory /Users/pauline/Documents/Code/platform_projects/image_download>
WSGIProcessGroup image_download
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
</VirtualHost>
当我作为本地主机运行我的应用程序时,它给了我一个服务器错误!错误 500,当我检查 apache 错误日志时,它显示以下内容:
[wsgi:error] [pid 6011] [remote ::1:50865] mod_wsgi (pid=6011): Target WSGI script '/Users/pauline/Documents/Code/platform_projects/image_download/image_download.wsgi' cannot be loaded as Python module.
[wsgi:error] [pid 6011] [remote ::1:50865] mod_wsgi (pid=6011): Exception occurred processing WSGI script '/Users/pauline/Documents/Code/platform_projects/image_download/image_download.wsgi'.
[wsgi:error] [pid 6011] [remote ::1:50865] Traceback (most recent call last):
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/anaconda3/lib/python3.6/site-packages/werkzeug/http.py", line 27, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] from urllib.request import parse_http_list as _parse_list_header
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/anaconda3/lib/python3.6/urllib/request.py", line 2585, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] from _scproxy import _get_proxy_settings, _get_proxies
[wsgi:error] [pid 6011] [remote ::1:50865] ImportError: dlopen(/Users/pauline/anaconda3/lib/python3.6/lib-dynload/_scproxy.cpython-36m-darwin.so, 2): Symbol not found: __cg_jpeg_resync_to_restart
[wsgi:error] [pid 6011] [remote ::1:50865] Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
[wsgi:error] [pid 6011] [remote ::1:50865] Expected in: /Applications/XAMPP/xamppfiles/lib/libjpeg.8.dylib
[wsgi:error] [pid 6011] [remote ::1:50865] in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
[wsgi:error] [pid 6011] [remote ::1:50865]
[wsgi:error] [pid 6011] [remote ::1:50865] During handling of the above exception, another exception occurred:
[wsgi:error] [pid 6011] [remote ::1:50865]
[wsgi:error] [pid 6011] [remote ::1:50865] Traceback (most recent call last):
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/Documents/Code/platform_projects/image_download/image_download.wsgi", line 13, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] from image_download import app as application
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/Documents/Code/platform_projects/image_download/image_download.py", line 9, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] from flask import Flask
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/anaconda3/lib/python3.6/site-packages/flask/__init__.py", line 17, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] from werkzeug.exceptions import abort
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/anaconda3/lib/python3.6/site-packages/werkzeug/__init__.py", line 151, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] __import__('werkzeug.exceptions')
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/anaconda3/lib/python3.6/site-packages/werkzeug/exceptions.py", line 71, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] from werkzeug.wrappers import Response
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/anaconda3/lib/python3.6/site-packages/werkzeug/wrappers.py", line 27, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] from werkzeug.http import HTTP_STATUS_CODES, \\
[wsgi:error] [pid 6011] [remote ::1:50865] File "/Users/pauline/anaconda3/lib/python3.6/site-packages/werkzeug/http.py", line 30, in <module>
[wsgi:error] [pid 6011] [remote ::1:50865] from urllib2 import parse_http_list as _parse_list_header, \\
[wsgi:error] [pid 6011] [remote ::1:50865] ModuleNotFoundError: No module named 'urllib2'
当我通过 Flask 运行程序时,它运行得非常好。但是,当通过 apache localhost 运行它时,它会显示服务器错误。因此,我主要怀疑问题来自于错误安装mod_wsgi.so,但是,我无法调试它,尽管安装步骤(上面提到的)似乎是正确的。
【问题讨论】:
-
您是否也将 PHP 模块加载到 Apache 中? Anaconda Python 附带了许多库的自己的版本。如果您还加载了 PHP,它可能正在导入系统版本的库,并且这些库的优先级高于 Python 发行版中的那些,因此针对 Python 发行版构建的 Python 包将失败。
-
我还建议不要对 mod_wsgi 使用 configure/make/make install 安装方法。使用
pip install方法,如pypi.org/project/mod_wsgi 中所述,安装后,使用mod_wsgi-express module-config生成您应该添加到Apache 以加载mod_wsgi 模块的配置。它应该生成一个LoadFile指令以确保正确加载 Anaconda Python 库。 -
我用
pip install方法尝试了第二种方法,得到了完全相同的错误。实际上 PHP 模块也是从 Apache 加载的,我能做些什么呢? -
其实可能不是PHP,而是XAMPP本身。
ls -las /Applications/XAMPP/xamppfiles/lib得到什么? -
不能使用
XAMPP分发吗?这是导致这里问题的原因是在使用 mod_wsgi 时无法与 Anaconda Python 甚至 System Python 一起使用。他们为所有东西运送自己的库会引起冲突。
标签: python apache flask mod-wsgi