6
votes

Comment configurer le passage du proxy Nginx en utilisant le domaine du sous-dossier avec Gunicorn Django

Comment puis-je configurer ngnix pour rediriger un proxypass d'un domaine avec un sous-dossier vers /?
Exemple:
https://example.com/yoursub/ à localhost sans / yoursub / prefix
Pour le moment, l'accès direct à l'ip du serveur http: //xxx.xxx.xxx.xx/ depuis l'intranet fonctionne sans problème.

mon fichier de configuration nginx:

upstream app_server {
    server unix:/home/myname/APP-Server/gunicorn/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;

    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name 123.456.789.1;

    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /home/myname/APP-Server/logs/nginx-access.log;
    error_log /home/myname/APP-Server/logs/nginx-error.log;

    location /static/ {
        alias /home/myname/APP-Server/static-root/;
    }

    # checks for static file, if not found proxy to app
    location / {
try_files $uri @proxy_to_app; 
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
}

Si c'est pertinent: Le backend est une application django avec un serveur gunicorn.
Dois-je tenir compte de quoi que ce soit concernant la redirection de https vers http?
Je n'ai aucun contrôle sur le domaine de base.


0 commentaires

3 Réponses :


2
votes

Essayez ceci:

server {
    ...
    location @proxy_to_app {
        ...
        proxy_pass http://app_server/;  # note the trailing slash
    }
}

Explication

Selon le docs nginx :

Si la directive proxy_pass est spécifiée avec un URI, alors lorsqu'une demande est transmise au serveur, la partie d'un URI de demande normalisé correspondant à l'emplacement est remplacée par un URI spécifié dans la directive.

Puisque / l'emplacement correspond à tout, alors tout sera remplacé par / (la barre oblique de fin dans proxy_pass ) avant d'être mandaté vers l'amont.


2 commentaires

Avec la barre oblique, j'obtiens "502 Bad Gateway"


Pouvez-vous accéder à l'application en amont sans utiliser nginx? L'erreur 502 indique que nginx ne peut pas obtenir une réponse valide du serveur (il ne peut pas l'atteindre), généralement parce qu'il est en panne ou mal configuré. Vérifiez votre configuration gunicorn.



3
votes

Si je comprends bien, vous souhaitez supprimer la première partie de l'URI. Il y a plusieurs façons de le faire, mais la plus simple est probablement avec la directive alias, qui supprimera la partie de l'URI qui correspond au bloc d'emplacement actuel:

location @proxy_to_app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server/foo$uri$is_args$args;
}

Si votre serveur Nginx est s'exécutant sur foobar.example et que vous demandez http: //foobar.example/foo/bar , le serveur en amont verra une requête pour http: //foobar.example/bar code >.

La directive alias peut être un peu boguée / peu intuitive, il est donc préférable de garder votre directive de localisation au plus haut niveau (non imbriquée dans d'autres blocs de localisation) et aussi simple que possible.

Si à la place vous souhaitez ajouter un préfixe à l'URI, vous pouvez le faire dans la directive proxy_pass elle-même:

location /foo/ {
    alias /home/myname/APP-Server/static-root/;  # It doesn't really matter what you put here, since you're proxying everything.

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
}

Si votre serveur Nginx s'exécute sur foobar.example et que vous demandez http: //foobar.example/bar , le serveur en amont verra une requête pour http: //foobar.example/foo/bar code>


0 commentaires

0
votes

La façon dont je gère cela est avec une règle de réécriture:

location /yoursub {
    rewrite /yoursub(.*) $1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;      
    proxy_redirect off;
    proxy_pass http://app_server;
}

La réécriture convertira votre URL de / yoursub / path / vers / view en / path / to / view pour votre serveur d'applications.


0 commentaires