Назад | Перейти на главную страницу

Вопрос: Как использовать условный proxy_pass в nginx на основе заголовка HTTP

Как сделать условный proxy_pass на основе настраиваемого заголовка HTTP

Предположим, у меня есть 4 движка nginx, запущенных в моей частной сети, давайте назовем его: web1, web2, web3, web4.

У меня есть основной сервер nginx, я сижу между Интернетом и моей частной сетью, назовите его: Main_Web

На том же хосте, что и Main_web, у меня есть служба проверки подлинности на основе Python, работающая на порту 5000, позволяет вызывать auth_backend.py.

в качестве бэкэнда аутентификации этот auth_backend.py вернет 401, если пользователь ilegal. Но для легального пользователя он вернет перенаправление (302) во внутреннее расположение (/ afterauth) И также добавит пользовательский заголовок HTTP,

то есть:X-HTTP-BACKEND = 'http://web4/thispage?var=2'


/etc/nginx/conf.d/default

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    add_header X-Backend $http_x_backend;
    location / {
    proxy_pass http://127.0.0.1:5000 ;
    proxy_set_header Host $host;
    }

    location /afterauth/ {
    set $my_next_proxy $upstream_http_x_backend;
    proxy_pass http://$my_next_proxy ;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

бэкэнд-скрипт аутентификации

#!/usr/bin/python
from flask import Flask, request, make_response, redirect
app = Flask(__name__)

@app.route('/',methods=['GET', 'POST'])
def hello_world():
    resp = make_response('Flask make_response', 200)
    #resp = redirect('afterauth/mykey=NEXTKEY')
    resp.headers['X-Backend']='192.168.100.1:5001/?key=MYKEY01'
    return resp

if __name__ == "__main__":
    app.run(debug=True)

Последняя отладка в https://pastebin.com/DwcgVeuN

в строке 114-126 последней отладки я получил:

    2017/10/13 03:22:53 [debug] 1737#1737: *9 http proxy header: "X-Backend: 192.168.100.1:5001/?key=MYKEY01"
    2017/10/13 03:22:53 [debug] 1737#1737: *9 http proxy header: "Server: Werkzeug/0.12.2 Python/2.7.9"
    2017/10/13 03:22:53 [debug] 1737#1737: *9 http proxy header: "Date: Thu, 12 Oct 2017 20:22:53 GMT"
    2017/10/13 03:22:53 [debug] 1737#1737: *9 http proxy header done
    2017/10/13 03:22:53 [debug] 1737#1737: *9 HTTP/1.1 302 FOUND
    Server: nginx/1.13.5
    Date: Thu, 12 Oct 2017 20:22:53 GMT
    Content-Type: text/html; charset=utf-8
    Content-Length: 253
    Connection: keep-alive
    Location: http://192.168.100.48/afterauth/mykey=NEXTKEY
    X-Backend: 192.168.100.1:5001/?key=MYKEY01

Как указать 192.168.100.1:5001/?key=MYKEY01 в качестве URL-адреса proxy_pass?

Искренне

-бино-