Как настроить прокси-сервер nginx, используя подпапку домена с Gunicorn Django - PullRequest
0 голосов
/ 07 февраля 2019

Как я могу настроить ngnix для перенаправления прокси-сервера из домена с подпапкой в ​​/?Пример:https://example.com/yoursub/ на localhost без префикса / yoursub /На данный момент прямой доступ к серверу ip http://xxx.xxx.xxx.xx/ из интрасети работает без проблем.

мой конфигурационный файл 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;
    }
}

Если это актуально: бэкэнд представляет собой приложение django с сервером gunicorn.Должен ли я рассмотреть что-нибудь о перенаправлении с https на http?У меня нет контроля над базовым доменом.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Если я правильно понимаю, вы хотите удалить первую часть URI.Есть несколько способов сделать это, но самый простой из них, вероятно, с помощью директивы alias, которая удалит часть URI, которая соответствует текущему блоку местоположения:

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;
}

Если ваш сервер Nginx работает наfoobar.example и вы запрашиваете http://foobar.example/foo/bar, вышестоящий сервер увидит запрос на http://foobar.example/bar.

Директива псевдонима может быть немного ошибочной / неинтуитивной, поэтому лучше всего сохранять директиву location на верхнем уровне(не вложенный в другие блоки местоположения) и настолько простой, насколько это возможно.

Если вместо этого вы хотите добавить префикс к URI, вы можете сделать это в самой директиве proxy_pass:

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;
}

Если ваш сервер Nginx работает на foobar.example и вы запрашиваете http://foobar.example/bar, вышестоящий сервер увидит запрос на http://foobar.example/foo/bar

0 голосов
/ 15 февраля 2019

Я справляюсь с этим с помощью правила перезаписи:

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;
}

Перезапись преобразует ваш URL из /yoursub/path/to/view в /path/to/view для вашего сервера приложений.

0 голосов
/ 10 февраля 2019

Попробуйте:

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

Пояснение

Согласно документам nginx :

Еслидиректива proxy_pass указывается с помощью URI, затем при передаче запроса на сервер часть нормализованного URI запроса, соответствующая местоположению, заменяется на URI, указанный в директиве.

Так как / location совпадает с чем угодно, тогда все будет заменено на / (завершающий слеш в proxy_pass) до того, как оно будет проксировано к восходящему потоку.

...