Remote IP Valve, X-Forwarded-For等http头字段

Remote IP Valve, X-Forwarded-For等http头字段 http://www.10tiao.com/html/308/201702/2650076434/1.html http://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html X-Forwarded-For等http头字段与Tomcat的 Remote IP Valve (Valve源码分析之六) 2017-02-18 16:28 feiying 0 0 阅读 297 Proxies Valve是代理Valve,其作用是可以对负载均衡代理服务器的IP地址与原request的IP地址做请求转换,让服务器端真正识别原IP地址 (如果服务器端有需要的话) ; 本文主要讨论这种地址转换是如何做的; 1.X-Forwarded-For等http头字段 在我们现实的真正的场景中,通常Tomcat直接和用户接触的场景不多,主要是通过代理转发机制进行,如下: 真正的用户客户端是Client1,代理转发服务器采用的是Nginx,Proxy1,那么在此场景下,如果在Tomcat中进行获取客户端的地址: request.getRemoteAddr,获得的IP地址绝对是Proxy1的,也就是负载均衡的地址; 而如果你想要获取Client1的地址,也是可以获取到的,就是通过X-Forwarded-For字段; X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 X-Forwarded-For内置在Http协议头中,一般格式如下: X-Forwarded-For: client1, proxy1, proxy2, proxy3 其中的值通过一个 逗号+空格 把多个IP地址区分开,; 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器: proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。 鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。[1] 其次,还有一个是X-Forwarded-by字段,该字段是标识为负载均衡proxy的可信代理的IP地址; 例如上面的这个例子,X-Forwarded-For: client1, proxy1, proxy2, proxy3,可以配置当前的应用服务器的X-Forwarded-by字段可信IP为 proxy1, proxy2, proxy3; 这样通过X-Forwarded-For,X-Forwarded-by两个字段进行减法,直接就得到client1了; 还有一个是X-Forwarded-Proto,该字段记录最初从浏览器发出时候,是使用什么协议。因为有可能当一个请求最初和反向代理通信时,是使用https,但反向代理和服务器通信时改变成http协议,这个时候,X-Forwarded-Proto的值应该是https; X-Forwarded-For和X-Forwarded-Proto的信息是很有价值的,在Tomcat中可以通过获取这两个字段的信息,拿到真实的客户端的请求IP和协议; 2.Remote IP Valve Remote IP Valve就是利用X-Forwarded-For和X-Forwarded-Proto等字段,反转得到最原始的客户端的IP和请求信息的; Attributes The Remote IP Valve supports the following configuration attributes: ...

2018-06-06 · 3 min · 520 words · -

Linux oom killer

‘Linux oom killer’ https://blog.csdn.net/GugeMichael/article/details/24017515 Linux - 内存控制之oom killer机制及代码分析 2014年04月18日 15:04:29 阅读数: 28048 最近,线上一些内存占用比较敏感的应用,在访问峰值的时候,偶尔会被kill掉,导致服务重启。发现是Linux的out-of-memory kiiler的机制触发的。 http://linux-mm.org/OOM_Killer oom kiiler会在内存紧张的时候,会依次kill内存占用较高的进程,发送Sig15(SIGTERM)或Sig9(SIGKILL),取决于内核版本(可见uname -a,>= 2.6.32只会发送sigkill https://elixir.free-electrons.com/linux/v2.6.18/source/mm/oom_kill.c),。并在/var/log/message中进行记录。里面会记录一些如pid,process,。并在/var/log/message中进行记录。里面会记录一些如pid,process) name,cpu mask,trace等信息,通过监控可以发现类似问题。今天特意分析了一下oom killer相关的选择机制,挖了一下代码,感觉该机制简单粗暴,不过效果还是挺明显的,给大家分享出来。 oom killer初探 一个简单分配 heap memroy 的代码片段 (big_mm.c): #define block (1024L_1024L_MB) #define MB 64L unsigned long total = 0L; for(;;) { // malloc big block memory and ZERO it !! char\* mm = (char\*) malloc(block); usleep(100000); if (NULL == mm) continue; bzero(mm,block); total += MB; fprintf(stdout,"alloc %lum mem\n",total); } 这里有2个地方需要注意: 1、malloc是分配虚拟地址空间,如果不memset或者bzero,那么就不会触发physical allocate,不会映射物理地址,所以这里用bzero填充 2、每次申请的block大小比较有讲究,Linux内核分为LowMemroy和HighMemroy,LowMemory为内存紧张资源,LowMemroy有个阀值,通过free -lm和 ...

2018-06-04 · 4 min · 753 words · -

java onerror

