文章内容
2018/12/25 13:55:12,作 者: 黄兵
Nginx + Flask 获取IP地址
最近需要获取访客的IP地址,才开始按照这篇文章的方式获取:Flask如何获取客户端IP,但是一直获取到的是127.0.0.1。
这个肯定不是我们需要的,之后又参考了这篇文章:限制IP访问
Flask视图写法如下:
def get_client_ip(request): try: real_ip = request.META['HTTP_X_FORWARDED_FOR'] client_ip = real_ip.split(",")[0] except: try: client_ip = request.META['REMOTE_ADDR'] except: client_ip = "" return client_ip
之后修改配置Nginx配置:
server { listen 80; server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:5000; uwsgi_param UWSGI_CHDIR ***; uwsgi_param UWSGI_SCRIPT run:app; #以下必加 uwsgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for; uwsgi_param X-Real-IP $remote_addr; } }
这次获取到的IP地址为空,看样子哪里还是有问题。
参考了这篇文章:Flask request.remote_addr is wrong on webfaction and not showing real user IP
最后不断修改终于获取了访客的真实IP,具体代码如下:
Flask视图写法:
# get remote ip if request.headers.getlist("X-Forwarded-For"): get_remote_ip = request.headers.getlist("X-Forwarded-For")[0] else: get_remote_ip = request.remote_addr
之后Nginx配置文件参考了这篇文章:Flask+Gunicorn+Nginx安装
具体配置内容如下:
server { listen 80; listen [::]:80 ssl ipv6only=on; listen 443 ssl; listen [::]:443 ssl ipv6only=on; server_name www.xxxx.com; ssl on; ssl_certificate /etc/ssl/private/www.xxxx.com/1_www.xxxxx.com_bundle.crt; ssl_certificate_key /etc/ssl/private/www.xxxxx.com/2_www.xxxxxx.com.key; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; keepalive_timeout 70; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; #https add_header Strict-Transport-Security max-age=63072000; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; location / { try_files $uri @gunicorn_proxy; } location @gunicorn_proxy { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://0.0.0.0:5000; proxy_connect_timeout 500s; proxy_read_timeout 500s; uwsgi_buffers 16 16k; uwsgi_buffer_size 32k; proxy_send_timeout 500s; } }
之后重启Nginx和网站应用程序,最后问题解决。
截图看看获取到的数据:
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - Nginx + Flask 获取IP地址
评论列表