文章内容

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地址

分享到:

发表评论

评论列表