如何使用Django在Apache服务器上修复403禁用?

时间:2016-07-06 18:24:23

标签: python django apache ubuntu

当我尝试访问我的网站时出现以下错误:

Forbidden. You don't have permission to access / on this server.

我的虚拟主机文件如下所示:

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

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


        Alias /static ~/myproject/static

        <Directory ~/myproject/static>
                Require all granted
        </Directory>

        <Directory ~/myproject/myprojectapi>
                Order allow,deny
                Require all granted
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>
</VirtualHost>

我的apache2.conf是默认文件。我正在使用Django 1.9 with Python 2.7 on Ubuntu 14.04

我确实尝试了大多数(如果不是全部)网站上找到的解决方案,但没有一个因某些原因而起作用。我按照this教程获得了这些权限:

chmod 664 ~/myproject/db.sqlite3

sudo chown :www-data ~/myproject/db.sqlite3

sudo chown :www-data ~/myproject

我也是root用户。

如果您需要任何其他信息,请告诉我们;我将非常乐意提供它。任何帮助将不胜感激。

以下是WSGI项目:

 WSGIDaemonProcess goggest python-path=~/myproject:/usr/lib/python2.7/dist-packages
        WSGIProcessGroup goggest
        WSGIScriptAlias / ~/myproject/myprojectapi/wsgi.py

1 个答案:

答案 0 :(得分:2)

以下是我修复(有很多帮助)问题的方法。 这个答案假设您有以下项目结构:

~/myproject
    - myproject
      - ...
      - settings.py
      - wsgi.py
    - myapp
      - ...
      - static
        - myapp
          - ...

题外话

我遇到的问题是我的apahce error.log中出现错误,表示无法找到settings。此问题很可能是由python-path中的错误引起的。此部分假定您正在使用守护程序方法(由docs推荐)。

  1. 检查您的wsgi.py文件并确保myproject.settings代替settings中的os.environ.setdefault(" ... ", " ... ")
  2. 检查并仔细检查你的python-path应该是这样的 WSGIDaemonProcess [any-name] python-path=/home/[username]/myproject:/usr/lib/python2.7/site-packages
  3. 这可以解决问题(至少它对我有用)。

    修复403禁止(或至少绕过它)

    以下是为我完成工作的conf apache2.conf并且apache2.conf中没有,它仍然是默认值。以下内容属于apache2/sites-available/000-default.conf

    <VirtualHost *:80>
            ServerAdmin webmaster@localhost
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
            DocumentRoot /home/[username]/myproject # (1)
    
            Alias /static path/to/your/static_root    # (2)
    
            <Directory path/to/your/static_root>
                    Require all granted
            </Directory>
    
            <Directory /home/[username]/myproject/myproject>
                Options Indexes FollowSymLinks Includes ExecCGI
                AllowOverride All
                Order allow,deny
                Allow from all
                Require all granted
            </Directory>
    
            <Directory /home/[username]/myproject/myproject>
                    <Files wsgi.py>
                            Require all granted
                    </Files>
            </Directory>
    
            WSGIDaemonProcess [any-name] python-path=/home/[username]/myproject:/usr/lib/python2.7/site-packages
            WSGIProcessGroup [any-name]
            WSGIScriptAlias / /home/[username]/[myproject]/[myproject]/wsgi.py
    
            WSGIApplicationGroup %{GLOBAL}
    
    </VirtualHost>
    

    RE:积分(1),(2)

    (1)。将文档根目录更改为包含django项目文件的目录的头部。在这种情况下,我将其更改为/home/[username]/myproject使用~/作为参考。我试过了,它似乎没有成功。

    (2)。如果您要从同一服务器提供静态文件,请确保在STATIC_ROOT文件中设置了STATIC_URLsettings.py。就我而言,我将STATIC_URL设置为/static/,将STATIC_ROOT设置为/var/www/[any-name]/static/。当您决定部署时,您必须运行sudo python manage.py collectstatic

    另请注意,它应为Alias /static而不是Alias /static/(请注意尾部斜杠)。文档显示/static/,但这是不正确的,当您尝试提供静态文件时不起作用(apache无法完成路径)。

    就是这样。所有这些步骤都使我的服务器启动并运行。如果您有任何问题,请随时发表评论,我会尽力帮忙。祝你好运!