具有Django和AngularJS的虚拟主机的Apache2和上下文路径

时间:2016-07-27 15:53:17

标签: python django apache virtualhost

我有以下工作Django配置:

<ip>/base_context_path/rest

Django响应<ip>/base_context_path/admin(对于前端调用的其他API)和<ip>/base_context_path/*(对于使用base_context_path / static的管理)。 所以Django所需的一切都在<VirtualHost *:80> ServerName mydomainname.org DocumentRoot /MyWebSiteFolder DirectoryIndex index.html <Directory "/MyWebSiteFolder"> # redirect rules for managing AngularJS </Directory> </VirtualHost>

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

这是我对我网站的尝试:

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

不起作用(403)。

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

{{1}}

所以我有点卡住了。

4 个答案:

答案 0 :(得分:0)

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

  Require all granted 

或某些等效的访问目录。 Apache可能无权查看该目录或被配置为可以访问该目录。您还需要确保Apache具有读,写和执行权限。

另请查看 apache 日志,以获取有关正在发生的错误(403)的其他信息。

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

答案 1 :(得分:0)

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

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

Header set X-Frame-Options SAMEORIGIN
Header set X-XSS-Protection 1;mode=block
Header set X-Content-Type-Options nosniff
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

您的VirtualHost文件应如下所示:

<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路径:

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

此外,不要忘记设置 DEBUG = False并编辑ALLOWED_HOSTS = ['.mydomainname.org']

答案 2 :(得分:0)

这是我每次用于 Apache2 的设置模板。

    Apache2:
    sudo apt-get install apache2 libapache2-mod-wsgi-py3
    cd /etc/apache2/sites-available/

    sudo nano 000-default.conf

    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        

        ErrorLog /home/user/site/logs/error.log
        CustomLog /home/user/site/access.log combined

        ServerName website.com
            ServerAlias www.website.com

        Alias /static /home/user/django_project/static
        <Directory /home/user/django_project/static>
            require all granted
        </Directory>

        Alias /media /home/user/django_project/media
        <Directory /home/user/django_project/media>
            require all granted
        </Directory>

        Alias /images /home/user/django_project/images
        <Directory /home/user/django_project/images>
            require all granted
        </Directory>

        <Directory /home/user/django_project/folder_containing_settings>
            <files wsgi.py>
                require all granted
            </files>
        </Directory>
        
        WSGIDaemonProcess django_project python-path=/home/user/django_project python-home=/home/user/django_project/env
        WSGIProcessGroup django_project
        WSGIScriptAlias / /home/user/django_project/folder_containing_settings/wsgi.py


    </VirtualHost><span style="font-weight: 400;">


        
    sudo apachectl configtest

答案 3 :(得分:0)

您必须创建两个配置文件,一个用于 django 应用程序,另一个用于前端应用程序

首先你可以通过域和子域进行 前端example.com 后端 api.example.com

或者你改变 WSGIScriptAlias / 到 WSGIScriptAlias /base_context_path

默认为前置