【问题标题】:Shared hosting setup for on Apache for Django 1.10在 Apache for Django 1.10 上的共享主机设置
【发布时间】: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-modeWhere 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-pathsite-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


【解决方案1】:

总结格雷厄姆邓普顿的回答

/etc/apache2/mods-available/wsgi_express.conf 看起来像:

WSGIRestrictEmbedded On

/etc/apache2/sites-available/vhost1.conf 看起来像:

<VirtualHost vhost1.example.com:80>
  ServerName vhost1.example.com
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html

  ErrorLog ${APACHE_LOG_DIR}/vhost1_error.log
  CustomLog ${APACHE_LOG_DIR}/vhost1_access.log combined

  WSGIDaemonProcess vhost1.example.com threads=15 python-home=/home/admin/vhost1_venv python-path=/home/admin/vhost1
  WSGIScriptAlias / /home/admin/vhost1/vhost1/wsgi.py process-group=vhost1.example.com application-group=%{GLOBAL}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    相关资源
    最近更新 更多