Bonjour,
Je loue un serveur web sur lequel tourne déjà Apache et Tomcat (derrière Apache pour un domaine en particulier grâce à mod-jk).
Cependant je voudrais y ajouter un site en Node.js également sur le port 80. Je pourrais le placer derrière Apache comme je le fais pour Tomcat, mais je perdrai tout l'avantage d'une appli Node.js en augmentant énormément la latence.
J'ai déjà écrit une règle qui selon moi devrait fonctionner (j'ai mis le port 10000 pour envoyer vers webmin dans mes tests) :
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -m string --to 70 --algo bm --string 'mondomaine.fr' -j REDIRECT --to-port 10000
Cependant ce n'est pas le cas. Pourtant les deux règles suivantes fonctionnent correctement :
iptables -A INPUT -p tcp -m tcp -i eth0 --dport 80 -m string --to 70 --algo bm --string 'mondomaine.fr' -j DROP
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -j REDIRECT --to-port 10000
Donc le match sur le domaine fonctionne avec filter/INPUT, mais pas avec nat/PREROUTING. Là je ne comprends pas tout.
# Haproxy
Posté par espitall . Évalué à 3.
J'ai eu il y a peu de temps la même problématique. La solution qui m'a semblé la plus facile/rapide a mettre en place a été d'utiliser haproxy plutôt qu'un jeu de règles avec iptable !
Haproxy rajoute certes un intermédiaire mais est quand même très performant (surtout si on compare avec la solution de mettre node.js derrière apache !)
# Premier paquet
Posté par jben . Évalué à 5. Dernière modification le 09 octobre 2013 à 20:17.
Il n'y a que le premier paquet qui est concerné par ton filtre, et bien redirigé par vers le bon port.
Pour les autres, ils arrivent toujours sur le port 80 après
PREROUTING
. En particulier les paquets suivant de la requete si il elle est trop grande, en particulier lesACK
de la réponse…[^] # Re: Premier paquet
Posté par Raphaël MICHEL . Évalué à 0.
Donc, comment faudrait-il faire ?
# Varnish
Posté par visualstation . Évalué à 4.
Je pense qu'une utilisation simple de Varnish devrait permettre ce que tu souhaites.
Demander à IPTABLES d'aller ouvrir un paquet HTTP pour rediriger vers un autre port, c'est pas la bonne manière de procéder.
Parcontre en passant par un reverse proxy, c'est un rien plus propre.
Essayons d'imager mon exemple:
Internet—Requête (http://www.superman.xxx) --> Serveur ==> Redirection vers Apache/Nginx/Unicorn/…
Avec Varnish, lorsque une requête va arriver sur le port 80, il va regarder quel est l'URI appelé, et en fonction des règles définies, il redirigera la requête vers le bon serveur (backend: nginx, apache, …).
L'article suivant décrit ce qu'il faut faire pour obtenir le résultat que tu souhaites:
http://www.unixgarden.com/index.php/gnu-linux-magazine/varnish-un-proxy-qui-vous-veut-du-bien/2
# finalement ce que tu cherches...
Posté par NeoX . Évalué à 5.
c'est un proxy, qui regarde quel domaine est demandé et passe la demande au bon backend.
on a deja cité varnish, haproxy,
tu peux aussi regarder du coté du mod_proxy d'apache,
perso je m'en sers pour renvoyer un domaine vers un process python qui ecoute sur un port particulier (pour des sites en django par exemple)
[^] # Re: finalement ce que tu cherches...
Posté par Raphaël MICHEL . Évalué à 0.
merci pour varnish ^
Par contre avec mod_proxy on passe par Apache, ce qui enlève l'intérêt principal de Node.js qu'est la rapidité.
# Résolu
Posté par Raphaël MICHEL . Évalué à 0.
Merci beaucoup, je vais étudier la doc de haproxy et de varnish (au premier abord, le second me parait plus simple à configurer reste à voir au niveau de l'efficacité).
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.