nginx 升级后访问400 BAD REQUEST增多的问题

一些旧设备访问nginx的时候可能会出现400 bad request, 这个跟2020.2月nginx移除了一个兼容特性有关

Disabled duplicate “Host” headers (ticket #1724). Duplicate “Host” headers were allowed in nginx 0.7.0 (revision b9de93d804ea) as a workaround for some broken Motorola phones which used to generate requests with two “Host” headers[1]. It is believed that this workaround is no longer relevant.

新增的这块代码如下: 会判断是否有重复的host 头, 而在之前的版本是认为可以容忍的

这个兼容特性被移除后, 会导致一些旧版本的移动设备响应异常

而我们线上测试机器主要是兼容了spdy协议, 也出现了400 BAD REQUEST, 这个跟spdy代码里边本身进行了一遍header处理有关:

可以参考:

https://hg.nginx.org/nginx/rev/4f18393a1d51

http://mailman.nginx.org/pipermail/nginx-devel/2020-February/012999.html

iPhone监听移动数据

1.使用USB数据线连接iPhone和Mac

2.打开iTunes,查看UDID编号

3.建立RVI接口,打开终端,输入命令行:

rvictls -s

成功建立了RVI接口后,会输出:[Starting device 你的UDID [SUCCEEDED] with interface rvi0]

rvi0既是新建的接口。

4.查询接口,输入命令行:

ifconfig -l

会发现新增了一个rvi0的链接。

5.开始进行抓包,可以使用tcpdump命令或者其他专业的抓包工具进行抓包,本文使用Wireshark进行抓包。

打开Wireshark以后,在Start下新增了一个rvi0的链接,选择它,然后点击Start开始抓包。

参考文章: https://zhuanlan.zhihu.com/p/23823231

特别感谢: 纪总

编译chromium的一些记录

这两个命令用来编译release版本的二进制文件

gn gen out/release –args=”is_component_build=false is_debug=false”

ninja -C out/release nginx-1.18.0_ipdb

默认系统头文件和依赖库

build/linux/debian_sid_amd64-sysroot 这个目录相当于根目录, usr/lib和usr/include 分别放了依赖库和头文件

chromium移除了这两个文件,不知道为何, 会导致nginx 编译失败,目前解决办法是从旧版本拷贝过去

build/linux/debian_sid_amd64-sysroot/usr/lib/x86_64-linux-gnu/libcrypt.so

build/linux/debian_sid_amd64-sysroot/usr/include/crypt.h

修改编译参数

build/config/compiler/BUILD.gn, 比如nginx 可能需要把这个特性关掉

if (!is_nacl && !use_libfuzzer) {
#cflags += [ “-Wunreachable-code” ]
}

编译方式

executable(“fssnginx-1.18.0_ipdb”) {
sources = [
“/root/fssnginx/nginx-1.18.0/objs/ngx_modules.c”,
“/root/fssnginx/nginx-1.18.0/src/core/nginx.c”,

….

]

include_dirs = [
“/root/fssnginx/nginx-1.18.0/src/core”,
“/root/fssnginx/nginx-1.18.0/src/event”,
“/root/fssnginx/nginx-1.18.0/src/event/modules”,
“/root/fssnginx/nginx-1.18.0/src/os/unix”,
“/root/fssnginx/nginx-1.18.0/nginx_upstream_check_module-master”,
“/root/fssnginx/nginx-1.18.0/ngx_devel_kit-0.3.0/objs”,
“/root/fssnginx/nginx-1.18.0/objs/addon/ndk”,
“/root/fssnginx/nginx-1.18.0/lua-nginx-module-0.10.13/src/api”,
“/root/fssnginx/nginx-1.18.0/pcre-8.42”,
“/root/fssnginx/nginx-1.18.0/zlib-1.2.11”,
“/root/fssnginx/nginx-1.18.0/objs”,
“/root/fssnginx/nginx-1.18.0/src/http”,
“/root/fssnginx/nginx-1.18.0/src/http/modules”,
“/root/fssnginx/nginx-1.18.0/src/http/v2”,
“/root/fssnginx/nginx-1.18.0/src/http”,
“/root/fssnginx/nginx-1.18.0/ngx_devel_kit-0.3.0/src”,
“/root/fssnginx/nginx-1.18.0/ngx_devel_kit-0.3.0/src”,
“/root/fssnginx/nginx-1.18.0/ngx_devel_kit-0.3.0/objs”,
“/root/fssnginx/nginx-1.18.0/objs/addon/ndk”,
“/root/fssnginx/nginx-1.18.0/luajit/include/luajit-2.0”,
“/root/fssnginx/nginx-1.18.0/quic_module/chromium”,
]
deps = [
“:epoll_quic_tools”,
“:epoll_server”,
“:net”,
“:simple_quic_tools”,
“//base”,
“//third_party/boringssl”,
]
lib_dirs = [
“/root/fssnginx/nginx-1.18.0/json-c/lib”,
“/root/fssnginx/nginx-1.18.0/luajit/lib”,
]
libs = [
“/root/fssnginx/nginx-1.18.0/pcre-8.42/.libs/libpcre.a”,
“/root/fssnginx/nginx-1.18.0/zlib-1.2.11/libz.a”,
“luajit-5.1”,
“json-c”,
“crypt”,
]
cflags_c = [
“-D_FORTIFY_SOURCE=2”,
“-DTCP_FASTOPEN=23”,
“-DNDK_SET_VAR”,
]
}

chromium指定tags 版本下载

线上有个业务需要使用到指定版本的chromium源代码, 这里记录下

一、安装 depot_tools 项目构建工具

  1. 克隆 depot_tools git仓库
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

  1. 添加环境变量
$ export PATH="$PATH:/path/to/depot_tools"

Tip: /path/to/depot_tools, 为你 depot_tools 本地的路径

二、使用 depot_tools 下载源码

  1. 创建一个用于存在 chromium 的目录 (您可以任意命令,并存放在任何您喜欢的位置,只要是路径路径并且没有空格即可)
$ mkdir chromium && cd chromium

  1. 使用 depot_tools 的 fetch 命令,来检查代码及其依赖关系。
$ fetch  chromium
//Don't use fetch --no-history chromium, 我们需要切换到历史版本

Tip: –no-history: 代表不需要历史记录, 完整仓库大约40G 源码大小大概 8G 左右,下载时间因网速而议,请耐心等待

三、切换到指定的tags

# Make sure you are in 'src'.
# This part should only need to be done once, but it won't hurt to repeat it. The first
# time checking out branches and tags might take a while because it fetches an extra
# 1/2 GB or so of branch commits. 
gclient sync --with_branch_heads --with_tags

# You may have to explicitly 'git fetch origin' to pull branch-heads/
git fetch

# Checkout the branch 'src' tree.
git checkout -b branch_$BRANCH tags/$BRANCH

# Checkout all the submodules at their branch DEPS revisions.
gclient sync --with_branch_heads --with_tags

到这一步做完就可以校验下了

$cat chrome/VERSION

参考文档:

https://www.chromium.org/developers/how-tos/get-the-code/working-with-release-branches

https://github.com/aidevjoe/ChromiumBuild

macbook air 2020休眠掉电的问题

新的 air 一直都是合盖接显示器使用的, 最近发现第二天回来经常都是80%电量了

怀疑是休眠中途被唤醒了,于是查下日志

log  show|grep -i "wake reason"

结果发现都是正常的休眠和唤醒记录, 推测跟休眠模式有关

首先检查下休眠参数 pmset -g 查看下hibernatemode

10.15版本下分为3个模式, 0(不休眠), 3(混合),25(深度), 默认为3

如果接受唤醒等个5秒的样子可以选择深度睡眠, 我外接显示器唤醒会有点问题, 没采用

sudo pmset -a hibernatemode 25

关闭tcpkeepalive, 后台其实会一直在跑一些网络的东西

sudo pmset -b tcpkeepalive 0

另外, 如果有蓝牙鼠标设备, 也可以在系统设置中关闭这个唤醒功能

nginx 生成coredump的办法

网上很多说nginx生成coredump的办法在RHEL7 RHEL8都无法正确的生成core 文件, 这里给一下正确的步骤

#新建一个文件夹, 并确认nginx可以读写
$ mkdir /opt/itc/fssnginx/logs/cores/
$ sudo chown root:root /opt/itc/fssnginx/logs/cores/
$ sudo chmod 1777 /opt/itc/fssnginx/logs/cores/

#设置unlimited core file dump
$ ulimit -c unlimited
#也可以在系统中彻底修改
$vim /etc/security/limits.conf
* soft core unlimited

#设置系统级别的core file
$ echo "/opt/itc/fssnginx/logs/cores/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern

#允许suid dumpable
$ sudo sysctl -w fs.suid_dumpable=2

$ sysctl -p


#重启nginx
systemctl restart nginx
#编译nginx.conf,然后重启nginx 服务
working_directory  /opt/itc/fssnginx/logs/cores/;
worker_rlimit_core 500M;

测试,找到nginx workprocess的进程号,发送 SIGSEGV  给该work process进程

$ps aux|grep nginx
$kill -11 `$work_process_pid`
#检查core 文件
$ll /opt/itc/fssnginx/logs/cores/
-rw-------. 1 nobody nobody 65753088 Jun 22 17:54 core.nginx.5662
-rw-------. 1 nobody nobody 70475776 Jun 22 18:03 core.nginx.5702

释疑: 看起来跟内核变量有关

#旧版本RHEL6是这个设置:

kernel.core_pattern = core

#新版本OS 是这个: 会被通过管道发给这个可执行命令

kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e

参考文档:

https://docs.nginx.com/nginx/admin-guide/monitoring/debugging/

macbook air 2020 i3 8g 256g 使用体验

手上这台是苹果2020款macbook air, 配置是i3 + 8G内存 + 256G磁盘, 俗称乞丐版

得益于intel 第十代的技术改善, i3也拥有了双核4线程, 不过这一代的CPU功耗比上一代高了一倍, i3 i5 i7的cpu分别为9-10W

一般日常负载下48-60度之间, 风扇一般都是不转的

从活动监视器看,8G内存只能说够用, 我开了outlook 微信 QQ 几个chrome窗口和 1-2个工具软件的结果

这款机器最大的问题在于散热, 因为这几代的macbook air,机器风扇都是没有连接到CPU的.

而从实际使用看, 只要不开视频会议,比如zoom,webtrc之类的话, 这个cpu还是可以的,建议视频会议的时候使用Turbo Boost Switcher 关闭频睿

2022年的时候, 实在忍受不了散热, 决心改造:

https://www.4os.org/2022/04/07/%e4%bd%bf%e7%94%a8%e5%88%a9%e6%b0%91%e6%95%a3%e7%83%ad%e7%a1%85%e8%83%b6%e5%9e%ab-%e6%94%b9%e9%80%a0-macbook-air-2020-%e6%95%a3%e7%83%ad/

mysql float类型 大数值的精确问题

先说结论, 默认的单精度float 类型,如果没有指定超过24的精度(超过24就是double类型了),那么它的数据位数精度是2^24, 它包含小数点后边的整体有效数字不能超过16777216,不管小数点在哪个位置

比如1.2345678 123.45678 1234.5678 1234567.8 都可以精确表达(如果你设置的float(M,D)精确符合你的数字的话, 不然会被截断或者近似的表示)

当数值超过16777216,比如123456789则会出现各种奇怪的现象(尾数会不精确)

===========================================================

从官方文档可以知道, float使用4 byte 来实现,8 * 4 = 32位

根据IEEE754标准, float 会使用科学计数法, 而底数部分 有24位来存储(其中最高位1被隐含了)

https://www.zhihu.com/question/21711083

以下是相关的追踪过程:

最近发现float存在精确性的问题,比如我insert 一个比较大数据值进去

出来的结果和预期会有精确性的差异, 搜了下文档有提到:

对于单精度浮点数Float:  当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成double或者decimal,两者的差别是double是浮点计算,decimal是定点计算,会得到更精确的数据。

来自 https://www.cnblogs.com/shamo89/p/8202837.html

另外有文档提到,float的整数部分不能超过7位,超过7位后则是不精确的结果,原因暂时未知

不能超过7位数的, 这个说法其实也是基于2^24 = 16777216(8位数)的一个经验性的判断说法而已

https://segmentfault.com/a/1190000016476936

而官方文档并没有特别详细的介绍这一点https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html

macbook air 2020 CPU对比

苹果在3月份的时候静悄悄的发布了macbook air 2020款,引入了第十代的intel CPU

可以选配 i3 i5 甚至是 i7, 相对于旧款只有i5 多了不少选择,不过这几款CPU 都是9-10w的超低功耗版本, 跟普通的第十代CPU 有很大的区别

这三款cpu 分别是 i3-1000NG4 i5-1030NG7 i7-1060NG7, 属于intel 第十代产品,发布于2020年第二季度, 10nm工艺

来看看最大的区别, 其中i3仅为双核,支持HT到4线程, 而i5 和 i7 都是原生4核支持8线程

其中i3的基础频率是1.10GHz, 支持turbo到3.2Ghz, 缓存为4M,功耗9W

i5 基础频率跟 i3一样, 支持 turbo到3.5Ghz, 缓存为6M,功耗10w

i7基础频率为1.2Ghz, 支持Turbo 到3.8Ghz, 缓存为8M,功耗10w

显卡方面, 能看到显卡基础频率都是300Mhz, 都支持4K分辨率

其中i3智能动态加速到900MHz, 而i5 和 i7可以分别加速到1.05GHz和1.10GHz

除此之外, 三款CPU 就没有太大的区别了, 一样的温度墙: 100摄氏度, 一样的最大32G的内存支持, 一样的内存频率和双通道支持等

那么,问题来了, 建议买哪款呢?

如果特别差钱, 当然是买i3, 穷就是最理直气壮的理由

个人建议买i5, 只需要+500块钱, 换来了多出来的双核4线程, CPU频率和显卡都有一定的提升

如果特别有钱, 建议i7么? 不建议, 因为这是10W的超低功耗的CPU, 而且CPU 散热只靠散热片且没有热管和风扇相连接, 特别有钱的,买macbook pro 去

参考:

https://ark.intel.com/content/www/us/en/ark/compare.html?productIds=196586,196589,196596