【发布时间】:2017-04-17 04:44:57
【问题描述】:
我有一个 Apache 网络服务器和一个 PHP 应用程序。这一切都很好。此时的httpd.conf 文件如下所示:
...
LoadModule wsgi_module modules/mod_wsgi.so
...
Listen 8080
DocumentRoot "c:/Apache242/htdocs"
<Directory "c:/Apache242/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
如您所见,我已经下载了 mod_wsgi.so,当我重新启动 Apache 时一切正常。因此,当我转到 localhost:8080 时,我看到我的 PHP 应用程序正在运行。做得好。现在,我有了第二个青少年 Django 应用程序。它甚至不是一个成熟的应用程序,因为它的作用是回答来自同一个 PHP 应用程序的一个特定请求。不过,我将其称为 Django 应用程序。我是这样运行的:
C:\django\project> python manage.py runserver 127.0.0.1:8081
如您所见,我运行的是非生产服务器,但运行良好。当我转到 127.0.0.1:8081 时,我看到了从我的索引视图返回的结果:
def index(request):
return HttpResponse("Hello, world")
所以,这只是一个简单的 Hello world 页面,它可以工作。现在我想要使用 Apache 服务器,这样当我转到 localhost:8080/django 时,我会看到完全相同的 Hello world 页面。我不知道如何实现这一点。许多解决方案都基于虚拟主机,但我不想配置它们(只是因为虚拟主机在我的情况下不起作用)。因此,如果您有任何建议,欢迎您。谢谢!
编辑
我设法为我的 PHP 应用程序创建了一个虚拟主机。因此,httpd-vhosts.conf 文件如下所示:
Listen 8080
<VirtualHost *:8080>
DocumentRoot "c:/Apache242/htdocs"
<Directory c:/Apache242/htdocs>
Options Indexes FollowSymLinks
AllowOverride None
Order Deny,Allow
Allow from all
</Directory>
DirectoryIndex index.php
</VirtualHost>
现在我想知道,我应该如何配置它以将请求从 localhost:8080/django 重定向到我的 Django 应用程序。
编辑
似乎我尝试了世界上的一切。现在我刚刚尝试创建一个且只有一个虚拟主机来服务我的 Django 项目,但我失败了。以下是我具备的一些先决条件:
- Python 2.7.12,MSC 1500 32 位在 win32 上。
- Apache/2.4.23 (Win64), VC10
- mod_wsgi-py27-VC9.so 用于 Apache24-win64-VC10
这就是我的虚拟主机文件现在的样子:
Listen 8080
<VirtualHost *:8080>
DocumentRoot "C:/Apache242/htdocs/django"
ServerName localhost
WSGIScriptAlias / "C:/Apache242/htdocs/django/accent/wsgi.py"
<Directory "C:/Apache242/htdocs/django/accent">
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>
当我重新加载 Apache 时,我发现一切正常。伟大的。但是当我去 localhost:8080 时,我得到“内部服务器错误”。这是来自 Apache 错误日志的整个堆栈跟踪:
[Fri Dec 02 14:02:33.340929 2016] [mpm_winnt:notice] [pid 8212:tid 300] AH00430: Parent: Child process 9532 exited successfully.
[Fri Dec 02 14:02:34.241980 2016] [wsgi:warn] [pid 4652:tid 300] mod_wsgi: Compiled for Python/2.7.9+.
[Fri Dec 02 14:02:34.242980 2016] [wsgi:warn] [pid 4652:tid 300] mod_wsgi: Runtime using Python/2.7.6.
[Fri Dec 02 14:02:34.242980 2016] [mpm_winnt:notice] [pid 4652:tid 300] AH00455: Apache/2.4.23 (Win64) mod_wsgi/4.4.6 Python/2.7.6 configured -- resuming normal operations
[Fri Dec 02 14:02:34.242980 2016] [mpm_winnt:notice] [pid 4652:tid 300] AH00456: Apache Lounge VC10 Server built: Jul 9 2016 11:59:00
[Fri Dec 02 14:02:34.242980 2016] [core:notice] [pid 4652:tid 300] AH00094: Command line: 'C:\\Apache242\\bin\\httpd.exe -d C:/Apache242'
[Fri Dec 02 14:02:34.245981 2016] [mpm_winnt:notice] [pid 4652:tid 300] AH00418: Parent: Created child process 10960
[Fri Dec 02 14:02:34.695006 2016] [wsgi:warn] [pid 10960:tid 172] mod_wsgi: Compiled for Python/2.7.9+.
[Fri Dec 02 14:02:34.696006 2016] [wsgi:warn] [pid 10960:tid 172] mod_wsgi: Runtime using Python/2.7.6.
[Fri Dec 02 14:02:34.753010 2016] [mpm_winnt:notice] [pid 10960:tid 172] AH00354: Child: Starting 64 worker threads.
[Fri Dec 02 14:02:54.295127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] mod_wsgi (pid=10960): Target WSGI script 'C:/Apache24/htdocs/django/accent/wsgi.py' cannot be loaded as Python module.
[Fri Dec 02 14:02:54.295127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] mod_wsgi (pid=10960): Exception occurred processing WSGI script 'C:/Apache24/htdocs/django/accent/wsgi.py'.
[Fri Dec 02 14:02:54.295127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] Traceback (most recent call last):
[Fri Dec 02 14:02:54.295127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:/Apache24/htdocs/django/accent/wsgi.py", line 13, in <module>
[Fri Dec 02 14:02:54.296127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] from django.core.wsgi import get_wsgi_application
[Fri Dec 02 14:02:54.296127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\lib\\site-packages\\django-1.7.11-py2.7.egg\\django\\core\\wsgi.py", line 2, in <module>
[Fri Dec 02 14:02:54.296127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] from django.core.handlers.wsgi import WSGIHandler
[Fri Dec 02 14:02:54.296127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\lib\\site-packages\\django-1.7.11-py2.7.egg\\django\\core\\handlers\\wsgi.py", line 11, in <module>
[Fri Dec 02 14:02:54.297127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] from django import http
[Fri Dec 02 14:02:54.297127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\lib\\site-packages\\django-1.7.11-py2.7.egg\\django\\http\\__init__.py", line 1, in <module>
[Fri Dec 02 14:02:54.297127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] from django.http.cookie import SimpleCookie, parse_cookie
[Fri Dec 02 14:02:54.297127 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\lib\\site-packages\\django-1.7.11-py2.7.egg\\django\\http\\cookie.py", line 3, in <module>
[Fri Dec 02 14:02:54.298128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] from django.utils.encoding import force_str
[Fri Dec 02 14:02:54.298128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\lib\\site-packages\\django-1.7.11-py2.7.egg\\django\\utils\\encoding.py", line 10, in <module>
[Fri Dec 02 14:02:54.298128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] from django.utils.six.moves.urllib.parse import quote
[Fri Dec 02 14:02:54.298128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\lib\\site-packages\\django-1.7.11-py2.7.egg\\django\\utils\\six.py", line 90, in __get__
[Fri Dec 02 14:02:54.299128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] result = self._resolve()
[Fri Dec 02 14:02:54.299128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\lib\\site-packages\\django-1.7.11-py2.7.egg\\django\\utils\\six.py", line 158, in _resolve
[Fri Dec 02 14:02:54.299128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] module = _import_module(self.mod)
[Fri Dec 02 14:02:54.299128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\lib\\site-packages\\django-1.7.11-py2.7.egg\\django\\utils\\six.py", line 80, in _import_module
[Fri Dec 02 14:02:54.299128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] __import__(name)
[Fri Dec 02 14:02:54.299128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\Lib\\urllib.py", line 26, in <module>
[Fri Dec 02 14:02:54.301128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] import socket
[Fri Dec 02 14:02:54.301128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] File "C:\\Python27\\Lib\\socket.py", line 47, in <module>
[Fri Dec 02 14:02:54.301128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] import _socket
[Fri Dec 02 14:02:54.301128 2016] [wsgi:error] [pid 10960:tid 752] [client ::1:54990] ImportError: DLL load failed: %1 \xed\xe5 \xff\xe2\xeb\xff\xe5\xf2\xf1\xff \xef\xf0\xe8\xeb\xee\xe6\xe5\xed\xe8\xe5\xec Win32.
我不知道这有什么问题。
编辑
这就是我在 settings.py 中的内容:
DEBUG = True
TEMPLATE_DEBUG = True
ALLOWED_HOSTS = ['localhost']
USE_X_FORWARDED_HOST = True
INTERNAL_IPS = ('127.0.0.1',)
编辑
似乎我尝试了数十种虚拟主机配置,但都没有奏效。这是我尝试的最后一个配置:
Listen 8080
WSGIPythonPath C:/Apache242/htdocs/django
<VirtualHost *:8080>
DocumentRoot "C:/Apache242/htdocs/django"
ServerName localhost
WSGIScriptAlias / C:/Apache242/htdocs/django/accent/wsgi.py
<Directory C:/Apache242/htdocs/django/accent>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
LogLevel warn
</VirtualHost>
Apache 重新启动良好,但是当我转到 localhost:8080 时,我仍然看到相同的内部服务器错误。所以,我想我现在的问题应该是——有人在 Django 中使用 Apache 吗?
编辑
现在我开始相信这一切都是因为 wsgi.py 文件。就我而言,它看起来像:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "accent.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
但我不知道如何解决它。 PS。我没有 Python 的虚拟环境,我只是全局安装的。
【问题讨论】:
-
您是否尝试使用路径 /django 条件或重写规则进行重定向?
-
我不确定如何实现。
-
我建议将您的 Python 版本升级到较新的版本。使用为较新的 Python 版本编译的 mod_wsgi 模块通常不是一个好主意,即使只是补丁级别的差异,与较旧的 Python 安装。
-
2.7.6 是因为它正在为该版本找到一个 python27.dll。您可能在某一时刻为所有用户安装了 2.7.6,但在安装 2.7.12 时仅为您自己或其他人安装了它。该运行时消息是因为使用的 dll 说它是那个版本。这就是为什么我在谈论升级,不是升级到 Python 3,而是升级到最新的 2.7。建议您追踪您安装了多少 Python 版本。如果您找到适合 2.7.12 的 dll,请在
LoadModule之前添加一行Loadfile "c:/path/to/python27.dll以表示wsgi_module。这将强制首先加载它。 -
还在
LoadModule之后设置WSGIPythonHome "c:/path/to",其中路径是Python 安装的位置。sys.prefix会从口译员那里得到什么。那和LoadFile将确保使用正确的安装。
标签: php python django apache mod-wsgi