Nginx使用¶
使用了Cloudflare后看日志获取不到真实IP¶
1.最简的在nginx配置文件http段配置¶
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For
# 是否递归地排除直至得到用户ip,默认off
real_ip_recursive on;
#real_ip_header CF-Connecting-IP;
#real_ip_header CF-Connecting-IPv6;
2.优化一下,从Cloudflare那里获取IP¶
http配置
real_ip_header X-Forwarded-For;
real_ip_recursive on;
include vhost/cloudflare_ips.conf;
编写sh脚本
#!/bin/bash
# IPv4 和 IPv6 地址列表的网址
URL_V4="https://www.cloudflare.com/ips-v4"
URL_V6="https://www.cloudflare.com/ips-v6"
# 配置文件路径
CONF_FILE="/usr/local/nginx/conf/vhost/cloudflare_ips.conf"
# 使用curl获取IPv4地址列表,并使用awk格式化输出
curl -s $URL_V4 | awk '{print "set_real_ip_from " $1 ";"}' > $CONF_FILE
# 检查IPv4地址列表获取是否成功
if [ $? -ne 0 ]; then
echo "获取IPv4地址列表失败,请检查网络连接或URL地址。"
exit 1
fi
# 使用curl获取IPv6地址列表,并追加到配置文件
curl -s $URL_V6 | awk '{print "set_real_ip_from " $1 ";"}' >> $CONF_FILE
# 检查IPv6地址列表获取是否成功
if [ $? -ne 0 ]; then
echo "获取IPv6地址列表失败,请检查网络连接或URL地址。"
exit 1
fi
echo "IP列表已更新,正在测试nginx配置..."
# 测试nginx配置
sudo nginx -t
if [ $? -eq 0 ]; then
echo "nginx配置测试通过,正在重新加载..."
sudo nginx -s reload
# 检查nginx是否成功重新加载
if [ $? -eq 0 ]; then
echo "nginx配置已成功重新加载。"
else
echo "nginx配置重新加载失败,请检查错误信息。"
fi
else
echo "nginx配置测试失败,请检查配置文件。"
fi
添加定时任务
0 8 * * * /data/tools/cloudflare_ips.sh
给与权限
chmod 755 /data/tools/cloudflare_ips.sh
仅运行Cloudflare的IP访问¶
获取Cloudflare的IP¶
#!/bin/bash
# IPv4 和 IPv6 地址列表的网址
URL_V4="https://www.cloudflare.com/ips-v4"
URL_V6="https://www.cloudflare.com/ips-v6"
# 配置文件路径
# 设置真实IP文件
CONF_FILE="/usr/local/nginx/conf/vhost/cloudflare_ips.conf"
# 设置允许访问的IP文件
ALLOW_IP_CONF_FILE="/usr/local/nginx/conf/vhost/allow_cloudflare_ips.conf"
# 使用curl获取IPv4地址列表,并使用awk格式化输出
curl -s $URL_V4 | awk '{print "set_real_ip_from " $1 ";"}' > $CONF_FILE
curl -s $URL_V4 | awk '{print "allow " $1 ";"}' > $ALLOW_IP_CONF_FILE
# 检查IPv4地址列表获取是否成功
if [ $? -ne 0 ]; then
echo "获取IPv4地址列表失败,请检查网络连接或URL地址。"
exit 1
fi
# 使用curl获取IPv6地址列表,并追加到配置文件
curl -s $URL_V6 | awk '{print "set_real_ip_from " $1 ";"}' >> $CONF_FILE
curl -s $URL_V6 | awk '{print "allow " $1 ";"}' >> $ALLOW_IP_CONF_FILE
# 检查IPv6地址列表获取是否成功
if [ $? -ne 0 ]; then
echo "获取IPv6地址列表失败,请检查网络连接或URL地址。"
exit 1
fi
echo "IP列表已更新,正在测试nginx配置..."
# 测试nginx配置
nginx -t
if [ $? -eq 0 ]; then
echo "nginx配置测试通过,正在重新加载..."
nginx -s reload
# 检查nginx是否成功重新加载
if [ $? -eq 0 ]; then
echo "nginx配置已成功重新加载。"
else
echo "nginx配置重新加载失败,请检查错误信息。"
fi
else
echo "nginx配置测试失败,请检查配置文件。"
fi
修改Nginx配置¶
location / {
include /usr/local/nginx/conf/vhost/allow_cloudflare_ips.conf;
deny all;
try_files $uri $uri/ /index.php?$args;
}
注意事项¶
仅允许Cloudflare的IP的访问,就不能设置set_real_ip_from,如果设置就会拿真实IP进行匹配,导致访问被拦截。
如果要获取真实IP,可以修改Nginx日志格式,如:
http {
# 其他配置
# ...
log_format json escape=json '{"@timestamp":"$time_iso8601",'
'"server_addr":"$server_addr",'
'"remote_addr":"$remote_addr",'
'"real_ip":"$http_cf_connecting_ip",'
'"scheme":"$scheme",'
'"request_method":"$request_method",'
'"request_uri": "$request_uri",'
'"request_length": "$request_length",'
'"uri": "$uri", '
'"request_time":$request_time,'
'"body_bytes_sent":$body_bytes_sent,'
'"bytes_sent":$bytes_sent,'
'"status":"$status",'
'"upstream_time":"$upstream_response_time",'
'"upstream_host":"$upstream_addr",'
'"upstream_status":"$upstream_status",'
'"host":"$host",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
# 其他配置
# ...
server {
# 其他配置
# ...
access_log /data/wwwlogs/wiki.lyricn.com_nginx.log json;
}
}