Apache2和虚拟主机中的上下文路径,使用Django和AngularJ

2024-09-28 23:15:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下可用的Django配置:

WSGIScriptAlias / /MyDjangoProjectFolder/MyDjangoProject/wsgi.py
WSGIPythonPath /MyDjangoProjectFolder

<Directory /MyDjangoProjectFolder/MyDjangoProject>
   <Files wsgi.py>
        Order deny,allow
       Require all granted
   </Files>
</Directory>

Alias /base_context_path/static/ /MyDjangoProjectFolder/static/

<Directory /MyDjangoProjectFolder/static>
    Require all granted
</Directory>

Django在<ip>/base_context_path/rest(用于前端调用的restapi)和<ip>/base_context_path/admin(用于管理,它使用基本的上下文路径/static)。 所以Django需要的一切都在<ip>/base_context_path/*上。在

现在我需要在这个Apache2上部署一个Angular开发的网站,所以我试图理解如何使它工作。我有这个网站的域名(我的域名.org),但不是django应用程序的专用程序。当访问我的域名时,我希望我的网站出现。在

这是我对我的网站的尝试:

^{pr2}$

它不工作(403)。在

对于我的Django应用程序,这是我创建的虚拟主机,它不能正常工作(403):

<VirtualHost *:80>
ServerName mydomainname
Alias /base_context_path/static/ /MyDjangoProjectFolder/static

WSGIScriptAlias / /MyDjangoProjectFolder/MyDjangoProject/wsgi.py

WSGIDaemonProcess MyDjangoProject python-path=/MyDjangoProjectFolder:/usr/local/lib/python2.7/site-packages
WSGIProcessGroup MyDjangoProject


<Directory /MyDjangoProjectFolder/static>
        Options -Indexes
    Require all granted
</Directory>

所以我有点卡住了。在


Tags: pathdjangopyipwsgibase网站context
2条回答

对于目录,您需要添加以下指令:

  Require all granted 

或者其他类似的方法来访问目录。Apache可能没有权限查看该目录,或者配置为无权访问该目录。您还需要确保Apache具有读、写和执行的权限。在

还要检查apache的日志,以获取有关正在发生的错误(403)的更多信息。在

我还建议像Aki003一样,使用nginx,因为它更易于配置和使用uwsgi。

为了让Django应用程序在Apache下工作,您应该安装mod_wsgi(建议使用CMMI方法,以便确保为创建虚拟环境所使用的python版本编译它)。在

如果你没有httpd.conf文件,编辑/etc/apache2/apache2.conf并写入以下行:

Include /etc/apache2/httpd.conf

然后继续创建httpd.conf,并在其中添加以下内容:

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so

WSGIPythonHome /some/path/where/is/an/empty/venv

Alias /static/ /MyDjangoProjectFolder/MyDjangoProject/static/

<Directory /MyDjangoProjectFolder/MyDjangoProject/static>
    Require all granted
</Directory>

WSGIScriptAlias / /MyDjangoProjectFolder/MyDjangoProject/wsgi.py process-group=MyDjangoProject

<Directory /MyDjangoProjectFolder/MyDjangoProject>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

(旁注):您可能还希望在此处包含安全标头:

^{pr2}$

你的虚拟主机文件应该是这样的:

<VirtualHost *>
    WSGIDaemonProcess MyDjangoProject 
    WSGIProcessGroup MyDjangoProject

    WSGIScriptAlias / /MyDjangoProjectFolder/MyDjangoProject/wsgi.py 

    <Directory /MyDjangoProjectFolder/MyDjangoProject>
        Require all granted
    </Directory>
<VirtualHost>

根据mod_wsgi文档,这是对多个应用程序使用守护程序模式的配置(您可能需要添加或测试其他应用程序,因此这是一个很好的准备)。在

/some/path/where/is/an/empty/venv是您想要在其中创建一个空虚拟环境的路径(使用virtualenv!!这样您就可以访问activate_this.py脚本!!) 确保在django项目中创建并激活另一个虚拟环境,在那里安装所有依赖项。在

您可能希望这样做,因为当您从WSGI文件中激活虚拟环境时,只使用python虚拟环境中的site packages目录。 如果您忽略了从requirements.txt安装一个包,但是这些包是在主python安装中安装的,那么它们将从那里使用,如果存在错误的版本或具有不同的依赖关系,则可能会出现一些错误。在

下一步是修改wsgi.py,方法是先添加这些行(在任何导入之前):

python_home='/path/to/the/MyDjangoProjectFolder/venv'
activate_this=python_home+'/bin/activate_this.py'
with open(activate_this) as file_:
        exec(file_.read(), dict(__file__=activate_this))

所以当mod_wsgi解析这个文件时,激活所有依赖项所在的虚拟环境,以便正常工作。在

另外,在同一个文件(wsgi.py)中,将django项目的路径添加到sys path:

import sys
sys.path.append('/path/to/the/MyDjangoProjectFolder')

另外,别忘了设定 DEBUG = False并编辑ALLOWED_HOSTS = ['.mydomainname.org']

相关问题 更多 >