用nginx显示IP地址 server { listen 80; listen 443 ssl; server_name j46.cc; access_log logs/j46.cc.log main; ######如果不需要加证书访问下面这些可以注销###### ssl on; ssl_certificate /opt/nginx/conf/cert/ssl/j46.cc.pem; ssl_certificate_key /opt/nginx/conf/cert/ssl/j46.cc.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2; ######如果不需要加证书访问上面这些可以注销###### location / { default_type text/plain; return 200 $remote_addr; } location /json { default_type application/json; return 200 "{\"ip\":\"$remote_addr\"}"; } } 如标题所示,不依赖任何后端方法,使用纯 Nginx 实现(Nginx-Lua 也不需要)一个“显示我的 IP 地址”的 API。 实际上这是我在很久之前看过的一篇文章中介绍的技巧,时间有点久了,一时半会儿也找不到原文地址,但发现自己当时写的 Nginx 配置文件还在,所以翻出来分享一下。 普通版本 Nginx 的配置文件中提供了一个变量 $remote_addr 用来获取用户访问本实例时的 IP 地址,我们只要将这个变量的值返回给用户就行了(没错,就是这么简单!) : location / { default_type text/plain; return 200 $remote_addr; } 这里使用 default_type text/plain 来向浏览器表明我们返回的值是一个纯文本,从而能够被浏览器直接显示出来。 JSON 版本 同样依赖于 $remote_addr 这个变量,我们可以将返回值稍微修饰一下,实现一个返回 JSON 数据的 API: location /json { default_type application/json; return 200 "{\"ip\":\"$remote_addr\"}"; } 配置文件中的 default_type application/json 向浏览器表明我们的返回的值是 JSON 数据。 测试效果 配置好后可以使用 curl 来测试一下(下面的 API 域名和返回值中的 IP 地址都做了替换处理,非真实情况): $ curl http://example.com/ xx.xx.xx.xx $ curl http://example.com/json {"ip":"xx.xx.xx.xx"} 参考文档: https://blog.inkuang.com/2019/1203/ 经过cdn获取IP ###注意 要在 nginx.conf配置文件 http配置里面加 log_format log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" '; ##就是上面这句 server { listen 80; listen 443 ssl; server_name q216.com; access_log logs/q216.com.log main; ######如果不需要加证书访问下面这些可以注销###### #ssl on; #ssl_certificate /opt/nginx/conf/cert/ssl/j46.cc.pem; #ssl_certificate_key /opt/nginx/conf/cert/ssl/j46.cc.key; #ssl_session_cache shared:SSL:1m; #ssl_session_timeout 10m; #ssl_prefer_server_ciphers on; #ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2; ######如果不需要加证书访问上面这些可以注销###### location / { default_type text/plain; #####把$remote_addr修改为$http_x_forwarded_for就可以用cdn了#### return 200 $http_x_forwarded_for\n; } }