我之前遇到的问题是我无法查明我的Django应用程序中的罪魁祸首,导致所有请求达到404. See the previous Stackoverflow question.
从那以后,我试图缩小问题的范围,因此开始了一个新的,非常基本的Django应用程序。
所有项目包括:
$ django-admin startproject tempor
我添加了测试目录并导入了测试函数
$ vi tempor/tempor/urls.py
from django.conf.urls import url
from django.contrib import admin
from tempor.views import test
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/$', test),
]
views.py和测试函数
$ vi tempor/tempor/views.py
from django.http import HttpResponse
def test(request):
return HttpResponse("OKAY")
然后我按照Django的建议迁移了项目:
$ python manage.py check
$ python manage.py migrate
现在我运行服务器:
$ python3 manage.py runserver 0.0.0.0:8282
从本地服务器访问:
$ curl localhost:8282/test/
OKAY
$ curl <server-public-IP>:8282/test/
OKAY
从外部系统访问(通过代理)
$ curl <server-public-IP>:8282/test/
<!DOCTYPE html>
<html lang="en">
[...]
<h1>Page not found <span>(404)</span></h1>
[...]
</html>
在settings.py中我有:
ALLOWED_HOSTS = ['*']
如果我不使用'*'
,则会在调试开启时相应地通知外部系统:
$ curl <server-public-IP>:8282/test/
[...]
DisallowedHost at http://<server-public-IP>:8282/test/
[...]
如果我尝试使用简单的Python HTTP服务器(Django admin.py基本上使用它),也会发生这种情况。
echo "OKAY" > /tmp/test/index.html
cd /tmp/test/
python -m http.server 8282
[...]
本地访问:
$ curl localhost:8282/index.html
OKAY
$ curl <server-public-IP>:8282/index.html
OKAY
远程访问:
$ curl <server-public-IP>:8282/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
[...]
<p>Error code explanation: HTTPStatus.NOT_FOUND - Nothing matches the given URI.</p>
[...]
</html>
http.server日志:
Serving HTTP on 0.0.0.0 port 8282 ...
<server-public-ip> - - [<timestamp>] "GET /index.html HTTP/1.1" 200 -
<proxy-ip> - - [<timestamp>] code 404, message File not found
<proxy-ip> - - [<timestamp>] "GET http://<server-public-ip>:8282/index.html HTTP/1.1" 404 -
目前,代理是一个简单的SSH端口转发 - 稍后将由NGINX替换。
编辑:如果我为Django应用运行uwsgi
,则同样适用:
$ uwsgi --http :8282 --module tempor.wsgi
本地访问工作 - 外部请求404。
为什么通过代理404向我发出请求以及如何解决此问题?
答案 0 :(得分:1)
解决了,但我不明白为什么。
问题是使用SSH端口转发直接访问Python服务器。中间Nginx解决了这个问题。
See my ServerFault question for further details.
对于服务器设置,请参阅ServerFault问题。
客户端设置归结为:
# SSH port forwarding, port 80 for Nginx access, port 8282 for direct Python webserver access
ssh -L 8181:<farawayhost-ip>:<80 or 8282> <sshuser>@<remotehost-ip>
# on a second terminal
export http_proxy=127.0.0.1:8181
curl <farawayhost-ip>