comment déployer django sous une banlieue derrière nginx
j'ai une application django en cours d'exécution sur <!-2 http://localhost:12345 . J'aimerais que l'utilisateur y accède par url http://my.server.com/myapp<!--3 J'utilise nginx pour reverse proxy comme suit:
... ...
server_name my.server.com;
location /myapp {
rewrite /myapp(.*) break;
... ... # proxy param
proxy_pass http://localhost:12345;
}
... ...
la question est, quand configuré comme ci-dessus, comment faire les urls dans mes pages de réponse pour avoir un préfixe de "/myapp" afin que le nginx puisse les diriger correctement vers myapp. Par exemple, les urls d'une page comme "/ foo / far" doivent être changées en "/myapp/foo / bar" pour autoriser le NGINX proxy à myapp. Quel est le bon NGINX configure à utiliser pour atteindre cet objectif ?
je peux utiliser les paramètres variables de django pour spécifier le préfixe d'url racine, mais il n'est pas flexible à mon esprit, puisque la variable doit être modifiée selon une configuration nginx différente(disons qu'un jour nginx peut changer la banlieue de "/myapp" en "/anotherapp").
3 réponses
quand j'ai besoin d'utiliser un préfixe D'URL, je le mets généralement moi-même dans ma racine urls.py, où je n'ai qu'une ligne, préfixée par le préfixe et incluant une autre urls.py
(r'^/myapp/', include('myapp.urls')),
mais je suppose que cela a le même goulot d'étranglement que de définir un préfixe dans settings.py, vous avez une configuration redondante dans Nginx et Django.
vous devez faire quelque chose dans le serveur qui héberge votre application Django à :12345. Vous pouvez configurer le préfixe ici, et le passer à Django en utilisant le wsgiscriptalias ou son équivalent en dehors de mod_wsgi. Je ne peux pas donner plus d'informations car je ne sais pas comment fonctionne Votre application Django. Aussi, peut-être vous devriez envisager exécuter votre application Django directement à partir de Django, en utilisant uWSGI ou gunicorn.
proxy_set_header SCRIPT_NAME /myapp;
Plus d'informations ici
vous aurez besoin de mettre à jour votre paramètre:
USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = /myapp
et mettez à jour votre MEDIA_URL
et STATIC_URL
en conséquence.
Je n'ai pas eu l'expérience de déployer sous NGINX, mais sous apache, ça marche très bien. voir: https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host
Voici une partie de ma configuration pour nginx qui, il est vrai, ne définit pas FORCE_SCRIPT_NAME, mais alors, je n'utilise pas de sous-répertoire. Peut-être sera-t-il utile pour définir les options liées à USE_X_FORWARDED_HOST dans Nginx plutôt que Django.
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/ 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;
}
}
...
}