在 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
。
我有一个 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
。