使用 mod_wsgi 在 Centos 6.5 上部署基于 python3.4 的 Django 项目:可行吗?

Posted

技术标签:

【中文标题】使用 mod_wsgi 在 Centos 6.5 上部署基于 python3.4 的 Django 项目:可行吗?【英文标题】:Deploy a python3.4-based Django project on Centos 6.5 with mod_wsgi: doable? 【发布时间】:2015-12-15 01:36:27 【问题描述】:

我有一个项目可以很好地使用开发网络服务器,但是我遇到了很多问题,要让它在带有系统 apache(即通过 yum 安装)的老式 centos 机器上运行良好。我卸载了基于 yum 的 wsgi(因为它确实是针对系统 python 2.x 编译的)并且我正在尝试使用通过pip install mod-wsgi 安装的那个。 (其中 pip 是 python3 pip)。

在详细介绍之前,我想问问互联网——这是否可能/可取?我应该卸载 apache 并尝试从源代码构建新版本吗?我应该使用虚拟环境吗? Pyenv 还是 Virtualenv?如果是这样,mod-wsgi应该安装在项目的venv或python3的“系统”位置(/usr/local/)。

似乎其他可怜的灵魂在黑暗中也有 cried out silently 大致相同的组合(旧的 centos 盒子,闪亮的新 python 版本。)

我已经广泛阅读了许多在线文档,例如 How to deploy with WSGI 和 Deploying Django (Django Book),但似乎没有人解决这个特殊的组合。

我希望 IT 部门能让我使用基于 Debian 的系统,似乎这样会更容易。

这是我的 apache 版本信息:

apachectl -V
Server version: Apache/2.2.15 (Unix)
Server built:   Aug 18 2015 02:00:22
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="run/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

这是我的 httpd.conf 文件的一些片段:

LoadModule wsgi_module /opt/deeplogic-django/venv/lib/python3.4/site-packages/mod_wsgi/server/mod_wsgi-py34.cpython-34m.so
# lines omitted....
WSGIScriptAlias / /opt/myproject/myapp/wsgi.py
WSGIPythonPath /opt/myproject:/opt/myproject/venv/lib/python3.4/site-packages                           
WSGIPythonHome /opt/myproject/venv/bin
<Directory /opt/myproject/myapp>
<Files wsgi.py>
       Order deny,allow
       Allow from all
</Files>
</Directory>

这是我尝试启动 apache 时遇到的最新错误:

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
[Thu Sep 17 11:51:47 2015] [notice] child pid 1393 exit signal Aborted (6)

感谢任何指点、建议和智慧。

【问题讨论】:

【参考方案1】:

我在 Centos 6.5 与 Apache 和 Python 3.x 上取得了成功(这是因为它在工作)。这是我正在使用的设置(我坚持使用 Python 3.3.x,而 Python 3.4 与 pyodbc 存在问题)。

首先,安装 EPEL...

yum -y -q install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

然后是 Apache...

yum -y -q install httpd mod_ssl httpd-devel

那么对于 Python(包括一些非常常用的 pre-reqs):

yum -y -q groupinstall development
yum -y -q install zlib2-devel openssl-devel sqlite-devel bzip2-devel python-devel openssl-devel openssl-perl libjpeg-turbo libjpeg-turbo-devel zlib-devel giflib ncurses-devel gdbm-devel xz-devel tkinter readline-devel tk tk-devel kernel-headers glibc libpng gcc-c++

安装 Python 3.3.5(您可能可以使用更新的版本):

wget 'http://www.python.org/ftp/python/3.3.5/Python-3.3.5.tgz'
tar -xzf 'Python-3.3.5.tgz'
cd ./Python-3.3.5
CXX=g++ ./configure --enable-shared --quiet
make
make altinstall
ln -s /usr/local/bin/python3.3 /usr/bin/python3.3
echo "/usr/local/lib/python3.3" > /etc/ld.so.conf.d/python33.conf
echo "/usr/local/lib" >> /etc/ld.so.conf.d/python33.conf

制作并编译 mod_wsgi(同样,您可以使用更新的版本,或者查看 MOD WSGI Express!):

wget "https://github.com/GrahamDumpleton/mod_wsgi/archive/4.2.8.tar.gz"
tar -xzf '4.2.8.tar.gz'
cd ./mod_wsgi-4.2.8
./configure --with-python=/usr/local/bin/python3.3
make
make install

与 Ubuntu 相比非常迟钝,但你有它。 YMMV,祝你好运!

【讨论】:

我接受这个答案,因为它提供了我正在寻找的高级策略(即只需从源代码编译 mod_wsgi,不要打扰同名的 python 包。)还有--with-python 选项很关键,节省了我的时间。谢谢!【参考方案2】:

我在这里找到了一个非常相似的帖子(Apache 2.2.15 on CentOS 6.5)。我没有将其标记为重复,因为我不确定问题/解决方案是否相同。

保重。

【讨论】:

【参考方案3】:

几周前我自己也尝试过,我的 vps 有 centos 6.7 和 apache 2.2,我的项目是使用 python 2.7 和 django 1.8.3 开发的 我曾经得到一个错误,它暗示我在虚拟中安装的任何 python 版本 mod_wsgi 都使用默认 python 即 python 2.6 来编译它,并且在 python docs 中明确提到对于 django 1.8 你需要 python 2.7 或以上。

所以无论你做什么都是不可取的!

【讨论】:

以上是关于使用 mod_wsgi 在 Centos 6.5 上部署基于 python3.4 的 Django 项目:可行吗?的主要内容,如果未能解决你的问题,请参考以下文章

试图让 django 应用程序在 CentOS 5 上使用 mod_wsgi

centos+apache+python34+django+mod_wsgi 开发环境搭建

使用 mod_wsgi 在 apache 上设置 Django

centos7 + Apache2.4 + python3.5 +mod_wsgi4.5.15 + Django1.10安装指导

mod_wsgi:ImportError:没有名为“编码”的模块

CentOS 6.5使用国内网易163的源