如何使用Django在nginx中设置子目录

时间:2012-11-08 05:23:45

标签: python django nginx uwsgi

环境:

  • uwsgi
  • nginx的
  • django 1.3

我正在使用带有Django和nginx的域www.example.com,我想通过 www.example.com/abc/ 访问Django,但我不知道如何设置的子目录

这是nginx conf文件:

server {
        listen 80;
        server_name www.example.com;
        error_log /var/log/nginx/xxx.error_log info;

        root /home/web/abc;  # this is the directory of the django program

        location ~* ^.+\.(jpg|jpeg|png|gif|css|js|ico){
                root /home/web/abc;
                access_log off;
                expires 1h;
        }

        location ~ /abc/ {   # I want to bind the django program to the domian's subdirectory
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:9000;
        }
}

当我打开网站www.example.com/abc/时,django urls.py不匹配,只会匹配^index$等网站。

如何修改nginx位置以将django设置为www.example.com/abc

2 个答案:

答案 0 :(得分:6)

根据uWSGI on Nginx文档,您只需将SCRIPT_NAME传递给django。

location /abc {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:9000;
    uwsgi_param SCRIPT_NAME /abc;            
}

Django仍会"看到" /abc,但它应该处理它,以便在您的网址匹配之前将其删除。您希望这种情况发生,如果django没有看到/abc,它会为您的网站生成不正确的网址,并且您的链接都不起作用。

答案 1 :(得分:0)

现在,在最新版本的Nginx和uWSGI中uwsgi_modifier1 30删除,我不得不使用更新的方法来实现它:

uWSGI config:

[uwsgi]
route-run = fixpathinfo:

Nginx配置

location /abc {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:9000;
    uwsgi_param SCRIPT_NAME /abc; # Pass the URL prefix to uWSGI so the "fixpathinfo:" route-rule can strip it out
}

如果它修复了它:尝试安装libpcre和libpcre-dev,然后用pip install -I --no-cache-dir uwsgi重新安装uwsgi。 uWSGI的内部路由子系统要求在编译/安装uWSGI之前安装 PCRE库。 More information on uWSGI and PCRE.