在 CentOS 6.8 上使用 mod_wsgi 和 apache 从 Django 提供文件

Serving files from Django using mod_wsgi and apache on CentOS 6.8

我有一个 django web 应用程序,我需要从 CentOS 6.8 上的 apache 服务器提供服务。为了得到这个,我使用 mod_wsgi.

我的项目位于 /path/to/myproject。

我有以下目录和文件:

- app1/
- db.sqlite3
- myproject/
- myprojectenv/
- manage.py
- static/

我已将此指令添加到我的 setting.py 中:STATIC_ROOT = os.path.join(BASE_DIR, "static/") 并且我已尝试 运行 django 服务器,我可以正确地看到我的应用程序视图。

所以,之后我尝试配置 apache 服务器以便从我的浏览器向我的应用程序发送请愿书,但是 apache 出现 403 禁止错误。

我遵循的步骤是:

- Add to httpd.conf the following information:
    <VirtualHost *:80>
        Alias /static /path/to/myproject/static
        Alias /app1 /path/to/myproject/app1

        <Directory /path/to/myproject/static>
            Order allow,deny
            Allow from all
        </Directory>

        <Directory /path/to/myproject/app1>
            Order allow,deny
            Allow from all
        </Directory>

        <Directory /path/to/myproject/myproject>
            <Files wsgi.py>
              Order allow,deny
              Allow from all
            </Files>
        </Directory>

        WSGIDaemonProcess myproject user=myuser group=mygroup python-path=/path/to/myproject:/path/to/myproject/myprojectenv/lib/python2.7/site-packages
        WSGIProcessGroup myproject
        WSGIScriptAlias / /path/to/myproject/myproject/wsgi.py
    </VirtualHost>

然后,我给apache用户权限,让apache可以访问我的django项目:

- sudo usermod -a -G myuser apache
- chmod 710 /home/myuser
- chmod 664 ~/myproject/db.sqlite3
- sudo chown :apache ~/myproject/db.sqlite3
- sudo chown :apache ~/myproject

最后,我重新启动了 httpd 服务并尝试向我的应用程序发送请愿书,但我收到了“403 禁止错误”。

在那之后,我尝试将我的 django 项目复制到 apache 目录 /var/www/ 并这样做,我最终可以看到我的 django 文件,但就像文件一样,apache 不能 运行我的应用程序并正确显示我的视图。

我认为问题可能与 apache 用户的权限有关,但我不知道还能做什么。

我做错了什么?

Apache 错误日志中的实际错误是什么,而不是浏览器中的 403 错误?

问题很可能是由于您的主目录 710。这意味着其他用户(例如 Apache 用户)无法查看您的主目录。它需要能够作为 Apache 用户将 URL 映射到 WSGI 应用程序。

要么将整个项目移出主目录,要么在 /var/www/myproject 或类似文件下创建一个名为 myproject.wsgi 的单独 WSGI 脚本文件,其中包含:

from myproject.wsgi import application

同时更改:

    WSGIScriptAlias / /path/to/myproject/myproject/wsgi.py

    <Directory /path/to/myproject/myproject>
        <Files wsgi.py>
          Order allow,deny
          Allow from all
        </Files>
    </Directory>

至:

    WSGIScriptAlias / /var/www/myproject/myproject.wsgi

    <Directory /var/www/myproject>
        <Files myproject.wsgi>
          Order allow,deny
          Allow from all
        </Files>
    </Directory>

Apache 用户在进行 URL 映射时只需要能够看到 WSGI 脚本文件。在用户 myuser 的守护进程模式下,应用程序代码实际上 运行 可能可以从您的主目录中读取内容。

您不需要将 directory/files 的所有权更改为 Apache 用户,因为代码将 运行 作为 myuser