使用Apache和mod-wsgi部署Django

1 投票
3 回答
3825 浏览
提问于 2025-04-17 07:31

我正在尝试使用 wsgi 来部署 django,但是没有成功。你能帮我吗?谢谢!

django.wsgi.py

#!/usr/bin/python
import os, sys
sys.path.append('/home/me/project')
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

/etc/apache2/sites-available/default

    <VirtualHost *:80>

  ServerName www.me.org
  ServerAlias *me.org

  Alias /admin_media /usr/lib/python2.4/site-packages/django/contrib/admin/media

  <Location /admin_media>
    Order allow,deny
    Allow from all
  </Location>

  Alias /media /var/www/media/

  <Location /media>
    Order allow,deny
    Allow from all
  </Location>

  WSGIScriptAlias / /home/me/project/apache/django.wsgi

  WSGIDaemonProcess me processes=2 maximum-requests=500 threads=1
  WSGIProcessGroup me

</VirtualHost>

错误信息

   /etc/init.d/apache2 restart
Syntax error on line 3 of /etc/apache2/sites-enabled/me:
Invalid command 'PythonHandler', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
The Apache error log may have more information.
   ...fail!

更新:奇怪的 /etc/apache2/sites-enable/me

<Location "/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonDebug On
PythonPath "['/home/me2'] + sys.path"
SetEnv DJANGO_SETTINGS_MODULE me.settings

我可以禁用 mod-python 吗?

3 个回答

1

我不是这方面的专家,但我可以分享一下我目前的做法。我使用的是mod_wsgi,而不是mod_python。你在“/etc/apache2/sites-enabled/me”里的设置,我在我的“django.wsgi.py”文件里也有类似的配置,而且我在sites-enabled目录下没有这样的文件。

在你的django.wsgi.py文件中,你可能需要添加外部库的路径。当我设置我项目的路径时,我的设置文件是/var/myproject/src/myapp/settings.py,所以我把路径设置为'/var/myproject/src',并把django_settings_module设置为myapp.settings。以下是我的myproject.wsgi文件的内容:

#!/usr/bin/python
import os
import sys
sys.path.append('')
sys.path.append('/usr/local/lib/python2.7/site-packages')
sys.path.append('/usr/local/lib/python2.7/site-packages/Django-1.3-py2.7.egg')
... other external libs ..
sys.path.append('/var/myproject/myapp/src')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
os.environ['PYTHON_EGG_CACHE'] = '/tmp'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

这是我为wsgi.conf文件设置的内容:

<VirtualHost *:80>
    ServerAdmin me@me.com
    DocumentRoot "/var/myproject/"
    ServerName localhost
    ErrorLog "/var/myproject/logs/apache-error.log"
    CustomLog "/var/myproject/logs/apache-access.log" common

    Options ExecCGI FollowSymLinks MultiViews

    AddHandler wsgi-script .wsgi
    WSGIDaemonProcess asgportal
    WSGIProcessGroup asgportal

    Alias /static /var/myproject/media/static
    WSGIScriptAlias / /var/myproject/myproject.wsgi  # my django.wsgi.py file

    DirectoryIndex index.html index.cgi

    AddHandler cgi-script .cgi .pl
</VirtualHost>
3

很明显,你的错误信息来自于一个和你这里展示的文件不同的地方——是me文件,而不是default。那个文件里似乎提到了PythonHandler,这是一个属于mod_python的指令,而你似乎没有安装这个东西(而且也不应该安装,因为它已经过时了)。

当你解决了这个错误——很可能是通过完全删除那个文件——你还会在你的wsgi文件里遇到另一个错误。你已经把project路径加到了pythonpath里,但你却把设置引用成project.settings,这样是找不到的。你可以改成加上父路径,或者直接把设置引用为settings

1

这个 /etc/apache2/sites-enable/me 文件是用来配置 modpython 的。

但是你现在使用的是 mod_wsgi。

所以,你需要删除这个 /etc/apache2/sites-enable/me 文件,并按照这里的说明进行操作。

https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/

撰写回答