Django SWIG:python模块只有在部署到Apache时才会崩溃

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

这个问题相当棘手,让我发疯。感谢您的帮助

我们有一些底层C代码,Python模块将调用这些代码(Python版本2.6,
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}
    ,它也可以工作。事实上,我也需要深入的解释。