Nginx

nginx django suburl 不起作用

  • June 27, 2020

/myproject我正在嘗試使用 nginx 和uwsgi 在某個 suburl 下設置 django 。但是,我無法讓它工作。無論我嘗試什麼,似乎該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 配置文件:

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 conf 8000,但也沒有django匹配的 url 規則/myproject/myproject/。那麼我的錯誤在哪裡?如果這是相關的,我正在 debian wheezy 上嘗試這個,nginx 來自主線的最新版本,python-3.3.2

您是否嘗試過使用rewrite而不是uwsgi_modifier1

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

我讓它工作了!訣竅是告訴 Django 路徑FORCE_SCRIPT_NAME以及修改靜態路徑。對我來說,這個解決方案已經足夠好了,因為 suburl 只在 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

引用自:https://serverfault.com/questions/534248