java onerror http://hllvm.group.iteye.com/group/topic/40211 -XX:OnError=“jstack -F %p >/opt/com/test/threaddump.log”

2018-06-04 · 1 min · 7 words · -

Java诊断工具 - btrace

Java诊断工具 - btrace https://github.com/btraceio/btrace/releases 打印慢调用 创建一个java类 // MethodDuration_redis.java import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; import java.util.Date; @BTrace public class MethodDuration_redis{ private static int i=0; @OnMethod(clazz = "com.wiloon.package0.Class0",method = "method0",location=@Location(Kind.RETURN)) public static void printMethodRunTime(@ProbeClassName String probeClassName,@Duration long duration){ long d=duration / 1000000; if (d>9){ //大于9毫秒的调用 i++; println("index: "+ i +", timestamp:"+timestamp("HH:mm:ss")+", "+probeClassName + ", duration: " + d + " ms"); } } } 找到 java 进程并执行 btrace # 打印java进程 jcmd -l # 执行btrace, ctrl-c 退出 /bin/btrace <PID> MethodDuration_redis.java Btrace BTrace 是检查和解决线上的问题的杀器,BTrace 可以通过编写脚本的方式,获取程序执行过程中的一切信息,并且,注意了,不用重启服务,是的,不用重启服务。写好脚本,直接用命令执行即可,不用动原程序的代码。 ...

2018-06-02 · 2 min · 258 words · -

Java Flight Recorder, jfr

Java Flight Recorder, jfr jcmd 40019 VM.check_commercial_features jcmd 40019 VM.unlock_commercial_features jcmd 40019 JFR.check jcmd 40019 JFR.start name=jfr0 delay=10s duration=10s filename=jfr0.jfr

2018-05-29 · 1 min · 20 words · -

kafka, rabbitmq

kafka, rabbitmq http://www.infoq.com/cn/articles/kafka-vs-rabbitmq?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global

2018-05-14 · 1 min · 3 words · -

SSH 密钥类型 RSA, DSA, ecdsa, ed25519

SSH 密钥类型 RSA, DSA, ecdsa, ed25519 rsa ecdsa ed25519 ed25519 是目前最安全、加解密速度最快的 key 类型, 优先选择 ed25519 rsa 兼容性最好, 小于 1024 位密钥长度的 RSA 已经有被攻破的记录, 建议长度 2048, 3072 或更大, 不过作为加密使用的 RSA 有着随密钥长度增加, 性能急剧下降的问题。 DSA 不建议使用, ssh-keygen 在生成 DSA 密钥时, 其长度只能为 1024 位 DSA, RSA 1977 年, 三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法, 可以实现非对称加密。这种算法用他们三个人的名字命名, 叫做 RSA 算法。 原理与安全性 RSA 与 DSA 都是非对称加密算法。其中RSA的安全性是基于极其困难的大整数的分解 (两个素数的乘积) ;DSA 的安全性是基于整数有限域离散对数难题。基本上可以认为相同密钥长度的 RSA 算法与 DSA 算法安全性相当。 有点要注意,RSA 的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解 RSA 就一定需要作大数分解。不过也不必太过担心,RSA 从诞生以来,经历了各种攻击,至今未被完全攻破 (依靠暴力破解,小于1024位密钥长度的 RSA 有被攻破的记录,但未从算法上被攻破) 。 ...

2018-05-13 · 3 min · 552 words · -

chrome os recover

chrome os recover https://support.google.com/chromebook/answer/1080595?hl=zh-Hans open chrome and install Chromebook Recovery Utility 第 3 步: 进入恢复模式 在出现错误的 Chromebook 上: 如果您在这台 Chromebook 上连接了任何设备 (例如鼠标或外部硬盘) ,请将其取下。 进入恢复模式: Chromebook: 按住 Esc + Refresh 刷新,然后按"电源"电源。之后,松开"电源"。当屏幕上显示一条消息后,再松开其他键。 Chromebox: 首先,关闭 Chromebox。使用回形针或类似物体按住"恢复"按钮。按"电源"按钮以重新开启 Chromebox。当您在屏幕上看到一条消息后,释放"恢复"按钮。 Chromebit: 首先,将 Chromebit 断电。使用回形针或类似物体按住"恢复"按钮。为 Chromebit 重新接通电源。当您在屏幕上看到一条消息后,释放"恢复"按钮。 您会看到以下某条消息: “Chrome 操作系统不存在或已损坏。请插入 USB 记忆棒或 SD 卡。” “请插入 USB 记忆棒或 SD 卡。” 插入用于创建恢复媒体的 U 盘或 SD 卡。 按照屏幕上的说明操作。

