在 Apache 2.4 上部署 Django

Posted

技术标签:

【中文标题】在 Apache 2.4 上部署 Django【英文标题】:Deploy Django on Apache 2.4 【发布时间】:2015-01-27 14:46:30 【问题描述】:

我一直在尝试在 ubuntu 14.04 上部署我的 Django 应用程序,其中安装了以下软件包:

django 1.4.15
apache 2.4
python 2.7
mod_wsgi 3.4 (there is one compiled as mod_wsig.so-2.7 which is the one I use)

在我的 apache 配置中,我有以下字段:

# Modules
LoadModule mpm_worker_module /usr/lib/apache2/modules/mod_mpm_worker.so
LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so
LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so-2.7
LoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so
LoadModule authn_core_module /usr/lib/apache2/modules/mod_authn_core.so
LoadModule authz_core_module /usr/lib/apache2/modules/mod_authz_core.so
...
<Directory />
    Options FollowSymLinks
    AllowOverride None
    AuthType none
    Require all granted
</Directory>
...
# And finally the app config.
WSGIPythonHome /home/web/.virtualenvs/web
WSGIPythonPath /PATH/TO/MYSITE:/home/web/.virtualenvs/web/lib/python2.7/site-packages
WSGIScriptAlias / "/PATH/TO/wsgi.py"

在我尝试在我的系统中导入一个本地模块之前,一切似乎都很好。我的意思是,wsgi.py 脚本运行没有问题,然后 django settings.py 开始运行,在设置中我有这个代码:

from MYSITE.environments.prod_settings import *

environments 是一个具有自己的 __init__.py 文件的模块。但是当它到达那条线时,它无法导入。

另一部分是当我运行./manage.py runserver 时站点运行完美,并且 sys.path 中的信息是一样的!

我只是不知道为什么 apache wsgi 不允许我导入那个 python 模块。

这是最新的日志:

[Fri Nov 28 18:07:06.222374 2014] [core:notice] [pid 3639:tid 140258688976768] AH00094: Command line: '/usr/sbin/apache2'
[Fri Nov 28 18:07:09.322057 2014] [:error] [pid 3642:tid 140258619721472] /home/web/.virtualenvs/web   <--- printed the sys.prefix
[Fri Nov 28 18:07:09.673877 2014] [:error] [pid 3642:tid 140258619721472] 2014-11-28 18:07:09,670 (3642/MainThread) newrelic ERROR - Falling back to stderr logging as unable to create log file '/var/log/newrelic/newrelic-python-agent.log'.
[Fri Nov 28 18:07:09.673930 2014] [:error] [pid 3642:tid 140258619721472] Traceback (most recent call last):
[Fri Nov 28 18:07:09.673941 2014] [:error] [pid 3642:tid 140258619721472]   File "/home/web/.virtualenvs/web/local/lib/python2.7/site-packages/newrelic-2.28.0.26/newrelic/common/log_file.py", line 79, in initialize_logging
[Fri Nov 28 18:07:09.673950 2014] [:error] [pid 3642:tid 140258619721472]     _initialize_file_logging(log_file, log_level)
[Fri Nov 28 18:07:09.673959 2014] [:error] [pid 3642:tid 140258619721472]   File "/home/web/.virtualenvs/web/local/lib/python2.7/site-packages/newrelic-2.28.0.26/newrelic/common/log_file.py", line 51, in _initialize_file_logging
[Fri Nov 28 18:07:09.673969 2014] [:error] [pid 3642:tid 140258619721472]     handler = logging.FileHandler(log_file)
[Fri Nov 28 18:07:09.673977 2014] [:error] [pid 3642:tid 140258619721472]   File "/usr/lib/python2.7/logging/__init__.py", line 903, in __init__
[Fri Nov 28 18:07:09.673985 2014] [:error] [pid 3642:tid 140258619721472]     StreamHandler.__init__(self, self._open())
[Fri Nov 28 18:07:09.673993 2014] [:error] [pid 3642:tid 140258619721472]   File "/usr/lib/python2.7/logging/__init__.py", line 928, in _open
[Fri Nov 28 18:07:09.674001 2014] [:error] [pid 3642:tid 140258619721472]     stream = open(self.baseFilename, self.mode)
[Fri Nov 28 18:07:09.674009 2014] [:error] [pid 3642:tid 140258619721472] IOError: [Errno 13] Permission denied: '/var/log/newrelic/newrelic-python-agent.log'
[Fri Nov 28 18:07:09.985905 2014] [:error] [pid 3642:tid 140258619721472] No module named wizzytest2   <---- My module name

