web-dev-qa-db-fra.com

Comment utiliser NGINX comme proxy direct pour tout emplacement demandé?

J'essaie de configurer NGINX en tant que proxy direct pour remplacer Fiddler que nous utilisons comme proxy direct. La fonctionnalité de Fiddler que nous utilisons nous permet de proxy toutes les demandes entrantes vers un port 8888. Comment faire cela avec NGINX?

Dans tous les exemples de NGINX en tant que proxy inverse, je vois proxy_pass toujours défini sur un serveur amont/proxy spécifique. Comment puis-je le configurer pour qu'il passe au serveur demandé, quel que soit le serveur de la même manière que j'utilise Fiddler comme proxy direct.

Exemple:

Dans mon code:

WebProxy proxyObject = new WebProxy("http://mynginxproxyserver:8888/",true);
WebRequest req = WebRequest.Create("http://www.contoso.com");
req.Proxy = proxyObject;

Dans mynginxproxyserver/nginx.conf, je ne souhaite pas déléguer le proxy à un autre serveur (par exemple, proxy_pass défini sur http://someotherproxyserver). Au lieu de cela, je veux que ce soit juste un serveur proxy et redirige les demandes de mon client (voir ci-dessus) vers l'hôte de demande. C'est ce que Fiddler fait lorsque vous l'activez en tant que proxy: http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/UseFiddlerAsReverseProxy

9
Arman Bimatov

Votre code semble utiliser un proxy direct (souvent juste un "proxy"), pas un proxy inverse et ils fonctionnent très différemment. Le proxy inverse est destiné à l'extrémité du serveur et quelque chose que le client ne voit ou ne pense pas vraiment. Il s'agit de récupérer le contenu des serveurs principaux et de le remettre au client. Le proxy direct est quelque chose que le client configure pour se connecter au reste d'Internet. À son tour, le serveur peut potentiellement ne rien savoir de votre proxy direct.

fwd vs rev proxy

Nginx est à l'origine conçu pour être un proxy inverse et non un proxy direct. Mais il peut toujours être utilisé comme un avant. C'est pourquoi vous n'avez probablement pas trouvé beaucoup de configuration pour cela.

C'est plus une réponse théorique car je n'ai jamais fait cela moi-même, mais une configuration comme la suivante devrait fonctionner.

server {
    listen       8888;

    location / {
        resolver 8.8.8.8; # may or may not be necessary.
        proxy_pass http://$http_Host$uri$is_args$args;
    }
}

Ce ne sont que les bits importants, vous devrez configurer le reste.

L'idée est que le proxy_pass passera à un hôte variable plutôt qu'à un hôte prédéfini. Donc, si vous demandez http://example.com/foo?bar, votre en-tête http comprendra l'hôte de example.com. Cela rendra votre proxy_pass récupérer les données de http://example.com/foo?bar.

Le document que vous avez lié l'utilise comme proxy inverse. Ce serait équivalent à

        proxy_pass http://localhost:80;
25
Grumpy