2016-04-10 97 views
3

我对使用基于Django的应用程序以及尝试使用以下配置来部署django项目感到陌生,这些配置几乎与django文档中给出的默认配置类似。Django部署:配置正确的python以供apache/mod_wsgi使用

apache2.conf

# WSGI Configuration 
WSGIDaemonProcess demo python-path=/home/inian/Documents/demo 
WSGIProcessGroup demo 

WSGIScriptAlias//home/inian/Documents/demo/demo/wsgi.py process-group=demo 

<Directory /home/inian/Documents/demo/demo> 
<Files wsgi.py> 
    Require all granted 
</Files> 
</Directory> 

# Serving static files 
Alias /static/ /home/inian/Documents/demo/static/ 

<Directory /home/inian/Documents/demo/static> 
    Require all granted 
</Directory> 

当我启动Apache服务器,能正常开机,但给运行时错误加载,因为表示为波纹管Python版本不匹配,我的项目。

/var/log/apache2/error.log

[Sun Apr 10 20:38:16.165536 2016] [wsgi:warn] [pid 22959] mod_wsgi: Compiled for Python/2.7.11. 
[Sun Apr 10 20:38:16.165551 2016] [wsgi:warn] [pid 22959] mod_wsgi: Runtime using Python/2.7.10. 
[Sun Apr 10 20:38:16.166787 2016] [mpm_prefork:notice] [pid 22959] AH00163: Apache/2.4.7 (Ubuntu) OpenSSL/1.0.1f mod_wsgi/4.5.1 Python/2.7.10 configured -- resuming normal operations 

我想我的应用程序使用安装在位置/usr/local蟒是2.7.11版本,这是我用来编译和安装一个mod_wsgi,但为了安全起见,我还检查了/usr/bin/python -V,它给出的输出为Python 2.7.6。这使得使用两个问题:

  1. 我怎么可以指向apache的使用Python 2.7.11从安装位置/usr/local/bin/python(我一直在使用默认的服务器上所有的东西)。

  2. 我不记得以前安装过或者做过任何2.7.10的工作,所以我不知道如何以及从哪里加载和使用apache。如果有人能指引我,那么它也会很棒。

+0

这些仅仅是警告,并且这两个版本是如此接近,你可以简单地忽略它们。 – Zorgmorduk

+0

呃没有那些不只是警告,那些是以后运行时错误的原因。因为我不知道2.7.10版本是从哪里进来的,所以该版本没有正确编译'pyUnicodeUCS4_AsEncodedString',我在2.7.11安装时已经注意到了这一点。所以是的,我需要使用正确的python版本,我已经安装位置'/ usr/local'位置 – bawejakunal

+0

我指的是:[wsgi:warn]。所以你可以真正的接受它。当然这就是警告的原因,如果你在这两个版本中使用不同的东西,那么你可能会遇到问题。机会很低。 – Zorgmorduk

回答

1

这是在针对特定Python安装编译mod_wsgi,然后升级Python安装的情况下的警告消息。由于共享库的工作原理,通常不应该担心。这是中记录:

在你的情况,虽然问题是,你的mod_wsgi的是不反对的Python安装它在运行时发现Python的共享库的编译。这可能会导致各种问题,其中一个就是两个Python安装没有安装兼容的编译器标记集,比如那些Unicode字符宽度的安装位置。

所以基本上这个问题在我看来像你从源代码编译mod_wsgi反对在/ usr/local中的Python安装,但是因为它是如何构建的对于这种情况是不正确的,所以在运行时找到Python用于安装到/ usr的版本的共享库。

有关如何Python中应正确安装在Linux系统上的大讨论去阅读:

接下来,当你从源代码编译的mod_wsgi,确保您设置的LD_RUN_PATH环境变量以包含安装备用Python安装的Python共享库的库目录。该环境变量将允许mod_wsgi在运行时找到正确的库,而不使用/ usr/lib中的版本。

您可以验证它是通过在按照文档的说明,寻找错误/右一个:

最后,一旦你已经mod_wsgi的安装并找到正确的共享库,可能还必须在Apache配置中设置WSGIPythonHome指令,以便它为运行时文件找到正确的Python安装。这是在文档中描述在:

+0

我已经提到我使用Python 2.7.11的全部原因是我用unicode 4支持编译它,这也是我用来编译mod_wsgi的原因,因此错误日志正确显示了'mod_wsgi:Compiled for Python/2.7.1'。因此,直到编译和安装'mod_wsgi'的时候,所有的东西都是完美的,就像你所建议的那样。让我感到困惑的是'Python 2.7.10',因为'/ usr/local/bin/python'的UCS4标志是2.7.11,而UCS2的'/ usr/bin/python'是2.7.6。我已经在我的问题中提到过了。 – bawejakunal

+0

我也尝试在[你的博客](http://blog.dscpl.com.au/2014/09/using-python-virtual-environments-with.html)上使用'WGIPythonHome',但那不符合' t似乎正在使用'WSGIDaemonProcess'。我甚至试着把'python-home =/usr/local'放在'WSGIDaemonProcess'中,但是即使这样也行不通,可能是因为最新版本的mod_wsgi 4.5.1已经停止了。主要的恐惧点是python 2.7.10版本,它甚至不应该在那里,我不知道它是从哪里来的。它应该是2.7.6或2.7.11:| – bawejakunal

+0

'ldd/usr/lib/apache2/modules/mod_wsgi.so'给出'/ usr/local/lib/libpython2.7.so.1.0' – bawejakunal