Nginx GeoIP变量在反向代理下无效

时间:2017-07-18 05:54:00

标签: node.js ubuntu nginx proxy

我有一个由两个在apache和节点j上运行的web应用程序组成的设置,但所有这些应用程序都是通过一个充当纯反向代理的nginx服务器提供的。

通过这种方式,我有一些网址可以转到一个应用程序,一些网址会转到另一个应用程序,并且工作正常。但是我的网站必须限制来自美国以外的访问。

我需要nginx检测到我的国家/地区,如果除了US以外的其他任何内容重定向到/限制页面,但如果它是有效的美国IP地址,则应该转到该网站。

我按照这里的教程https://www.howtoforge.com/tutorial/how-to-use-geoip-with-nginx-on-ubuntu-16.04/

我在输入时发现模块已加载:

# nginx -V
nginx version: nginx/1.12.1
built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads

我可以看到它说: - with-http_geoip_module

我修改了 /etc/nginx/nginx.conf 文件并添加了geoip数据库文件,如下所示:

 http {
   # Geo IP
   geoip_country /etc/nginx/geoip/GeoIP.dat; # the country IP database

   map $geoip_country_code $allowed_country {
      default no;
      US yes;
   }
   # Other stuff #
 }

在我的虚拟主机中,我添加了geoip标头,以便我可以读取它以进行调试,或使用$ allowed_country变量进行重定向,如下所示:

server {
     if ($allowed_country = no) {
       return 301 https://127.0.0.1:8001/restricted;
     }

     location / {
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header GEOIP_COUNTRY_CODE $geoip_country_code;

       fastcgi_param REMOTE_ADDR $remote_addr;
       proxy_pass http://127.0.0.1:8000;
     }
}

但我的 $ allowed_country 总是=否。当我禁用它并在我的nodejs应用程序中调试 GEOIP_COUNTRY_CODE 标头的内容时,标头永远不会被设置(好像$ geoip_country_code是空白的)但是如果我替换< strong> $ geoip_country_code 变量用于其他我可以完全在我的Node应用程序中看到自定义标题。

我已经尝试过Ubuntu 16.04,Ubuntu 14.04附带的nginx版本,我手工编译以确保模块启用并安装没有成功,无论我做什么 $ geoip_country_code 总是空白或未设置。

/ var / log / syslog 在我的nginx启动序列中没有显示任何错误,实际上如果我把错误的文件放到geoip模块读取你会收到错误所以我知道该文件没有损坏,正在加载。

我在发布这个问题之前已经广泛搜索并发现了类似的问题,但在尝试了所有建议之后似乎没有什么对我有用。

这是一个问题而我无法在Node中进行国家检测的原因是因为我使用nginx中的proxy_cache来缓存公共站点上的请求但是如果我这样做而没有检测到国家/地区那么每个人都可以访问只要美国某人提供该网站,该网页就不仅是美国人了。

希望有人能帮我一把。

0 个答案:

没有答案