Django SWIG:python模块只有在部署到Apache时才会崩溃
这个问题相当棘手,让我发疯。感谢您的帮助 我们有一些底层C代码,Python模块将调用这些代码(Python版本2.6,Django SWIG:python模块只有在部署到Apache时才会崩溃,django,apache,mod-wsgi,swig,Django,Apache,Mod Wsgi,Swig,这个问题相当棘手,让我发疯。感谢您的帮助 我们有一些底层C代码,Python模块将调用这些代码(Python版本2.6,Djangoframework,版本1.4)。我们通过SWIG2.0.9构建了Python绑定。我们在python manage.py shell提示符中使用了它们。他们工作得很好 如果我们运行python manage.py runserver 0.0.0.0:8001,一切仍然正常。但是,当我们将应用程序部署为Apache虚拟主机时,Python绑定会突然失败(其他不使用C
Django
framework,版本1.4)。我们通过SWIG
2.0.9构建了Python绑定。我们在python manage.py shell
提示符中使用了它们。他们工作得很好
如果我们运行python manage.py runserver 0.0.0.0:8001
,一切仍然正常。但是,当我们将应用程序部署为Apache虚拟主机时,Python绑定会突然失败(其他不使用C代码的网页也可以)。它的url类似于。这是我们的conf
文件:
#Listen 80
<VirtualHost *:80>
ServerName hostname.com/basic
ServerAdmin caisj@example.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
DocumentRoot /home/browser/BASIC/basic
Alias /static/admin /home/browser/BASIC/_py/lib/python2.6/site-packages/Django-1.4-py2.6.egg/django/contrib/admin/static/admin
Alias /static /home/browser/BASIC/basic/static
WSGIScriptAlias /basic /home/browser/BASIC/basic/basic.wsgi
ErrorLog /home/browser/BASIC/basic/log/basic.error.log
<Directory /home/browser/BASIC/basic>
<Files basic.wsgi>
Order deny,allow
Allow from all
</Files>
</Directory>
LogLevel info
CustomLog /home/browser/BASIC/basic/log/basic.access.log combined
WSGISocketPrefix /var/run/wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIPythonHome /home/browser/BASIC/_py
<VirtualHost *:80>
......
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess hostname.com/basic processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup hostname.com/basic
......
</VirtualHost>
# Important! My http.conf does not contain this line. So Apache seems to
# load the mod_wsgi.so from somewhere else, which is unluckily not compatible
# with my C codes.
LoadModule wsgi_module modules/mod_wsgi.so
# Place to store file for socket communications. I created the folder manually.
WSGISocketPrefix /var/run/wsgi
<VirtualHost *:80>
......
# My wsgi configuration file
WSGIScriptAlias /basic /home/browser/BASIC/basic/basic.wsgi
# Make the virtual host using only one Python sub interpreter.
WSGIApplicationGroup %{GLOBAL}
# Make it run under the daemon mode
WSGIDaemonProcess hostname.com/basic processes=1 threads=15 display-name=%{GROUP} \
python-path=/home/browser/BASIC/_py/lib/python2.6/site-packages
WSGIProcessGroup hostname.com/basic
......
</VirtualHost>
我猜这是由文件权限问题引起的。但是,即使我将所有Python绑定文件都设置为777,在作为Apache虚拟主机工作时仍然会失败
我确实尝试删除dirver.close()
语句,但仍然失败。在代码跟踪之后,永远不会调用close()
方法
可能有一些配置导致python绑定的生命周期没有得到正确管理。不过,我不能指出原因
请帮忙。非常感谢
==================
更新:
阅读后,我将以下内容添加到我的conf
文件中:
#Listen 80
<VirtualHost *:80>
ServerName hostname.com/basic
ServerAdmin caisj@example.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
DocumentRoot /home/browser/BASIC/basic
Alias /static/admin /home/browser/BASIC/_py/lib/python2.6/site-packages/Django-1.4-py2.6.egg/django/contrib/admin/static/admin
Alias /static /home/browser/BASIC/basic/static
WSGIScriptAlias /basic /home/browser/BASIC/basic/basic.wsgi
ErrorLog /home/browser/BASIC/basic/log/basic.error.log
<Directory /home/browser/BASIC/basic>
<Files basic.wsgi>
Order deny,allow
Allow from all
</Files>
</Directory>
LogLevel info
CustomLog /home/browser/BASIC/basic/log/basic.access.log combined
WSGISocketPrefix /var/run/wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIPythonHome /home/browser/BASIC/_py
<VirtualHost *:80>
......
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess hostname.com/basic processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup hostname.com/basic
......
</VirtualHost>
# Important! My http.conf does not contain this line. So Apache seems to
# load the mod_wsgi.so from somewhere else, which is unluckily not compatible
# with my C codes.
LoadModule wsgi_module modules/mod_wsgi.so
# Place to store file for socket communications. I created the folder manually.
WSGISocketPrefix /var/run/wsgi
<VirtualHost *:80>
......
# My wsgi configuration file
WSGIScriptAlias /basic /home/browser/BASIC/basic/basic.wsgi
# Make the virtual host using only one Python sub interpreter.
WSGIApplicationGroup %{GLOBAL}
# Make it run under the daemon mode
WSGIDaemonProcess hostname.com/basic processes=1 threads=15 display-name=%{GROUP} \
python-path=/home/browser/BASIC/_py/lib/python2.6/site-packages
WSGIProcessGroup hostname.com/basic
......
</VirtualHost>
此处记录了SWIG问题的解决方案:
终于!经过大量的搜索和尝试,我解决了这个问题。这是我的
conf
文件:
#Listen 80
<VirtualHost *:80>
ServerName hostname.com/basic
ServerAdmin caisj@example.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
DocumentRoot /home/browser/BASIC/basic
Alias /static/admin /home/browser/BASIC/_py/lib/python2.6/site-packages/Django-1.4-py2.6.egg/django/contrib/admin/static/admin
Alias /static /home/browser/BASIC/basic/static
WSGIScriptAlias /basic /home/browser/BASIC/basic/basic.wsgi
ErrorLog /home/browser/BASIC/basic/log/basic.error.log
<Directory /home/browser/BASIC/basic>
<Files basic.wsgi>
Order deny,allow
Allow from all
</Files>
</Directory>
LogLevel info
CustomLog /home/browser/BASIC/basic/log/basic.access.log combined
WSGISocketPrefix /var/run/wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIPythonHome /home/browser/BASIC/_py
<VirtualHost *:80>
......
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess hostname.com/basic processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup hostname.com/basic
......
</VirtualHost>
# Important! My http.conf does not contain this line. So Apache seems to
# load the mod_wsgi.so from somewhere else, which is unluckily not compatible
# with my C codes.
LoadModule wsgi_module modules/mod_wsgi.so
# Place to store file for socket communications. I created the folder manually.
WSGISocketPrefix /var/run/wsgi
<VirtualHost *:80>
......
# My wsgi configuration file
WSGIScriptAlias /basic /home/browser/BASIC/basic/basic.wsgi
# Make the virtual host using only one Python sub interpreter.
WSGIApplicationGroup %{GLOBAL}
# Make it run under the daemon mode
WSGIDaemonProcess hostname.com/basic processes=1 threads=15 display-name=%{GROUP} \
python-path=/home/browser/BASIC/_py/lib/python2.6/site-packages
WSGIProcessGroup hostname.com/basic
......
</VirtualHost>
#重要!我的http.conf不包含此行。所以阿帕奇似乎
#从其他地方加载mod_wsgi.so,不幸的是它不兼容
#用我的C代码。
LoadModule wsgi_modules/mod_wsgi.so
#用于存储套接字通信的文件的位置。我手动创建了这个文件夹。
WSGISocketPrefix/var/run/wsgi
......
#我的wsgi配置文件
WSGIScriptAlias/basic/home/browser/basic/basic/basic.wsgi
#仅使用一个Python子解释器创建虚拟主机。
WSGIApplicationGroup%{GLOBAL}
#使其在守护程序模式下运行
WSGIDaemonProcess hostname.com/basic processs=1 threads=15 display name=%{GROUP}\
python路径=/home/browser/BASIC/_py/lib/python2.6/site-packages
WSGIProcessGroup hostname.com/basic
......
这通常表示它仍在崩溃。试着使用gdb找出它崩溃的地方。看到了吗,但哪一个是有帮助的具体更改?@graham dumpleton在测试中,如果我删除LoadModule
,将报告脚本头过早结束。如果我删除WSGISocketPrefix
,它会报告权限被拒绝:无法连接到WSGI守护进程
。如果我不使用守护程序模式
,则错误保持不变。如果我删除了WSGIApplicationGroup%{GLOBAL}
,它也可以工作。事实上,我也需要深入的解释。