【问题标题】:Django deploy to Production in Ubuntu 16.04Django 在 Ubuntu 16.04 中部署到生产环境
【发布时间】:2018-09-05 18:51:31
【问题描述】:

我对 django 很陌生,我必须在 ubuntu 16.04 中将项目部署到生产模式。我已经用 apache2 安装了 wsgi,并包含了 django 项目和 python 站点包的系统路径。

我的 sites-enabled/000-default.config 是

 <VirtualHost *:80>

        ServerAdmin webmaster@localhost
        ServerName myproject.com
        ServerAlias www.myproject.com

         Alias /static /var/www/html/TEST/myproject/static
         <Directory /var/www/html/TEST/myproject/static>
                Require all granted
         </Directory>

        <Directory /var/www/html/TEST/myproject/myproject>
                <Files wsgi.py>
                    Require all granted
                 </Files>
        </Directory>

      WSGIDaemonProcess myproject python-home=/var/www/html/TEST/newenv python-path=/var/www/html/TEST/myproject:/var/www/html/TEST/newenv/lib/python3.5/site-packages
        WSGIProcessGroup myproject
        WSGIScriptAlias / /var/www/html/TEST/myproject/myproject/wsgi.py


        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

还有我的wsgi文件

import os , sys

sys.path.append('/var/www/html/TEST/myproject/')

sys.path.append('/var/www/html/TEST/newenv/lib/python3.5/dist-packages/')

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

from django.core.wsgi import get_wsgi_application

application = get_wsgi_application()

当我运行链接时,我收到内部服务器错误(505)

我已经检查了错误日志中的错误,它显示来自

django.core.wsgi 导入 get_wsgi_application [wsgi:error] ImportError: No module named django.core.wsgi

有人可以帮我解决这个问题吗?我已经用谷歌搜索并检查了所有其他选项和解决方案。提前致谢

【问题讨论】:

  • Django 包安装在哪里?进系统Python,还是虚拟环境?如果你运行import django; print(django.__file__),你会从命令行python 得到什么? mod_wsgi 是为哪个版本的 Python 编译的? modwsgi.readthedocs.io/en/develop/user-guides/…
  • 你也不应该命名 Django 项目目录,所以它的名称中有一个点。也就是说,不要使用myproject.com。在尝试导入 Django 设置文件和项目代码时,这将导致模块导入出现问题。
  • 如果您使用真实值,这个问题就不会那么混乱了。您的wsgi 文件中的myproject.com.settings 与wsgi 文件mysite/wsgi.py 的位置不匹配。它们通常应该匹配,因为默认情况下设置和 wsgi 文件位于同一目录中。如果目录真的是mysite,那么'mysite.settings' 就可以了。如果它包含一个点(例如myproject.com),那么正如 Graham 所说,这将导致问题。
  • 你在使用 virtualenv 吗?
  • @Alasdair,这是我的网站,我使用了虚拟值而不是原始名称

标签: django apache2 virtualenv python-3.5 mod-wsgi


【解决方案1】:

代替:

    WSGIDaemonProcess myproject python-home=/var/www/html/TEST/newenv \
      python-path=/var/www/html/TEST/myproject:/var/www/html/TEST/newenv/lib/python3.5/site-packages
    WSGIProcessGroup myproject
    WSGIScriptAlias / /var/www/html/TEST/myproject/myproject/wsgi.py

您只需要:

    WSGIDaemonProcess myproject python-home=/var/www/html/TEST/newenv \
      python-path=/var/www/html/TEST/myproject
    WSGIProcessGroup myproject
    WSGIScriptAlias / /var/www/html/TEST/myproject/myproject/wsgi.py

您不需要添加site-packages 目录。

在您不需要的wsgi.py 文件中:

sys.path.append('/var/www/html/TEST/myproject/')
sys.path.append('/var/www/html/TEST/newenv/lib/python3.5/dist-packages/')

作为python-homepython-pathWSGIDaemonProcess 上的结果相同。

另一个问题是您将 Django 项目代码放在目录/var/www/html 下。你不应该把它放在那里。那是默认的DocumentRoot 目录。如果您取消注释WSGIScriptAlias,有人可以下载您的源代码。所以最好不要把你的代码放在那个目录下。

现在,就解决您的问题而言,这些事情都不应该有所作为,因为第一个只是冗余设置。第二个只是改变为更好的做法。

此时,无法找到 Django 模块的唯一原因是目录/文件的权限是否使得 Apache 运行您的代码的用户无法读取它们。所以检查/var/www/html/TEST/newenv的权限。

【讨论】:

  • 我已经检查了所有权,它已被授予完全所有权权限。我还是一样
  • 添加到您的 WSGI 脚本文件:print(os.listdir('/var/www/html/TEST/newenv/lib/python3.5/site-packages')。这是否有效并显示该目录中的内容。
  • 不,它没有。它向我显示了同样的错误。
  • 你把它放在文件的什么地方了?它需要在您导入 django 模块之前进行,并且需要查看日志文件中产生的内容。
  • from django.core.wsgi import get_wsgi_application SyntaxError: 无效语法。我在 from django.core.wsgi import get_wsgi_application 之前的 wsgi.py 中插入了该打印语句
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多