2018-05-11 · 1 min · 58 words · -

chromeos linux, crostini

‘chromeos linux, crostini’ vmc start dev run_container.sh -container_name=stretch -user=wiloon -shell switch to dev channel, chrome os version >=67 chrome os will start to download an update update and restart Launch crosh (ctrl-alt-t) Create crostini VM vmc start dev. This’ll download the termina component, and open a shell. Launch a container run_container.sh -container_name=stretch -user=wiloon -shell https://www.youtube.com/watch?v=s9mrR2tqVbQ Crostini 101 from Crostini https://github.com/lstoll/cros-crostini/blob/master/README.md https://support.google.com/chromebook/answer/1086915?hl=en

2018-05-11 · 1 min · 61 words · -

eval command

eval command 语法: eval cmdLine eval 会对后面的 cmdLine 进行两遍扫描, 如果第一遍扫描后, cmdLine 是个普通命令, 则执行此命令;如果 cmdLine 中含有变量的间接引用, 则保证间接引用的语义。 举例如下: set 11 22 33 44 如果要输出最近一个参数,即 44, 可以使用如下命令 echo $4 但是如果我们不知道有几个参数的时候, 要输出最后一个参数, 大家可能会想到使用 $# 来输出最后一个参数 如果使用命令: echo "\$$#" 则得到的结果是 $4,而不是我们想要的44。这里涉及到一个变量间接引用的问题, 我们的本意是输出 $4, 默认情况下, 命令后忽略变量间接引用的情况。 这时候,就可以使用eval命令。 eval echo "\$$#" 得到的结果为44 eval命令将会首先扫描命令行进行所有的替换, 然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。 eval也可以用于回显简单变量, 不一定时复杂变量。 NAME=ZONE eval echo $NAME 等价于 echo $NAME 两次扫描 test.txt内容: hello shell world! myfile=“cat test.txt” (1)echo $myfile#result:cat test.txt ...

2018-05-11 · 1 min · 95 words · -

mbr, gpt

mbr, gpt http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_039_fdisk_gdisk_parted.html 两种分区结构简介 MBR分区 硬盘主引导记录MBR由4个部分组成 主引导程序 (偏移地址0000H-0088H) ,它负责从活动分区中装载,并运行系统引导程序。 出错信息数据区,偏移地址0089H-00E1H为出错信息,00E2H-01BDH全为0字节。 分区表 (DPT,Disk Partition Table) 含4个分区项,偏移地 址01BEH-01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4 结束标志字,偏移地址01FE-01FF的2个字节值为结束标志55AA GPT分区 GPT:GUID (Globals Unique Identifiers) partitiontable 支持128个分区,使用64位,支持8Z (512Byte/block ) 64Z ( 4096Byte/block) 使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表自动备份在头和尾两份,并有CRC校验位 UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动

2018-05-10 · 1 min · 36 words · -

内网 dns dig 能解析出ip, ping 返回 Name or service not known

内网 dns dig 能解析出ip, ping 返回 Name or service not known https://blog.csdn.net/jinyuxiaoqiang/article/details/78611430 https://blog.csdn.net/water_cow/article/details/7190880 vim /etc/nsswitch.conf hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns hosts: files dns myhostname

2018-05-08 · 1 min · 26 words · -

kafka cluster

kafka cluster version: 3.0.0 # net podman run \ --name zookeeper \ -p 2181:2181 \ -v /etc/localtime:/etc/localtime:ro \ -v zookeeper-conf:/conf \ -v zookeeper-data:/data \ -v zookeeper-datalog:/datalog \ -e ZOO_4LW_COMMANDS_WHITELIST=* \ -d \ zookeeper:3.7.0 podman run -d --name kafka1 \ -e ALLOW_PLAINTEXT_LISTENER=yes \ -e KAFKA_CFG_ZOOKEEPER_CONNECT=192.168.50.169:2181 \ -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.50.169:9092 \ -p 9092:9092 \ bitnami/kafka:3.2.0 podman run -d --name kafka2 \ -e ALLOW_PLAINTEXT_LISTENER=yes \ -e KAFKA_CFG_ZOOKEEPER_CONNECT=192.168.50.169:2181 \ -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.50.169:9093 \ -p 9093:9092 \ bitnami/kafka:3.2.0 podman run -d --name kafka3 \ -e ALLOW_PLAINTEXT_LISTENER=yes \ -e KAFKA_CFG_ZOOKEEPER_CONNECT=192.168.50.169:2181 \ -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.50.169:9094 \ -p 9094:9092 \ bitnami/kafka:3.2.0 https://github.com/bitnami/bitnami-docker-kafka/blob/master/README.md ...

