重新启动 Apache 服务器

重新启动 Apache 服务器

我正在运行 Ubuntu 10.04.1 LTS,它预装了 python2.6,但我需要用 python2.7.2 替换它。

(原因很简单,2.7 有很多功能从 3 移植过来)

我已经使用安装了python2.7.2

./configure
make
make altinstall

altinstall 选项将其安装到 /usr/local/lib/python2.7(不触及系统默认版本),并将解释器放在 /usr/local/bin/python2.7 中,而不会触及系统默认版本

然后为了帮助 mod_wsgi 找到 python2.7,我将以下内容添加到 /etc/apache2/sites-available/wsgisite

WSGIPythonHome /usr/local

我启动了 apache 并运行了一个测试 wsgi 应用程序,但我看到了蟒蛇2.6.5 而不是 Python2.7

后来我替换了默认的 python simlink 以指向 python 2.7

ln -f /usr/local/bin/python2.7 /usr/bin/python

现在在控制台上输入“python”会打开python2.7,但不知何故mod_wsgi仍然选择python2.6

接下来我尝试

PATH=/usr/local/bin:$PATH
export PATH

然后快速重启 apache,但是又是python2.6!!


这是我的 $PATH

/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

/etc/apache2/sites-available/wsgisite 的内容

WSGIPythonHome /usr/local


<VirtualHost *:80>

    ServerName wsgitest.local
    DocumentRoot /home/wwwhost/pydocs/wsgi
    <Directory /home/wwwhost/pydocs/wsgi>
        Order allow,deny
        Allow from all
    </Directory>

    WSGIScriptAlias / /home/wwwhost/pydocs/wsgi/app.wsgi

</VirtualHost>

应用程序.wsgi

import sys

def application(environ, start_response):
    status = '200 OK'
    output = sys.version

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

Apache 错误日志

'import site' failed; use -v for traceback
[Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23235): Initializing Python.
[Sun Jun 19 00:27:21 2011] [notice] Apache/2.2.14 (Ubuntu) mod_wsgi/2.8 Python/2.6.5 configured -- resuming normal operations
[Sun Jun 19 00:27:21 2011] [info] Server built: Nov 18 2010 21:20:56
[Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23238): Attach interpreter ''.
[Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23239): Attach interpreter ''.
[Sun Jun 19 00:27:31 2011] [info] mod_wsgi (pid=23238): Create interpreter 'wsgitest.local|'.
[Sun Jun 19 00:27:31 2011] [info] [client 192.168.1.205] mod_wsgi (pid=23238, process='', application='wsgitest.local|'): Loading WSGI script '/home/wwwhost/pydocs/$
[Sun Jun 19 00:27:50 2011] [info] mod_wsgi (pid=23239): Create interpreter 'wsgitest.local|'.

有没有人设法让 mod_wsgi 在非系统默认版本的 python 上运行?

答案1

编译 python 2.7

./configure \
   --prefix=/usr/local \
   --enable-unicode=ucs4 \
   --enable-shared \
   LDFLAGS="-Wl,-rpath /usr/local/lib"

make && make altinstall

不要忘记--enable-shared,否则您以后可能会遇到问题。

为 Python 2.7 编译 mod_wsgi

https://code.google.com/p/modwsgi/wiki/InstallationIssues

由于您执行了make altinstall安装,因此python2.7您将没有要python-devel安装的包;因此您需要mod_wsgi引用正确的 python。

./configure --with-python=/usr/local/bin/python2.7 
# then edit Makefile if you want to change DESTDIR
make && make install

...尝试启动httpd...

启动 httpd:httpd:/etc/httpd/conf/httpd.conf 第 221 行语法错误:/etc/httpd/conf.d/wsgi.conf 第 2 行语法错误:无法将 /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so 加载到服务器:libpython2.7.so.1.0:无法打开共享对象文件:没有此文件或目录

因为我们使用的不是相同的 Python,而且我们没有使用任何特定选项链接模块以使其在正确的位置查找,所以它找不到libpython2.7.so.1.0,我们可以通过以下方式更改它:libtool检查正确的地方

# use LDFLAGS to tell libtool resulting lib needs to
# look for shared libs in /usr/local/lib too.
./configure \
   --with-python=/usr/local/bin/python2.7 \
   LDFLAGS="-R/usr/local/lib"
# then edit Makefile if you want to change DESTDIR
# e.g. DESTDIR = /opt/mod_wsgi2.7
make && make install

...尝试再次启动 http...

启动 httpd:httpd:/etc/httpd/conf/httpd.conf 第 221 行语法错误:/etc/httpd/conf.d/wsgi.conf 第 2 行语法错误:无法将 /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so 加载到服务器:/opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so:无法打开共享对象文件:权限被拒绝

最后一个错误是因为我的系统正在运行 selinux 并且该文件具有默认上下文。 快速浏览 stackoverflow告诉我这是一个 selinux 问题。

修复 selinux 上下文

# ls -Z /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so 
-rwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so

修复方法是使用正确的上下文,可以在原始 mod_wsgi 模块中找到。

chcon --reference /etc/httpd/modules/mod_wsgi.so /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so 

答案2

您需要重新编译mod_wsgi too。仅重新编译 python 是不够的(不要忘记加载正确版本的mod_wsgi

编辑:点击这里安装说明

答案3

这是配置 mod_wsgi 使用 Python2.7 的方法

我碰巧遇到了同样的问题。我正在查看卸载 mod_wsgi 并使用适当的配置重新安装它的选项。

阅读其中一篇文章后,我意识到没有必要卸载我当前的 mod_wsgi,我可以继续重新安装 mod_wsgi3.4(之前我有 v3.2),并使用 Python2.7 进行设置(似乎安装过程重写了所有内容,没有任何错误/冲突)。

因为我已经安装了 Python2.7。

我重新安装了 mod_wsgi-3.4(没有执行任何卸载)

[root@server ~]# cd ~

[root@server ~]# wgethttp://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz

[root@server ~]# tar xvf mod_wsgi-3.4.tar.gz

[root@server ~]# cd mod_wsgi-3.4

使用已安装的 python2.7 配置 mod_wsgi

[root@server ~]#./configure --with-python=/usr/local/bin/python2.7

[root@server ~]# 制作

[root@server ~]# 进行安装

下面两个命令非常重要。如果 libpython2.7.so.1.0 不在 /usr/local/lib 中,请将 /usr/local/lib 替换为您安装 libpython2.7.so.1.0 的文件夹。

[root@server ~]# LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python

[root@server ~]# ldconfig

重新启动 Apache 服务器

[root@server ~]# 重启服务 httpd

[root@server ~]# ldd /etc/httpd/modules/mod_wsgi.so

上述命令的输出:第 2 行表示您的 mod_wsgi 现在正在使用 Python2.7 库。好极了!

    linux-vdso.so.1 =>  (0x00007fffc0aa9000)
    libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0 (0x00007f03a5b20000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f03a5903000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f03a56fe000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007f03a54fb000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f03a5277000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f03a4ee2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f03a6133000)

答案4

4.9.38-16.35.amzn1.x86_64我在 Amazon Linux 上安装 ReviewBoard 工具时遇到了同样的问题http://backup.noiseandheat.com/blog/2011/11/installing-reviewboard-on-amazon-ec2/

通过运行yum install mod_wsgi,我得到了mod_wsgi-python26.x86_64。后来我学会了用 yum 搜索yum search mod_wsgi,发现 python27 安装也可用。所以运行sudo yum install mod_wsgi-python27.x86_64解决了问题。

相关内容