在模块错误之后,日志错误通常是关于数据库连接的问题。发生这种情况是因为在 wizzytest2 模块中我有设置覆盖,所以这是预期的。

[Sat Nov 29 21:37:44.923879 2014] [:error] [pid 6097:tid 140297485195008] '/home/web/.virtualenvs/web'  <-- python home
[Sat Nov 29 21:37:44.924177 2014] [:error] [pid 6097:tid 140297485195008] ['/home/web/.virtualenvs/web/lib/python2.7/site-packages',
[Sat Nov 29 21:37:44.924230 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/MYSITE/mysite',
[Sat Nov 29 21:37:44.924256 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/src/python-itunes',
[Sat Nov 29 21:37:44.924287 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/lib/python2.7',
[Sat Nov 29 21:37:44.924312 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/lib/python2.7/plat-x86_64-linux-gnu',
[Sat Nov 29 21:37:44.924342 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/lib/python2.7/lib-tk',
[Sat Nov 29 21:37:44.924366 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/lib/python2.7/lib-old',
[Sat Nov 29 21:37:44.924395 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/lib/python2.7/lib-dynload',
[Sat Nov 29 21:37:44.924419 2014] [:error] [pid 6097:tid 140297485195008]  '/usr/lib/python2.7',
[Sat Nov 29 21:37:44.924449 2014] [:error] [pid 6097:tid 140297485195008]  '/usr/lib/python2.7/plat-x86_64-linux-gnu',
[Sat Nov 29 21:37:44.924483 2014] [:error] [pid 6097:tid 140297485195008]  '/usr/lib/python2.7/lib-tk',
[Sat Nov 29 21:37:44.924557 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/local/lib/python2.7/site-packages',
[Sat Nov 29 21:37:44.924583 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/local/lib/python2.7/site-packages/newrelic-2.28.0.26',
[Sat Nov 29 21:37:44.924615 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/lib/python2.7/site-packages',
[Sat Nov 29 21:37:44.924641 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/.virtualenvs/web/lib/python2.7/site-packages/newrelic-2.28.0.26',
[Sat Nov 29 21:37:44.924663 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/MYSITE',
[Sat Nov 29 21:37:44.924695 2014] [:error] [pid 6097:tid 140297485195008]  '/home/web/MYSITE/mysite']
[Sat Nov 29 21:37:45.474168 2014] [:error] [pid 6097:tid 140297485195008] No module named wizzytest2

刚刚也添加了 python 路径,这样更容易调试。我还修复了 newrelic 问题,但这对设置文件 wizzytest2 是否找到没有任何影响。

【问题讨论】:

您是否尝试在项目以外的其他目录中使用django-admin.py 启动runserver 你能给ImportError消息和apache错误日志吗? 刚刚用日志更新了答案。 wizzytest2 位于何处,是包(目录)还是模块? 是一个拥有自己的 init.py 的目录。我设法让 django 工作而没有尝试导入这个 wizzytest2,这至少是一些东西。不过,对于生产环境,我确实需要这种行为。 【参考方案1】:

现在有了你的日志,我认为问题很明显:

IOError: [Errno 13] Permission denied: '/var/log/newrelic/newrelic-python-agent.log/'

启动您的应用程序的用户无权写入'/var/log/newrelic/newrelic-python-agent.log'

也许chmod -R +w '/var/log/newrelic/' 可以帮助你。但实际上,您应该将启动您的应用程序的用户放在可以写入日志的适当组中。

注意: 您应该使用 uWSGI 或 Gunicorn 来控制您的应用程序,并且只使用 apache 作为前端。

【讨论】:

我知道newrelic问题。问题是,这不应该影响 python 读取或不影响设置文件wizzytest2 来覆盖某些字段。我的主要问题是为什么它找不到位于 python 路径上的文件?【参考方案2】:

最后这是我要导入的覆盖设置文件的权限问题,最后我只需要对文件执行chown web:webchmod

【讨论】:

以上是关于在 Apache 2.4 上部署 Django的主要内容,如果未能解决你的问题,请参考以下文章

即使在应用程序部署之后,如何永久编辑httpd.conf以便在Apache 2.4中进行更改?

即使在应用程序部署之后,如何永久编辑 httpd.conf 以使 apache 2.4 中的更改发生?

RedHat 7 安装配置Apache 2.4

RedHat 7 安装配置Apache 2.4

Apache 2.4 代理 AJP 使用 Tomcat 8 服务多个域

phpcms站点部署