2 votes

Comment rediriger les requêtes non-HTTP sur le port 80 vers un autre port?

Il y a un serveur web nginx écoutant à la fois sur les ports 80 et 443. Je voudrais traiter toutes les demandes http comme d'habitude et renvoyer toutes les demandes non-http vers un autre port (disons 1234).

Ma question est très similaire à une déjà répondue sur stackoverflow : Est-il possible de rediriger les demandes de connexion NON-http vers un autre port dans nginx?. Peut-être, je comprends mal la réponse la plus votée, mais quand j'ajoute quelque chose comme ceci à nginx.conf :

stream {
    upstream backend {
        server example.com:1234;
    }

    server {
        listen 80;
        proxy_pass backend;
    }
}

Je reçois l'erreur (attendue) bind() to 0.0.0.0:80 failed (98: Address already in use).

2 votes

Pourquoi vous attendez-vous même à ce qu'il y ait du trafic non-HTTP atteignant le port 80 sur le serveur ?

0 votes

Je voudrais simplement remplacer BOSH par le trafic d'application native. De plus, il y a une restriction à n'utiliser que le port 80.

0 votes

Je ne pense pas qu'il existe un tel logiciel qui distinguerait entre le trafic HTTP et les autres sur un seul port. Même si l'on pouvait rechercher les en-têtes / commandes HTTP dans les données reçues du client, et ainsi décider de quel type de trafic il s'agit, cela serait beaucoup trop fragile. Vous devez trouver une autre solution à votre problème.

0voto

Tero Kilkanen Points 32968

Nginx ne peut fournir qu'un seul type de service à un port à la fois.

Donc, cette configuration fonctionnera :

http {
    server {
        listen 80;

        server_name example.com;
        ...
    }
}

stream {
    server {
        listen 81;
        proxy_pass backend;
    }

    upstream backend {
        server 127.0.0.1:12345;
    }
}

Vous ne pouvez pas utiliser le même port dans les blocs stream et http, car nginx n'a aucun moyen de distinguer le type de trafic.

0 votes

Alors, il n'y a pas de solution? Je me demande alors pourquoi cette réponse est tellement plébiscitée?

0 votes

Il y a deux ports distincts dans cette question / réponse, donc c'est parfaitement valide.

0 votes

Désolé, je ne vois pas les deux ports distincts dans cette question. Les ports 80 et 443 sont censés recevoir les demandes http. Et la question était - est-il possible de rediriger les demandes non-http envoyées à ces ports vers un autre port. Donc, à mon avis, cette réponse ne résout pas le problème original. De toute façon, merci pour votre aide.

0voto

semyonfilippov Points 43

Comme @AlexeyTen l'a mentionné dans son commentaire, sslh est l'outil approprié pour cet usage. Il prend en charge nativement les protocoles HTTP, SSL, SSH, OpenVPN, tinc et XMPP, et il supporte également des tests regex personnalisés.

Par exemple, pour configurer sslh pour rediriger les requêtes http vers nginx et les autres types de requêtes vers ejabberd, il suffit de remplacer dans tous les hôtes virtuels de nginx

listen 80;

par

listen 127.0.0.1:88;

(il est également possible d'utiliser listen 127.0.0.1:80 si sslh écoute uniquement sur le port 80 sur une IP spécifique, ou d'utiliser par exemple listen 88), puis d'installer sslh et de modifier ses options par défaut :

RUN=yes
DAEMON_OPTS="--numeric --user sslh --listen 0.0.0.0:80 --http 127.0.0.1:88 --xmpp 127.0.0.1:5222 --pidfile /var/run/sslh/sslh.pid"

(/etc/default/sslh dans Debian). Enfin, (re)démarrer les services :

systemctl restart nginx
systemctl start sslh

Si l'option --transparent pour sslh est nécessaire, il y aura quelques étapes supplémentaires - elles sont bien documentées sur github.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X