1 votes

Nginx - est-il possible de servir http et tcp sur le même port ?

Je réalise que cette question a été posée il y a environ 6 ans. Lier nginx sur le même port pour tcp et http

Cependant, est-ce que quelque chose a changé, est-il possible pour moi de faire quelque chose comme :

stream {
    listen 80;
    location / {
        protocol http;
    }
    location /mysql {
        protocol tcp;
    }
}

Ou faut-il que le tcp y http les modules sont toujours séparés ?

2voto

Esa Jokinen Points 41064

Il ne s'agit pas simplement d'une fonctionnalité manquante dans Nginx qui pourrait être améliorée d'une manière ou d'une autre à l'avenir, mais d'une incompatibilité au niveau du protocole qui rend la chose totalement impossible.

Dans votre exemple, le chemin de localisation /mysql n'existe que dans le protocole HTTP. Dans le protocole HTTP, le client commence la communication par une demande :

GET /mysql HTTP/1.1
Hostname: example.com

Le site Protocole client/serveur MySQL est un protocole totalement différent qui commence même dans l'autre sens : le serveur envoyant une Paquet de poignée de main initial par exemple

36 00 00 00 0a 35 2e 35 2e 32 2d 6d 32 00 0b 00   6....5.5.2-m2... 
00 00 64 76 48 40 49 2d 43 4a 00 ff f7 08 02 00.  ..dvH@I-CJ...... 
00 00 00 00 00 00 00 00 00 00 00 00 00 2a 34 64.  .............*
4d 7c 63 5a 77 6b 34 5e 5d 3a 00                  |cZwk4^]:.

En théorie, TLS pourrait permettre de distinguer différents services sur le même port TCP en se basant sur l'identité de l'utilisateur. Indication du nom du serveur (SNI) et transmettent le trafic à différents serveurs en amont, même avec des protocoles sous-jacents différents. Cependant,

  • AFAIK, rien de tel n'a été implémenté dans Nginx.
  • L'exemple que vous avez choisi, le protocole client/serveur MySQL, ne lance pas la communication avec TLS, mais la capacité de TLS est la suivante a annoncé dans le paquet de poignée de main initiale, et la connexion est mise à niveau vers TLS, si le serveur et le client le supportent.
  • Chaque protocole standard dispose de son propre port pour TLS (ou texte brut avec STARTTLS ), et nous ne sommes pas à court de ports TCP, de toute façon. Par conséquent, il n'y a pas de forte demande pour cette fonctionnalité.

0voto

Zac67 Points 7920

Ils doivent encore être séparés. Sinon, nginx devrait être capable de proxyer les appels mysql, ce qu'il ne peut pas faire.

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