2018-05-07 · 1 min · 95 words · -

pet

pet https://mp.weixin.qq.com/s/pccId4L674Y61Re7SZiLKg yay -S pet-bin #创建一个新的片段 pet new pet list pet sync

2018-05-04 · 1 min · 12 words · -

MX ANYWHERE 2 鼠标与蓝牙设备连接

MX ANYWHERE 2 鼠标与蓝牙设备连接 http://support.logitech.com.cn/zh_cn/article/Connect-the-MX-Anywhere-2-mouse-to-a-Bluetooth-device?product=a0qi0000008tB99AAE 1 — 电源开关 2 — 连接按钮 3 — 设备选择按钮 要将鼠标连接至运行 Windows 8 的计算机: 将鼠标底部的电源开关滑到顶端,开启鼠标。 通过设备选择按钮,选择 1、2 或 3。最多可以将三个设备保存到鼠标的内存中。 注意: 首次选择某个数字时,该指示灯开始快速闪烁,即表示进入准备就绪状态。在这种情况下,请执行第 4 步。否则,继续第 3 步。 按住鼠标上的连接按钮,直至选定数字开始快速闪烁。 将鼠标添加至计算机: 右键单击"开始"屏幕的空白处,然后选择所有程序 > 控制面板 > 设备和打印机 注意: 如果无法找到"设备和打印机",可将"控制面板"设置为"查看方式: 小图标。然后应该能够看到所有"控制面板"选项。 在"设备和打印机"窗口中,单击添加设备。 Windows 添加设备 从设备列表中选择 MX Anywhere 2,然后单击下一步。 配置连接时,将出现一个新的设备配置窗口。 安装 MX Anywhere 2 配对完成后,新的设备配置窗口将自动关闭。MX Anywhere 2 将显示在设备和打印机窗口的设备列表中。 设备和打印机 注意: 如果 MX Anywhere 2 已经配对但存在连接问题,可将其从设备列表中删除,然后按照上述说明重新进行连接。 连接至 Mac OS X 10.10 或更高版本 鼠标底部按钮 1 — 电源开关 ...

2018-04-29 · 1 min · 101 words · -

blender

blender https://www.bilibili.com/video/av7257605/?p=1 https://docs.blender.org/manual/zh-hans/dev/editors/index.html https://jingyan.baidu.com/article/0eb457e5c5d69603f1a90593.html https://jingyan.baidu.com/article/335530daeb702419cb41c3ef.html

2018-04-21 · 1 min · 5 words · -

磁盘分区对齐

磁盘分区对齐 https://linux.cn/article-3167-1.html

2018-04-20 · 1 min · 2 words · -

磁盘 IO

磁盘 IO 寻址–毫秒ms级别的。 对于磁盘来说一个完整的IO操作是这样进行的:当控制器对磁盘发出一个IO操作命令的时候,磁盘的驱动臂(Actuator Arm)带读写磁头(Head)离开着陆区(Landing Zone,位于内圈没有数据的区域),移动到要操作的初始数据块所在的磁道(Track)的正上方,这个过程被称为寻址(Seeking),对应消耗的时间被称为寻址时间(Seek Time);但是找到对应磁道还不能马上读取数据,这时候磁头要等到磁盘盘片(Platter)旋转到初始数据块所在的扇区(Sector)落在读写磁头正上方的之后才能开始读取数据,在这个等待盘片旋转到可操作扇区的过程中消耗的时间称为旋转延时(Rotational Delay);接下来就随着盘片的旋转,磁头不断的读/写相应的数据块,直到完成这次IO所需要操作的全部数据,这个过程称为数据传送(Data Transfer),对应的时间称为传送时间(Transfer Time)。完成这三个步骤之后一次IO操作也就完成了。 ———————————————— 版权声明:本文为CSDN博主「人工智」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_35789269/article/details/117536357 HDD机械磁盘的性能标准 最大IOPS的理论计算方法 IOPS = 1000 ms/ (寻道时间 + 旋转延迟)。可以忽略数据传输时间。 7200 rpm的磁盘 IOPS = 1000 / (9 + 4.17) = 76 IOPS 13ms 10000 rpm的磁盘IOPS = 1000 / (6+ 3) = 111 IOPS 9ms 15000 rpm的磁盘IOPS = 1000 / (4 + 2) = 166 IOPS 6ms 常见磁盘平均物理寻道时间为: 7200转/分的STAT硬盘平均物理寻道时间是9ms 10000转/分的STAT硬盘平均物理寻道时间是6ms 15000转/分的SAS硬盘平均物理寻道时间是4ms 常见硬盘的旋转延迟时间为: 7200 rpm的磁盘平均旋转延迟大约为601000/7200/2 = 4.17ms 10000 rpm的磁盘平均旋转延迟大约为601000/10000/2 = 3ms, 15000 rpm的磁盘其平均旋转延迟约为60*1000/15000/2 = 2ms。 ©著作权归作者所有:来自51CTO博客作者Darren_Wen的原创作品,请联系作者获取转载授权,否则将追究法律责任 HDD机械磁盘的性能标准 https://blog.51cto.com/wendashuai/2852767 ...

