如何在nginx后面的郊区部署django

tjrkku2a  于 2023-03-01  发布在  Nginx
关注(0)|答案(3)|浏览(136)

我有一个运行在http://localhost:12345上的django应用程序。我想让用户通过url http://my.server.com/myapp访问它。我使用nginx反向代理到它,如下所示:

... ...
server_name my.server.com;
location /myapp {
    rewrite /myapp(.*) $1 break;        
    ... ... # proxy param 
    proxy_pass http://localhost:12345;
}
... ...

问题是,当像上面这样配置时,如何使我的响应页面中的url有一个前缀“/myapp”,以便nginx可以正确地将它们定向到myapp。例如,像“/foo/far”这样的页面中的url应该改为“/myapp/foo/bar”,以允许nginx代理myapp。正确的nginx配置是使用什么来实现这一点?
我可以使用django的设置变量来指定根url前缀,但我认为这并不灵活,因为变量必须根据不同的nginx配置进行修改(比如说有一天nginx可能会将suburl从“/myapp”改为“/anotherapp”)。

nbewdwxp

nbewdwxp1#

因为前缀是在Nginx中设置的,所以托管Django应用的Web服务器无法知道URL前缀。正如orzel所说,如果你使用apache+mod_wsgi或者nginx+gunicorn/uwsgi(需要一些额外的配置),你可以使用WSGIScriptAlias值,Django会自动读取这个值。
当我需要使用URL前缀时,我通常会自己将其放在根目录www.example.com中urls.py,其中只有一行,以前缀为前缀,并包含另一个urls.py

(r'^/myapp/', include('myapp.urls')),

但我想这与在www.example.com中设置前缀有着相同的瓶颈settings.py,在nginx和Django中有冗余配置。
你需要在Django应用所在的服务器上做一些事情:12345。你可以在那里设置前缀,然后使用WSGIScriptAlias或mod_wsgi之外的等价物将其传递给Django。我无法给予更多信息,因为我不知道你的Django应用是如何运行的。另外,也许你应该考虑直接从Django运行Django应用,使用uWSGI或gunicorn。
要将前缀从Web服务器传递给Django,可以使用以下代码:

proxy_set_header SCRIPT_NAME /myapp;

更多信息here

9ceoxa92

9ceoxa922#

您需要更新您的设置:

USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = "/myapp"

并相应地更新您的MEDIA_URLSTATIC_URL
我没有在nginx下部署的经验,但是在apache下,它工作得很好。
参见:https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host

yfjy0ee7

yfjy0ee73#

这是我的nginx配置的一部分,我承认它没有设置FORCE_SCRIPT_NAME,但是我没有使用子目录。也许它会对在nginx而不是Django中设置与USE_X_FORWARDED_HOST相关的选项有用。

upstream app_server_djangoapp {
    server localhost:8001 fail_timeout=0;
}

server  {
    listen xxx.xxx.xx.xx:80;
    server_name mydomain.com www.mydomain.com;
    if ($host = mydomain.com) {
        rewrite ^/(.*)$ http://www.mydomain.com/$1 permanent;
    }
    ...
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://app_server_djangoapp;
            break;
        }
    }
    ...
}

相关问题