nginx django 子网址不起作用

nginx django 子网址不起作用

我正在尝试使用 nginx 和 uwsgi 在某个子 URL(比如说)下设置 django /myproject。但是,我无法让它工作。无论我尝试什么,似乎该uwsgi_modifier1 30;选项都不起作用。我总是得到双重路径,而不是localhost:8000/myproject,我得到localhost:8000/myproject/myproject

我错过了什么?以下是相关文件:

Django urls.py

from django.conf.urls import patterns, include, url
from django.http import HttpResponse

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    url(r'^$', lambda x: HttpResponse('Hello world'), name='home'),

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
)

除了添加数据库信息外,我没有更改默认 django settings.py 中的任何内容。以下是 nginx conf 文件:

upstream mydjango {
    server unix:///home/username/www/myproject/c.sock;
}

server {
    listen 8000;
    server_name localhost;

    location /myproject/ {
        uwsgi_pass mydjango;
        include /home/username/www/myproject/uwsgi_params;
        uwsgi_param SCRIPT_NAME /myproject;
        uwsgi_modifier1 30;
    }
}

我现在从命令行启动 uwsgi:

uwsgi --socket c.sock --module myproject.wsgi --chmod-socket=666

我在日志中没有发现任何错误,只有 404,因为没有端口路径的 nginx 配置/8000但也没有django匹配的 url 规则/myproject/myproject/。那么我的错误在哪里?如果这相关,我正在 debian wheezy、主线最新的 nginx、python-3.3.2 上尝试此操作

答案1

您尝试过使用rewrite而不是 吗uwsgi_modifier1

...
    location /myproject {
        rewrite /myproject(.*) $1 break;
        include /home/username/www/myproject/uwsgi_params;
        uwsgi_pass mydjango;
    }
...

答案2

我成功了!诀窍是将路径FORCE_SCRIPT_NAME也告诉 Django,并修改静态路径。对我来说,这个解决方案已经足够好了,因为子网址仅在 Django 的本地设置和 nginx.conf 中配置。

Ubuntu 14.04 + Django 1.8 + uwsgi 1.9.17.1 + nginx 1.4.6

nginx.conf:

server {
    listen 80;
    server_name 192.168.1.23 firstsite.com www.firstsite.com;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /1/static {
        root /home/ubuntu/firstsite;
    }

    location /1 {
        include         uwsgi_params;
        uwsgi_param SCRIPT_NAME /1;
        uwsgi_modifier1 30;
        uwsgi_pass      unix:/home/ubuntu/firstsite/firstsite.sock;
    }
}

在 Django firstsite/settings.py 中添加三行:

FORCE_SCRIPT_NAME = '/1'
ADMIN_MEDIA_PREFIX = '%s/static/admin/' % FORCE_SCRIPT_NAME
STATIC_URL = '%s/static/' % FORCE_SCRIPT_NAME

为了完整性,这里是我在 ~home/Env 中使用 virtualenv 的 uwsgi firstsite.ini:

[uwsgi]
project = firstsite
base = /home/ubuntu

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

master = true
processes = 5

socket = %(base)/%(project)/%(project).sock
chmod-socket = 664
vacuum = true

相关内容