nginx http重定向到https,post数据丢失。

nginx配置http跳转https

if ($scheme = http) {
	return 301 https://$host$request_uri;
}

如果状态码返回301或者302,当post数据到http协议时,重定向后会出现请求方法变为 get,post数据丢失。

解决这个问题就要换返回的状态码。

if ($scheme = http) {
	return 307 https://$host$request_uri;
}

307、308 都可以保持post数据的重定向,包括请求方法也不会变化。
307是临时,308是永久

所以当往一个http地址发送post请求,服务器重定向到https,要配置为307或者308状态码。

阿里云ecs服务器arp映射表与实际mac地址不一致的疑问

最近在排查k8s问题的时候发现arp表中的mac地址和实际的mac地址不一致。但还能通信,这就很疑惑了。(以前也没注意过这个mac地址)
几台服务器都在在同一个可用区、同一个网络同一个安全组下。

# 服务器1
内网IP:172.19.34.91

[root@iZuf60rpsu8z9v5nzviztlZ ~]# ping 172.19.34.89 # ping 服务器2
PING 172.19.34.89 (172.19.34.89) 56(84) bytes of data.
64 bytes from 172.19.34.89: icmp_seq=1 ttl=64 time=0.208 ms

# 查看服务器1的arp

[root@iZuf60rpsu8z9v5nzviztlZ ~]# arp -e
Address                  HWtype  HWaddress           Flags Mask            Iface
172.17.0.9               ether   02:42:ac:11:00:09   C                     docker0
172.19.34.89             ether   ee:ff:ff:ff:ff:ff   C                     eth0

通过arp -e查看arp表,172.19.34.89 ip的mac地址为 ee:ff:ff:ff:ff:ff

# 服务器2

