【问题标题】:Redirect requests to Django application using Apache使用 Apache 将请求重定向到 Django 应用程序
【发布时间】: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


【解决方案1】:

你可以在根 php 目录中尝试一个 htaccess 文件,我不确定,但你是这样的:

Options -Indexes
Options -Multiviews
Options +FollowSymLinks

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^/django(.*)$ http://127.0.0.1:8081$1 [L,QSA]

【讨论】:

  • 对不起,如果我没有强调的话,但我不想使用 Django 默认服务器,它不用于生产。这就是我将 wsgi_module 添加到 httpd.conf 的原因。
  • ok 然后将 Listen 8080 更改为 Listen 8081 ,然后重启 apache
  • 我应该指定任何与 wsgi 相关的内容吗?我问这个,因为请求被重定向到 Django 应用程序。它不仅仅是另一个 PHP 脚本,它应该处理这个请求
  • 所以你需要为此创建一个虚拟主机,你不能为多个站点异常设置一个 conf
  • 谢谢。现在看来,就像我设法创建了一个虚拟主机一样。现在我的 PHP 应用程序在虚拟主机上运行。没关系,我会在稍后发布它的内容,你愿意分享一下,Django 应用程序的虚拟主机是什么样子的?
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 2022-01-11
  • 2018-07-26
  • 1970-01-01
相关资源
最近更新 更多