J'ai une application MEAN Stack déployée sur un serveur et j'utilise Nginx en tant que serveur proxy pour gérer la demande et la redirection vers le port particulier de l'application.
Par exemple: l'utilisateur accède à l'URL http://www.example.com/
et Nginx affiche l'URL réelle de l'application http://www.example.com:1234/
, car mon application est exécutée sur le port 1234.
Maintenant, à des fins d'analyse, j'ai écrit un court script dans node.js qui récupère l'adresse IP et l'emplacement des utilisateurs visitant mon site Web. Je peux voir les requêtes recherchées en externe mais je reçois l'adresse IP et l'emplacement de mon propre serveur. Pourquoi donc?
Est-ce à cause de Nginx? Comment puis-je résoudre ce problème et récupérer l'emplacement réel de l'utilisateur?
Voici le Nginx Conf qui fonctionne pour moi, placé sur le chemin /etc/nginx/conf.d/example.com.conf
.
server {
listen 80;
listen [::]:80;
server_name example.com;
proxy_set_header Host $http_Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass "http://localhost:1234/";
}
}
Aucune autre configuration Nginx requise, car lors de ma mise en œuvre précédente, un autre fichier de configuration situé dans le répertoire /etc/nginx/sites-available/default
était en conflit en tant que nom de serveur dupliqué. Enfin, je voudrais ajouter que la commande Nginx Testing est utilisée avant de réinitialiser les modifications. Ce qui était une aide énorme. Commande: nginx -t
.
Et dans Node.js, c'est le moyen le plus approprié d'accéder à l'adresse IP du client.
var getClientAddress = (req.headers['x-forwarded-for'] || '').split(',')[0]
|| req.connection.remoteAddress;
console.log(getClientAddress);
À votre santé ;-)
Étant donné que votre serveur d'applications principal se trouve derrière un serveur proxy, vous verrez naturellement l'adresse IP du serveur proxy, car il s'agit en réalité du "client" qui envoie la demande à votre serveur d'applications.
Vous avez besoin de l'adresse IP du client qui envoie la demande au serveur proxy - l'adresse IP d'origine. Le seul moyen d'obtenir ces informations est si le serveur proxy transmet l'adresse IP à l'origine de la demande. C'est généralement ce que font les serveurs proxy avec l'en-tête de requête HTTP X-Forwarded-For
.
X-Forwarded-For: <client-ip-address>
Toutefois, cet en-tête peut contenir plusieurs adresses IP (séparées par des virgules) si plusieurs serveurs proxy ont été transmis:
X-Forwarded-For: <client-ip-address>, <previous-proxy-ip>