我想在 NGINX 后面用 uWSGI 运行 Django。
我将使用 Django 作为 API 服务,它应该存在于这个链接上:
项目.test/api
Django项目本身是空白的(1.9.6),只是创建了一个应用程序,迁移并创建了一个 super 用户。
我的项目结构如下所示:
/vagrant/api/here-lives-whole-django
/vagrant/api/uwsgi_params
/vagrant/frontend/some-frontend-work-seperated-from-django
我的 NGINX 设置如下所示:
upstream testing {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name www.testing.test;
charset utf-8;
client_max_body_size 75M;
access_log /var/log/nginx/www.testing.test.access.log;
error_log /var/log/nginx/www.testing.test.error.log;
location /api/ {
include /vagrant/api/uwsgi_params;
uwsgi_pass testing;
}
location / {
root /vagrant/frontend;
}
}
uwsgi_params 文件:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
我的 Django 网址模式:
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
自动取款机。我使用以下命令运行 Django:
uwsgi --socket :8000 --wsgi-file wsgi.py
我可以访问 Django,但是当我尝试访问时
www.testing.test/api/admin
我得到一个 404(来自 Django 的调试)。
Page not found (404)
Request Method: GET
Request URL: http://www.testing.test/api/admin
Using the URLconf defined in testing.urls, Django tried these URL patterns, in this order:
^admin/
The current URL, api/admin, didn't match any of these.
我知道对于习惯了这些东西的人来说这将是一件非常简单的事情,请原谅我,因为我是新手。
附言。我在人们一起工作的地方发现了一些类似的问题
uwsgi_param SCRIPT_NAME /api;
uwsgi_modifier1 30;
但这只是让我的 Django 告诉我一个 404
Request URL: http://www.testing.test/api/api/admin
当我要求
Request URL: http://www.testing.test/api/admin
请您参考如下方法:
我很难理解你的问题,但基本上它恢复到这个:我想要 nginx
将所有调用传递给 /api/
到 django 但 django 正在接收带有 /api/
的 URL前缀。
nginx 技巧(不适用于内部 URL)
我会使用 nginx
的重写来解决这个问题
location /api/ {
rewrite ^/api/(.*) /$1 break;
include /vagrant/api/uwsgi_params;
uwsgi_pass testing;
}
它将删除
/api/
URL 的一部分并保留在
uwsgi_pass
的 block 中进入 Django 。
django 解决方案(我认为很脏)
以上适用于进入 django 的第一个 URL。然而,django 对被删除的前缀一无所知,并且很难为自己生成 URL。这在一些简单的 API 中可能不是问题,但它往往会成为问题。
我想,唯一可行的方法是将前缀添加到基本 URLconf。
from django.conf.urls import include
mypatterns = [
url(r'^admin/', admin.site.urls),
]
urlpatterns = [
url(r'^api/', include(mypatterns)),
]
虽然,我觉得这是一个 很脏解决方案。