前提环境:
- Docker 环境
涉及参考文档:
- ngx_http_geoip_module 模块
- Loki NGINX Service Mesh
- GeoIP IP库
一、下载GeoIP IP库
二、配置Nginx主配置文件
vim /data/nginx/MangoMoh/dos/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
load_module modules/ngx_http_geoip_module.so; #加载geoip模块
load_module modules/ngx_stream_geoip_module.so; #加载geoip模块
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
geoip_country /var/log/nginx/geoip/GeoCountry.dat; #数据放在日志文件一起挂载进行。实际个人自定义即可
geoip_city /var/log/nginx/geoip/GeoCity.dat;
geoip_proxy 0.0.0.0/0;
geoip_proxy_recursive on;
log_format main escape=json '{'
'"msec": "$msec", ' # 以秒为单位的时间,日志写入时分辨率为毫秒
'"connection": "$connection", ' # 连接序列号
'"connection_requests": "$connection_requests", ' # ���过连接发出的当前请求数
'"pid": "$pid", ' # process pid
'"request_id": "$request_id", ' # the unique request id
'"request_length": "$request_length", ' # 请求长度(包括请求行、标头和请求正文)
'"remote_addr": "$remote_addr", ' # 客户地址
'"remote_user": "$remote_user", ' # 身份验证提供的用户名
'"remote_port": "$remote_port", ' # 客户端端口
'"time_local": "$time_local", ' # 通用日志格式的本地时间
'"time_iso8601": "$time_iso8601", ' # ISO 8601 标准格式的本地时间
'"request": "$request", ' # 完整的原始请求行
'"request_uri": "$request_uri", ' # 完整的原始请求 URI(带参数)
'"args": "$args", ' # 请求行中的参数
'"status": "$status", ' # 响应状态
'"body_bytes_sent": "$body_bytes_sent", ' # 发送到客户端的字节数,不计算响应标头;
'"bytes_sent": "$bytes_sent", ' # 发送到客户端的字节数
'"http_referer": "$http_referer", ' # 防盗链
'"http_user_agent": "$http_user_agent", ' # user agent
'"http_x_forwarded_for": "$http_x_forwarded_for", ' # 访问真实IP
'"http_host": "$http_host", ' # 官方未找到,具体使用需要验证
'"server_name": "$server_name", ' # 接受请求的服务器的名称
'"request_time": "$request_time", ' # 请求处理时间
'"upstream": "$upstream_addr", ' # 上游服务器,保留 IP 地址和端口
'"upstream_connect_time": "$upstream_connect_time", ' # 保留与上游服务器建立连接所花费的时间
'"upstream_header_time": "$upstream_header_time", ' # 保持时间 用于从上游服务器接收响应标头
'"upstream_response_time": "$upstream_response_time", ' # 保留从上游服务器接收响应所花费的时间
'"upstream_response_length": "$upstream_response_length", ' # 保留从上游服务器获得的响应长度
'"upstream_cache_status": "$upstream_cache_status", ' # 保持访问响应缓存的状态
'"ssl_protocol": "$ssl_protocol", ' # TLS protocol
'"ssl_cipher": "$ssl_cipher", ' # TLS cipher
'"scheme": "$scheme", ' # 请求方式
'"request_method": "$request_method", ' # 请求方式
'"server_protocol": "$server_protocol", ' # 请求协议
'"pipe": "$pipe", ' # "p" if request was pipelined, "." otherwise
'"gzip_ratio": "$gzip_ratio", '
'"http_cf_ray": "$http_cf_ray",'
'"geoip_country_code": "$geoip_country_code", '
'"geoip_city": "$geoip_city"'
'}';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
三、配置子NGINX 配置文件
vim /data/nginx/web.conf
server {
listen 80;
listen [::]:80;
server_name $host;
root /usr/share/nginx/html;
index index.html;
gzip on;
gzip_buffers 32 4k;
gzip_comp_level 6;
gzip_min_length 200;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
server_tokens off;
expires 1d;
access_log /var/log/nginx/website.access.log main;
error_log /var/log/nginx/website.error.log;
# 请求到入口页面
location /myip {
default_type text/plain;
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Real-IP;
real_ip_recursive on;
return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
四、启动Docker 容器
docker run -d --name=nginx \
-v /data/nginx/web.conf:/etc/nginx/conf.d/default.conf \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/docker_logs/web:/var/log/nginx \
-p 80:80 \
nginx:latest
五、访问测试
1、查看Web:
https://IP/myip