- yum install -y gcc glibc gcc-c++ openssl-devel pcre-devel
-
https://openresty.org/cn/download.html
- cd /data/softwares
- wget -c https://openresty.org/download/openresty-1.15.8.3.tar.gz
- tar xf openresty-1.15.8.3.tar.gz
-
使用geoip需要libmaxminddb对mmdb的高效访问,因此首先需要安装 libmaxminddb的动态识别库。
https://github.com/maxmind/libmaxminddb/releases
- #1.下载解压
- cd /data/softwares
- wget -c https://github.com/maxmind/libmaxminddb/releases/download/1.4.3/libmaxminddb-1.4.3.tar.gz
- tar xf libmaxminddb-1.4.3.tar.gz
-
- #2.编译安装
- cd libmaxminddb-1.4.3/
- ./configure
- make
- make install
-
默认情况下上述操作会将libmaxminddb.so部署到/usr/local/lib目录下,通过如下步骤更新ldconfig,可以让动态链接库为系统所共享。
- echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf
- ldconfig
-
https://github.com/leev/ngx_http_geoip2_module/archive/
- cd /data/softwares
- wget https://github.com/leev/ngx_http_geoip2_module/archive/3.3.tar.gz
- tar xf 3.3.tar.gz
- mv ngx_http_geoip2_module-3.3 ngx_http_geoip2_module
-
- mkdir -p /data/softwares/GeoIP
- git clone https://github.com/ar414-com/nginx-geoip2
- cd nginx-geoip2
- tar -zxvf GeoLite2-City_20200519.tar.gz
- mv ./GeoLite2-City_20200519/GeoLite2-City.mmdb /data/softwares/GeoIP/
- tar -zxvf GeoLite2-Country_20200519.tar.gz
- mv ./GeoLite2-Country_20200519/GeoLite2-Country.mmdb /data/softwares/GeoIP/
-
- cd /data/softwares/openresty-1.15.8.3/
- ./configure -j2 --prefix=/data/applications/openresty --with-pcre-jit --with-ipv6 --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-pcre --with-stream=dynamic --with-http_flv_module --add-module=/data/softwares/ngx_http_geoip2_module
-
- make -j2
- make install
-
- cat > /etc/profile.d/openresty.sh << EOF
- export OPEN_HOME=/data/applications/openresty
- export PATH=$OPEN_HOME/bin:$PATH
- EOF
-
- source /etc/profile.d/openresty.sh
-
- openresty -V
-
openresty使用方法同nginx,只是命令由nginx替换为openresty
- openresty
-
openresty包含了自身的包维护工具opm,该工具采用 perl实现依赖MD5,需要先安装perl的MD5模块。
- yum install -y perl-Digest-MD5
-
https://github.com/anjia0532/lua-resty-maxminddb
- opm get anjia0532/lua-resty-maxminddb
-
需要在http段添加如下指令,其中的;;表示默认库路径:
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
- user nginx;
- worker_processes auto;
- worker_cpu_affinity auto;
- worker_rlimit_nofile 65535;
-
- daemon on;
- error_log /data/logs/nginx/error.log warn;
- pid /var/run/nginx.pid;
-
- events {
- use epoll;
- worker_connections 65535;
- }
-
- http {
- # 加载lua库和动态库
- lua_package_path "/usr/local/openresty/lualib/?.lua;;";
- lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
-
- include mime.types;
- default_type application/octet-stream;
-
- charset utf-8;
-
- log_format main '$remote_addr - $remote_user [$time_local] '
- '"$request" $status $body_bytes_sent '
- '"$http_referer" "$http_user_agent" '
- '"$http_x_forwarded_for" $host $request_time $upstream_response_time $request_body $scheme';
-
- log_format main1 '$remote_addr|$remote_user|[$time_local]|$request|'
- '$status|$body_bytes_sent|$http_referer|'
- '$http_user_agent|$request_time|$host|$upstream_addr|$request_body|$upstream_response_time';
-
- log_format lua '$remote_addr|$remote_user|[$time_local]|$request|'
- '$status|$body_bytes_sent|$http_referer|'
- '$http_user_agent|$request_time|$host|$upstream_addr|$request_id|$upstream_response_time';
-
- log_format main2
- '{"@timestamp":"$time_iso8601",'
- '"host":"$hostname",'
- '"server_ip":"$server_addr",'
- '"client_ip":"$http_x_forwarded_for",'
- '"xff":"$http_x_forwarded_for",'
- '"domain":"$host",'
- '"url":"$uri",'
- '"referer":"$http_referer",'
- '"args":"$args",'
- '"upstreamtime":"$upstream_response_time",'
- '"responsetime":"$request_time",'
- '"request_method":"$request_method",'
- '"status":"$status",'
- '"size":"$body_bytes_sent",'
- '"request_body":"$request_body",'
- '"request_length":"$request_length",'
- '"protocol":"$server_protocol",'
- '"upstreamhost":"$upstream_addr",'
- '"file_dir":"$request_filename",'
- '"http_user_agent":"$http_user_agent"'
- '}';
-
- # 基础优化设置
- server_tokens off;
-
- sendfile off;
- tcp_nopush on;
- tcp_nodelay on;
-
- keepalive_timeout 65;
- keepalive_requests 8192;
-
- # gzip
- gzip on;
- gzip_min_length 1k;
- gzip_buffers 4 16k;
- gzip_comp_level 3;
- gzip_types text/plain application/javascript text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png;
- gzip_vary on;
-
- client_body_timeout 600;
- client_header_timeout 600;
- send_timeout 600;
- reset_timedout_connection on;
-
- client_max_body_size 30m;
- client_body_buffer_size 8192k;
-
- client_header_buffer_size 16k;
- large_client_header_buffers 8 256k;
-
- server_names_hash_bucket_size 512;
-
- proxy_connect_timeout 600;
- proxy_read_timeout 600;
- proxy_send_timeout 600;
-
- proxy_buffer_size 128k;
- proxy_buffers 8 128k;
- proxy_busy_buffers_size 256k;
-
- output_buffers 1 32k;
- postpone_output 1460;
-
- open_file_cache max=65535 inactive=60s;
- open_file_cache_valid 80s;
- open_file_cache_min_uses 1;
- open_file_cache_errors on;
-
- # fastcgi set
- fastcgi_ignore_client_abort on;
- fastcgi_connect_timeout 600;
- fastcgi_send_timeout 600;
- fastcgi_read_timeout 600;
- fastcgi_buffer_size 128k;
- fastcgi_buffers 8 128k;
- fastcgi_busy_buffers_size 256k;
- fastcgi_temp_file_write_size 256k;
-
- # fastcgi TEST
- fastcgi_cache_valid 200 302 1h;
- fastcgi_cache_valid 301 1d;
- fastcgi_cache_valid any 1m;
- fastcgi_cache_min_uses 1;
- fastcgi_cache_use_stale error timeout invalid_header http_500;
-
- real_ip_header X-Forwarded-For;
-
- # 开启缓存LUA代码(正式环境使用on)
- lua_code_cache off;
-
- # 允许用户自定义请求头
- underscores_in_headers on;
-
- # vhost
- include /data/conf/nginx/conf.d/*.conf;
-
- # nginx 使用 geoip配置(此为针对有负载均衡器时获取真实客户端IP)
- map $http_x_forwarded_for $real_ip {
- #~^(\d+\.\d+\.\d+\.\d+) $http_x_forwarded_for;
- #(?P)命名补货
- ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
- default $remote_addr;
- }
-
- # nginx加载使用geoip2数据库
- geoip2 /data/softwares/GeoIP/GeoLite2-City.mmdb {
- $geoip2_data_country_code source=$real_ip country iso_code;
- $geoip2_data_country_name source=$real_ip country names en;
- $geoip2_data_city_name source=$real_ip city names en;
- $geoip2_data_province_name subdivisions 0 names en;
- $geoip2_data_province_isocode subdivisions 0 iso_code;
- }
-
- # php变量设置
- fastcgi_param COUNTRY_CODE $geoip2_data_country_code;
- fastcgi_param COUNTRY_NAME $geoip2_data_country_name;
- fastcgi_param CITY_NAME $geoip2_data_city_name;
- fastcgi_param PROVINCE_NMAE $geoip2_data_province_name;
- }
-
-
- server {
- listen 80;
- server_name localhost;
-
- access_log /data/logs/nginx/status.access.log main2;
- error_log /data/logs/nginx/status.error.log error;
-
- # 获取geoip
- location / {
- default_type "text/html";
- charset utf-8;
- content_by_lua_file /data/conf/nginx/lua/geoip.lua;
- }
-
- location /myip {
- default_type "text/html";
- charset utf-8;
- content_by_lua_file /data/conf/nginx/lua/getip.lua;
- }
- }
-
- --- Generated by EmmyLua(https://github.com/EmmyLua)
- ------- Created by Tareya Shen.
- ------- DateTime: 2020/8/11 10:28 上午
- ------- Describe: lua 获取geoip
-
- ngx.say("<br>IP location query result:<hr><br>")
-
- local cjson=require 'cjson'
- local geo=require 'resty.maxminddb'
- local arg_ip=ngx.var.arg_ip
- local arg_node=ngx.var.arg_node
- ngx.say("IP:",arg_ip,", node:",arg_node,"<br>")
-
- if not geo.initted() then
- geo.init("/data/softwares/GeoIP//GeoLite2-City.mmdb")
- end
-
-
- local res,err=geo.lookup(arg_ip or ngx.var.remote_addr)
-
- if not res then
- ngx.say("Please check the ip address you provided: <div style='color:red'>",arg_ip,"</div>")
- ngx.log(ngx.ERR,' failed to lookup by ip , reason :',err)
- else
- ngx.say("Result:",cjson.encode(res))
- if arg_node then
- ngx.say("node name:",ngx.var.arg_node, " , value:",cjson.encode(res[ngx.var.arg_node] or {}))
- end
- end
-
- curl localhost/?ip=114.114.114.114&node=city
-
- curl localhost/?ip=2001:4860:0:1001::3004:ef68&node=country
-
- --- Generated by EmmyLua(https://github.com/EmmyLua)
- ------- Created by Tareya Shen.
- ------- DateTime: 2020/8/11 10:28 上午
- ------- Describe: 获取客户端真实IP
-
- local clientIP = ngx.req.get_headers()["X-Real-IP"]
-
- if clientIP == nil then
- clientIP = ngx.req.get_headers()["X-Forwarded-For"]
- end
-
- if clientIP == nil then
- clientIP = ngx.var.remote_addr
- end
-
- ngx.say(clientIP)
-
- curl localhost/myip
-