[root@iZuf60rpsu8z9v5nzviztmZ ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.34.89  netmask 255.255.240.0  broadcast 172.19.47.255
        ether 00:16:3e:0e:36:60  txqueuelen 1000  (Ethernet)
        RX packets 1248357423  bytes 321629365565 (299.5 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 794943098  bytes 186700299960 (173.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

服务器2通过ifconfig查看到的mac地址为 00:16:3e:0e:36:60

为何服务器1上arp表中服务器2的mac地址和实际的eth0网卡的mac地址不一致?

发工单后回答说:
ecs底层是虚拟化的网络,不是传统的物理网络。表项的学习是通过arp代理实现,为了避免大量ARP学习影响组件性能,所以看到的都是同一个MAC ee:ff:ff:ff:ff:ff ,是正常的现象。

同样一个问题,腾讯云回答并没有很直观的得到答案(也不知道是不是我表述有问题)。

再后来腾讯云客服回了个电话也只是说虚拟化架构的问题,并不影响使用。

zabbix报警磁盘使用率高 lsof deleted

zabbix报警磁盘使用率高 lsof deleted

zabbix提示磁盘使用率达到80%了,但是去看对应的分区,统计大小发现不对。

[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda3       17G  4.2G   13G  25% /
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.7G     0  7.7G   0% /dev/shm
tmpfs           7.7G  537M  7.2G   7% /run
tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/xvdb1       99G   79G   15G  85% /home
/dev/xvda1     1014M  131M  884M  13% /boot
tmpfs           1.6G     0  1.6G   0% /run/user/0
overlay          17G  4.2G   13G  25% /var/lib/docker/overlay2/26d1ef95672fa668f982e5d65a45d76172017d915d34cc29e1192feb1fe24724/merged
overlay          17G  4.2G   13G  25% /var/lib/docker/overlay2/1a7ac2aa8da4ccb74632f1e19ba58989b4ef90341577e95225c5ea568582a3db/merged
overlay          17G  4.2G   13G  25% /var/lib/docker/overlay2/3525382a68d07254d42c9f9c2767391785dda8bf04f8dd1f780a373cdd34ccca/merged

# 去查home大小

[root@localhost ~]# du -sh /home
9.7G	/home

实际发现才不到10G,很有可能是删除了日志文件,而不是清空文件内容。

# 通过lsof查找标记为删除状态的文件

[root@localhost tmp]# lsof | grep deleted
java        557   560              root    6w      REG              202,3       9248   17719072 /tmp/spring.log.7 (deleted)
.
.
.
省略部分

第二列是进程号

# 查出来有很多重复的,这里直接截取第10列,并根据此列去重

[root@localhost tmp]# lsof | grep deleted | awk '{print $10}' | sort -u
(deleted)
/home/jar/basic/logs/basic-service-2020-04-20.error.log
/home/jar/config/log.log
/home/jar/pay/log.log
/home/jar/product/log.log
/home/jar/product/logs/product-service1-2020-02-11.error.log
/home/jar/sign/log.log
/home/jar/sign/logs/sign-2020-02-11.error.log
/home/jar/zuul/log.log
/home/web/tomcat-ald/logs/catalina.out
/home/web/tomcat-ald/logs/host-manager.2020-02-12.log
/home/web/tomcat-ald/logs/manager.2020-02-12.log
/home/web/tomcat-report/logs/catalina.out
/home/web/tomcat-report/logs/host-manager.2020-02-18.log
/home/web/tomcat-report/logs/manager.2020-02-18.log
/tmp/spring.log.7
/var/log/rabbitmq/log/crash.log.3

这里每个日志都在对应的项目目录下,这样就能查到哪些文件被打开但标记是删除。也可以通过进程号找到对应进程。
挨个去重启相应的服务就会释放打开的文件。

k8s设置secrets自动拉取私库镜像

# 查看现有secrets

[root@node1 shop-api]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-v4cld   kubernetes.io/service-account-token   3      4h5m

# 创建一个私库secrets

[root@node1 shop-api]# kubectl create secret docker-registry harbor --docker-server=reg.xxx.com --docker-username=admin --docker-password=123 --docker-email=admin@xxx.com
secret/harbor created

# 查看创建

[root@node1 shop-api]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-v4cld   kubernetes.io/service-account-token   3      4h6m
harbor                kubernetes.io/dockerconfigjson        1      2s

# yaml中添加私库认证信息,截取部分。

spec:
  containers:
  - image: reg.xxx.com/prod/shop-api:0426
	name: java
	ports:
	- containerPort: 8080
	resources:
	  #limits:
	   #cpu: 1
	   #memory: 1024G
	  #requests:
	   #cpu: 1
	   #memory: 1024G
	command: ["java"]
	args: ["-jar","shop-api-0.0.1-SNAPSHOT.jar","--spring.profiles.active=test","--server.port=8080"]
	workingDir: /mnt
   
  # 私库认证
  imagePullSecrets:
  - name: harbor

注意imagePullSecrets和containers配置同级。
这样就会从私库自动认证并拉取镜像。

docker push到harbor私库中报unknown blob错误

本地构建好镜像推送到私库。
执行docker push到harbor私库中时报unknown blob错误

[root@node1 ~]# docker push reg.xxx.com/prod/filebeat-java:0426
The push refers to repository [reg.xxx.com/prod/filebeat-java]
e52576dc1f49: Pushing [==================================================>]  3.584kB
ffdb94571df7: Pushing [==================================================>]  372.7kB
47fc804728ff: Pushing [>                                                  ]  545.3kB/80.14MB
dab4e68f20a2: Pushing [==================================================>]  6.144kB
6435966ee18f: Pushing [==================================================>]  4.096kB
b1c057a951b8: Waiting 
df654d36e69e: Waiting 
77b174a6a187: Waiting 
unknown blob

网上搜索后说屏蔽掉nginx反向代理中添加的请求头解决
#proxy_set_header Host $host;
具体原因也没查为什么。
PS:我这里用的harbor修改过端口号,用nginx反向代理了harbor。