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

Deploy a python3.4-based Django project on Centos 6.5 with mod_wsgi: doable?

我有一个使用开发网络服务器工作得很好的项目,但我 运行 遇到了很多问题,让它在装有系统 apache(即已安装通过 yum。)我卸载了基于 yum 的 wsgi(因为它肯定是针对系统 python 2.x 编译的)并且正在尝试使用通过 pip install mod-wsgi 安装的那个。 (其中 pip 是 python3 pip)。

在进入细节之前,我只想问问互联网——这是否可能/可取?我应该卸载 apache 并尝试从源代码构建一个新版本吗?我应该使用虚拟环境吗? Pyenv 还是 Virtualenv?如果是这样,应该将 mod-wsgi 安装在项目的 venv 中还是 python3 (/usr/local/).

的 "system" 位置

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

我已经广泛阅读了许多在线文档,例如 How to deploy with WSGI and 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)

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

我在这里 (Apache 2.2.15 on CentOS 6.5) 找到了一个非常相似的 post。我没有将其标记为重复,因为我不确定 problem/solution 是否相同。

保重。

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

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

我在 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

然后是阿帕奇...

yum -y -q install httpd mod_ssl httpd-devel

然后Python(包括一些非常常用的先决条件):

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,祝你好运!