Python Apache for Django 1.10上的共享主机设置

Python Apache for Django 1.10上的共享主机设置,python,django,apache,mod-wsgi,shared-hosting,Python,Django,Apache,Mod Wsgi,Shared Hosting,我们正在寻找一种干净、独立的方式,在一个Apache上托管几个Django站点,在Ubuntu 14.04上安装vhosts 遵循文档 并且,我们设置了以下设置: 拥有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-expr

我们正在寻找一种干净、独立的方式,在一个Apache上托管几个Django站点,在Ubuntu 14.04上安装vhosts

遵循文档 并且,我们设置了以下设置:

拥有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 vhost:

<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>
在测试时,我们为一个卷曲请求得到两个答案,分两个时间提交(有时两个时间间隔为0.5秒):

成功了!祝贺您的第一个Django动力页面

当然,你实际上还没有做任何工作。下一步,开始你的工作 运行python manage.py startapp[app_label]的第一个应用程序

您之所以看到此消息,是因为您的 Django设置文件,但您尚未配置任何URL。开始工作吧

紧接着是:

内部服务器错误

服务器遇到内部错误或配置错误,无法正常运行 无法完成您的请求

请通过以下地址与服务器管理员联系:webmaster@localhost到 通知他们此错误发生的时间以及您采取的措施 在此错误之前执行

有关此错误的详细信息,请参阅服务器错误 日志vhost1.example.com端口80上的Apache/2.4.7(Ubuntu)服务器

/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被Python3破坏。4.5.5修复了它
  • 可以为虚拟主机设置Python虚拟主机(使用包
    mod_wsgi
    ),但建议使用
    Python home
    选项而不是
    Python path
    设置Python虚拟主机
  • 建议根据设置
    WSGIRestrictEmbedded On
/etc/apache2/mods available/wsgi_express.conf
如下所示:

WSGIRestrictEmbedded On
<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>
/etc/apache2/sites available/vhost1.conf
看起来像:

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

ServerName vhost1.example.com
服务器管理员webmaster@localhost
DocumentRoot/var/www/html
ErrorLog${APACHE_LOG_DIR}/vhost1_error.LOG
CustomLog${APACHE_LOG_DIR}/vhost1_access.LOG组合
WSGIDaemonProcess vhost1.example.com threads=15 python home=/home/admin/vhost1_venv python path=/home/admin/vhost1
WSGIScriptAlias//home/admin/vhost1/vhost1/wsgi.py进程组=vhost1.example.com应用程序组=%%{GLOBAL}
命令拒绝,允许
通融
= 2.3>
要求所有授权

总结格雷厄姆·邓普尔顿的答案

  • mod_wsgi 4.5.4被Python3破坏。4.5.5修复了它
  • 可以为虚拟主机设置Python虚拟主机(使用包
    mod_wsgi
    ),但建议使用
    Python home
    选项而不是
    Python path
    设置Python虚拟主机
  • 建议根据设置
    WSGIRestrictEmbedded On
/etc/apache2/mods available/wsgi_express.conf
如下所示:

WSGIRestrictEmbedded On
<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>
/etc/apache2/sites available/vhost1.conf
看起来像:

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

ServerName vhost1.example.com
服务器管理员webmaster@localhost
DocumentRoot/var/www/html
ErrorLog${APACHE_LOG_DIR}/vhost1_error.LOG
CustomLog${APACHE_LOG_DIR}/vhost1_access.LOG组合
WSGIDaemonProcess vhost1.example.com threads=15 python home=/home/admin/vhost1_venv python path=/home/admin/vhost1
WSGIScriptAlias//home/admin/vhost1/vhost1/wsgi.py进程组=vhost1.example.com应用程序组=%%{GLOBAL}
命令拒绝,允许
通融
= 2.3>
要求所有授权

如果您使用的是mod_wsgi 4.5.4,请将其卸下并安装4.5.3。在4.5.4中引入了一个影响Python 3的问题,如果应用程序使用
print
或Python日志模块向stdout/stderr发送任何内容,就会导致进程崩溃。今天将有一个4.5.5版本,在找到解决方案时回滚更改。崩溃的另一个原因是C扩展无法在子解释器中工作。将
应用程序组=%{GLOBAL}
选项与
WSGIScriptAlias
一起使用。您也不需要
WSGIProcessGroup
指令,因为您正在使用
processgroup
选项来
WSGIScriptAlias
。跟踪Python虚拟环境
站点包
目录也是可疑的。应该只引用一个,最好使用
python home
选项来表示虚拟环境的顶部,而不要使用
python path
到其中的
site packages
目录。将
WSGIDaemonProcess
指令移动到
WSGIScriptAlias
指令之前。对于您的虚拟环境,您所描述的内容毫无意义。只要每个站点的虚拟环境是根据构建mod_wsgi的相同Python安装创建的,就足够了。您不需要同时参考Python安装mod_wsgi是根据它构建的。如果需要更多说明,建议您使用mod_wsgi邮件列表。如果始终委托给守护进程进程模式,请阅读并确保您正在关闭嵌入式模式。如果您使用mod_wsgi 4.5.4,请将其删除并安装4.5.3。在4.5.4中引入了一个影响Python 3的问题,如果应用程序使用
print
或Python日志模块向stdout/stderr发送任何内容,就会导致进程崩溃。将有一个4.5.5版本的t