在 apache 上的不同 virtualenv 中运行多个 django 项目

Posted

技术标签:

【中文标题】在 apache 上的不同 virtualenv 中运行多个 django 项目【英文标题】:run multiple django project in different virtualenv on apache 【发布时间】:2015-08-15 13:29:43 【问题描述】:

我想在不同的 virtualenv 中运行两个不同的 django_projects。 这是代码:

ServerName ubuntu_server_apache

<VirtualHost *:80>

ServerName dev.hexxie.com

ErrorLog "/home/ashish/deployments/mysite_dev/conf/mysite_dev_error.log"

WSGIScriptAlias / /home/ashish/deployments/mysite_dev/mysite/mysite/wsgi.py

Alias /static /home/ashish/deployments/mysite_dev/static_root
<Directory /home/ashish/deployments/mysite_dev/static_root>
Require all granted
</Directory>

Alias /media /home/ashish/deployments/mysite_prod/data/media
<Directory /home/ashish/deployments/mysite_prod/data/media>
Require all granted
</Directory>

<Directory /home/ashish/deployments/mysite_dev/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

</VirtualHost>
WSGIPythonPath /home/ashish/deployments/mysite_dev/mysite:/home/ashish/.virtualenvs/mysite_dev/lib/python2.7/site-packages



<VirtualHost *:80>

ServerName hexxie.com
ServerAlias *.hexxie.com

ErrorLog "/home/ashish/deployments/mysite_prod/conf/mysite_error.log"

WSGIScriptAlias / /home/ashish/deployments/mysite_prod/mysite/mysite/wsgi.py

Alias /static /home/ashish/deployments/mysite_prod/static_root
<Directory /home/ashish/deployments/mysite_prod/static_root>
Require all granted
</Directory>

Alias /media /home/ashish/deployments/mysite_prod/data/media
<Directory /home/ashish/deployments/mysite_prod/data/media>
Require all granted
</Directory>

<Directory /home/ashish/deployments/mysite_prod/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

</VirtualHost>
WSGIPythonPath /home/ashish/deployments/mysite_prod/mysite:/home/ashish/.virtualenvs/mysite_prod/lib/python2.7/site-packages

但是我在使用这个 apache conf 时遇到了内部服务器错误。我觉得这是由于 WSGIPythonPath 在 conf 中使用了两次。 WSGIPythonPath 不能包含在虚拟主机中。那么如何在 apache 上的 diff virtualenv 上分别运行两个 diff django 项目呢?

【问题讨论】:

【参考方案1】:

首先,使用守护进程组,以便每个进程在单独的进程中运行,然后在各自的WSGIDaemonProcess 组指令上使用python-home 选项。见:

http://blog.dscpl.com.au/2012/10/why-are-you-using-embedded-mode-of.html http://blog.dscpl.com.au/2014/09/using-python-virtual-environments-with.html

【讨论】:

谢谢@Graham!它有帮助【参考方案2】:

这是我如何做的一个例子。当然,您必须根据您的设置更改路径/项目名称(例如端口 443 上的 SSL,但也适用于端口 80):

LoadModule wsgi_module modules/mod_wsgi.so
LoadModule ssl_module modules/mod_ssl.so

WSGISocketPrefix /var/run/wsgi

NameVirtualHost *:443
Listen 443
<VirtualHost *:443>

  ServerName your.server.com
  ErrorLog /home/user/apache_errors.log

  WSGIDaemonProcess project1-https python-home=/home/user/.virtualenvs/project1
  WSGIScriptAlias /project1 /var/www/html/project1/project1/wsgi.py process-group=project1-https application-group=project1-https
  WSGIProcessGroup project1-https
  Alias /project1/static/ /var/www/html/project1/static/

  WSGIDaemonProcess project2-https python-home=/home/user/.virtualenvs/project2
  WSGIScriptAlias /project2 /var/www/html/project2/project2/wsgi.py process-group=project2-https application-group=project2-https
  WSGIProcessGroup project2-https
  Alias /project2/static/ /var/www/html/project2/static/
</VirtualHost>

以这种方式配置时,virtualenv 负责 Python 可执行文件和路径。

【讨论】:

不需要您的 WSGIProcessGroup 指令,因为您将 process-group 选项用于 WSGIDaemonProcess。后者WSGIProcessGroup 实际上无论如何都会覆盖第一个并且不会做你所期望的。如果这只是该进程组中的应用程序,您还应该将application-group 选项设置为%GLOBAL。这避免了 Python 的一些第三方 C 扩展模块的问题。另请注意,如果您有 80/443,则不需要为 443 使用单独的进程组。可以引用早期端口 80 中的那个VirtualHost 哇,直接从马的嘴里!感谢您如此参与 SO,在 mod_wsgi 上拥有源权限确实提供了丰富的信息。非常感谢!

以上是关于在 apache 上的不同 virtualenv 中运行多个 django 项目的主要内容,如果未能解决你的问题,请参考以下文章

virtualenv和virtualenvwrapper工具

centos 6.5 上 Apache 2.2.15 上的 Django

使用pyenv和virtualenv在apache后面部署flask应用程序时找不到numpy,pandas模块

ImportError:没有名为 django.core.wsgi 的模块 Apache + VirtualEnv + AWS + WSGI

在 openSUSE 上的 Virtualenv 中安装 TensorFlow

Django Apache 和 Virtualenv ImportError:没有名为站点的模块