2018-04-20 · 1 min · 202 words · -

centos, kde, vnc

centos, kde, vnc 转自: http://digitalocean.youhuima.cc/centos-7-kde-vnc-remote.html (侵删) VPS远程操作用的最多的是SSH,有时候一些特殊需求也要用到远程图形化操作,比如使用在VPS上使用浏览器访问网站。本文以Digitalocean VPS为例分享如何安装KDE和VNC实现远程图形界面访问。如果要购买Digitalocean VPS,建议使用Digitalocean优惠码,可以节省不少银子。 下面介绍安装KDE和VNC的步骤和关键注意点: SSH登录到VPS上以root用户权限进行整个安装过程。 查询查询支持的软件包: yum grouplist 如果系统有"KDE Plasma Workspaces",说明可以安装KDE图形化界面,然后执行一键安装命令: yum groupinstall “KDE Plasma Workspaces” 直到安装完成。 安装VNC server,一键安装: 配置VNC server: 在centos 7里配置文件初始模版为: /lib/systemd/system/vncserver@.service 这个配置文件只是一个模版,是不会被调用的。需要按照如下步骤复制1份或多份并修改相应的参数来对应不同的VNC viewer客户端。下面以root用户为例。 复制一份配置文件,"@“后的1表示该配置文件对应的远程连接端口号为5901 (5900+1) : cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service 远程连接端口号默认为5900+n,n为VNC服务端设置的连接序号,上面的序号就是配置文件名称里”.service"前的1。其它的以此类推。 修改新配置文件: 将 (有两处) 改为登录用户root,VNC远程连接后将是root权限。 如果是非root用户就直接用用户名替换即可。 修改前: [Service] Type=forking -》 需要改为simple才会启动成功 Clean any existing files in /tmp/.X11-unix environment ExecStartPre=/bin/sh -c ‘/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :’ ExecStart=/sbin/runuser -l 改为root不带括号 -c “/usr/bin/vncserver %i -geometry 1024x768” ...

2018-04-19 · 2 min · 256 words · -

golang lock, sync.RWMutex, sync.Mutex, 锁

golang lock, sync.RWMutex, sync.Mutex, 锁 在 Go 语言并发编程中,倡导使用通信共享内存,不要使用共享内存通信,而这个通信的媒介就是 Channel, Channel 是线程安全的,不需要考虑数据冲突问题,面对并发问题,我们始终应该优先考虑使用Channel,它是 first class 级别的,但是纵使有主角光环加持,Channel也不是万能的,它也需要配角,这也是共享内存存在的价值,其他语言中主流的并发编程都是通过共享内存实现的,共享内存必然涉及并发过程中的共享数据冲突问题,而为了解决数据冲突问题,Go 语言沿袭了传统的并发编程解决方案 - 锁机制,这些锁都位于 sync 包中。 golang 中 sync 包提供了两种锁 Mutex (互斥锁) 和 RWMutex (读写锁), 其中 RWMutex 是基于 Mutex 实现的, 只读锁的实现使用类似引用计数器(Reference Counting)的功能. Mutex: 互斥锁 RWMutex: 读写锁 锁的作用都是为了解决并发情况下共享数据的原子操作和最终一致性问题 Mutex, 互斥锁 type Mutex struct { // contains filtered or unexported fields } func (m *Mutex) Lock() func (m *Mutex) Unlock() sync.Mutex 用于多个 goroutine 对共享资源的互斥访问。使用要点如下: Lock() 加锁,Unlock() 解锁; 对未解锁的 Mutex 使用 Lock() 会阻塞; 对未上锁的 Mutex 使用 Unlock() 会导致 panic 异常。 加锁之后未解锁, 再次加锁会导致死锁 使用 Lock() 加锁后, 便不能再次对其进行加锁, 直到用 Unlock() 解锁对其解锁后, 才能再次加锁. 适用于读写不确定场景, 即读写次数没有明显的区别, 并且只允许只有一个读或者写的场景, 所以该锁也叫做全局锁. ...

2018-04-13 · 3 min · 453 words · -