【发布时间】:2016-08-15 14:05:49
【问题描述】:
我们正在寻找一种干净且独立的方式来在单个 Apache 上托管多个 Django 站点,并在 Ubuntu 14.04 上使用虚拟主机。
关注文档https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi/#using-mod-wsgi-daemon-mode 和Where should WSGIPythonPath point in my virtualenv?,我们设置了以下设置:
为 mod_wsgi 提供一个全局虚拟环境
virtualenv -p /usr/bin/python3 /home/admin/vhosts_venv
. vhosts_venv/bin/activate
pip install mod-wsgi
sudo /home/admin/vhosts_venv/bin/mod_wsgi-express install-module
sudo vi /etc/apache2/mods-available/wsgi_express.load
添加:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi-py34.cpython-34m.so
然后有一个 vhost venv 和一个基本的应用程序:
virtualenv -p /usr/bin/python3 /home/admin/vhost1_venv
. vhost1_venv/bin/activate
pip install Django
pip install PyMySQL
django-admin startproject vhost1
cd vhost1
python manage.py startapp main
设置主机分辨率:
sudo vi /etc/hosts
更新:
127.0.0.1 localhost vhost1.example.com
使用以下命令设置 Apache 虚拟主机:
<VirtualHost vhost1.example.com:80>
ServerName vhost1.example.com
ServerAlias example.com
ServerAdmin webmaster@localhost
#DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/vhost1_error.log
CustomLog ${APACHE_LOG_DIR}/vhost1_access.log combined
WSGIProcessGroup vhost1.example.com
WSGIScriptAlias / /home/admin/vhost1/vhost1/wsgi.py process-group=vhost1.example.com
WSGIDaemonProcess vhost1.example.com user=www-data group=www-data threads=25 python-path=/home/admin/vhost1:/home/admin/vhost1_venv/lib/python3.4/site-packages:/home/admin/vhosts_venv/lib/python3.4/site-packages
<Directory /home/admin/vhost1>
<Files wsgi.py>
<IfVersion < 2.3>
Order deny,allow
Allow from all
</IfVersion>
<IfVersion >= 2.3>
Require all granted
</IfVersion>
</Files>
</Directory>
</VirtualHost>
启用一切:
sudo a2enmod wsgi_express
sudo a2ensite vhost1
sudo service apache2 restart
在测试时,我们会为单个 curl 请求获得 2 个答案,分 2 次交付(有时每个之间的时间为 0.5 秒):
curl vhost1.example.com
成功了!祝贺你的第一个 Django 页面。
当然,您实际上还没有完成任何工作。接下来,开始你的 通过运行 python manage.py startapp [app_label] 第一个应用程序。
您看到此消息是因为您的 DEBUG = True Django 设置文件,您还没有配置任何 URL。开始工作吧!
后面直接跟:
内部服务器错误
服务器遇到内部错误或配置错误,并且 无法完成您的请求。
请通过 webmaster@localhost 联系服务器管理员 告知他们此错误发生的时间,以及您采取的措施 在此错误之前执行。
有关此错误的更多信息可能在服务器错误中可用 日志。 Apache/2.4.7 (Ubuntu) 服务器位于 vhost1.example.com 端口 80
在/var/log/apache2/error.log,我们得到:
[2016 年 8 月 15 日星期一 15:37:42.754139] [core:notice] [pid 18622:tid 140151787534208] AH00051:子pid 18717退出信号分割 故障 (11) ,/etc/apache2 中可能的核心转储
在/var/log/apache2/vhost1_access.log:
127.0.0.1 - - [15/Aug/2016:15:37:42 +0200] "GET / HTTP/1.1" 500 2593 "-" "curl/7.35.0"
如何正确设置?
【问题讨论】:
-
如果您使用的是 mod_wsgi 4.5.4,请将其删除并安装 4.5.3。在 4.5.4 中引入了一个影响 Python 3 的问题,如果应用程序使用
print或 Python 日志记录模块向 stdout/stderr 发送任何内容,则会导致进程崩溃。今天将发布 4.5.5 版本,在找到解决方案时回滚更改。 -
崩溃的另一个来源是在子解释器中不起作用的 C 扩展。将
application-group=%{GLOBAL}选项与WSGIScriptAlias一起使用。您也不需要WSGIProcessGroup指令,因为您正在使用process-group选项到WSGIScriptAlias。 -
跟踪Python虚拟环境
site-packages目录也有嫌疑。应该只引用一个并且最好使用python-home选项来表示虚拟环境的顶部,而不是在其中使用python-path到site-packages目录。 -
将
WSGIDaemonProcess指令移到WSGIScriptAlias指令之前。至于您的虚拟环境,您所描述的没有意义。只要每个站点的虚拟环境是在同一个 Python 安装 mod_wsgi 的基础上创建的,这就足够了。您不需要还参考构建 mod_wsgi 的 Python 安装。如果需要更多解释,建议您使用 mod_wsgi 邮件列表。 -
另请阅读blog.dscpl.com.au/2009/11/save-on-memory-with-modwsgi-30.html 并确保在始终委托守护进程模式时关闭嵌入式模式。
标签: python django apache mod-wsgi shared-hosting