Afficher l’IP d’un visiteur – Django vs Nginx

Lorsque l’on veut connaitre son ip on fait souvent appel à des sites du genre: whatismyip.com, mon-ip.com ou on utilise un ifconfig en ssh.
Des fois on a aussi besoin de connaître l’ip d’un visiteur sur son site, 2 petites méthodes pour le faire sous Django et Nginx.

Sous Django:

Dans l’Urlconf

urlpatterns = patterns('',
    # return client IP
    url(r'^my_ip$', get_ip),
)

Créez une vue du nom de get_ip qui sera utilisée par l’urlconf

from django import http
 
def get_ip(request):
    """
        Vue qui retourne l'IP du client
    """
    try:
 
    	# récupère l'ip du client
        return http.HttpResponse(request.META["REMOTE_ADDR"] )
 
    except Exception, e:
        return http.HttpResponse('error %s' % e)

Le code ci-dessus peut retourner l’adresse locale (127.0.0.1) dans ce cas il faut tester l’existence de la variable HTTP_X_REAL_IP, certains serveurs web ont besoin d’être configuré.

Sous Nginx:

Dans le fichier de configuration de nginx on écrit une nouvelle location

# return client ip
location /my_ip {
    default_type 'text/plain';
    content_by_lua 'ngx.print(ngx.var.remote_addr)';
}

il suffit de se rendre à l’url http://monsite.com/my_ip pour voir s’afficher son ip. Cependant il faut avoir nginx compilé avec le module Lua ce qui peut être délicat si l’on a jamais compilé d’application.


Conclusion:

Si l’on s’en réfère aux deux exemples ci dessus on serait tenté d’utiliser Nginx car en une seule ligne tout le bazar est réglé.
Le hic c’est qu’il faut que Nginx soit compilé avec le module Lua pour afficher l’ip (sauf si quelqu’un connaît une autre façon d’afficher un message de sortie).
La version Django n’est pas fiable à 100% car suivant comment est configuré votre serveur web il se peut que vous vous retrouviez avec une ip du genre 127.0.0.1.
Il y a aussi la possibilité de parser le résultat des sites web cités en tout début d’article, certains proposent des Api je crois mais vous dépendez d’un autre service (on faisait ça au début) qui peuvent vous lâcher à tout moment (ce qui nous est arrivé).
Personnellement je compile toujours nginx avec Lua et quelques autres modules, ça permet de s’affranchir de plus en plus du backend.

PS: j’ai mis à jour le titre car il laissait sous-entendre autre chose (merci à Sébastien)

Articles similaires:

  1. Servir un fichier protégé avec Django et Nginx
  2. Récupérer l’IP client avec Nginx en proxy sous CherryPy/Django/Bottle – proxy_set_header
  3. Nginx en reverse proxy + Gunicorn pour vos apps Django
  4. nginx: [emerg] “worker_processes” directive is not allowed here in /usr/local/nginx/conf/nginx.conf:3
  5. Permettre de télécharger un fichier proprement avec Django et nginx

flattr this!

11 comments

  1. Khertan

    pour une fois …

  2. Sebastien

    La vraie ip.. hmm, ou celle du proxy…

  3. mmm le titre peut paraitre tendencieux en effet si on parle de proxy du genre surf anonyme.

  4. On utilise “ip addr” en ssh, ifconfig est déprécié. Ouais, je suis aigri, je sais :D .

  5. merci pour ip addr je connaissais pas :)

  6. Mais de rien, c’est toujours un plaisir. Il faut arriver à se faire à la sortie de la commande, quand on est habitué à ifconfig et route (oui, car y’a aussi “ip route”). Mais une fois que cette étape est franchie, ip est vraiment plus souple et il centralise toutes les commandes réseaux.

    Ça t’intéresserait que je fasse un billet pour le blog là dessus ?

  7. Ha mais avec le plus grand plaisir très cher, les billets c’est comme la bonne choucroute, on s’en lasse pas !
    Et c’est tout à ton honneur.

  8. Carrément. On t’envois un petit mail.

  9. Juste pour info, c’est quoi les modules supplémentaires avec lesquel tu compile ton nginx ? Je vais passer de apache à nginx sous peu et tant qu’à faire, autant avoir un truc un peu complet pour pas me retrouver à devoir recompiler le bazar toutes les 2 semaines.

  10. @ greg faudrait en faire un article ptet du coup …

    https://github.com/agentzh/redis2-nginx-module.git
    pour taper directement dans Redis

    https://github.com/chaoslawful/lua-nginx-module
    pour le Lua, c très pratique et super puissant

    https://github.com/agentzh/set-misc-nginx-module
    md5, base64 encodeing, decoding, et d’autres trucs

    http_gzip_static_module
    faut l’activer c pas d’origine, pour le gzip (compression des pages à la volée)

    d’autres modules pour l’upload de fichiers:
    https://github.com/vkholodkov/nginx-upload-module.git
    https://github.com/masterzen/nginx-upload-progress-module.git

    –with-http_flv_module –with-http_mp4_module –with-http_secure_link_module –with-file-aio

    streaming flv et mp4
    liens sécurisés d’access à un url
    aio = un truc pour que ça aille plus vite :) (j’aime la précision)

  11. Baronsed

    Quand on veut avoir rapidement son ip depuis un script shell :
    curl ifconfig.me

Flux RSS des commentaires

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Jouer à mario en attendant que les autres répondent