`学习笔记`分类下的文章

学习笔记

kubernetes nginx ingress custom 401/500 page

在k8s中,通常会使用ingress的方式将内部服务进行暴露,与此同时会加上鉴权的功能,如:Basic Auth、Oauth2和JWT等等。

使用方法

在Ingress资源的metadata的annotations中增加nginx.ingress.kubernetes.io/auth-url来指定鉴权的地址。如:nginx.ingress.kubernetes.io/auth-url: http://10.11.0.123:8081/api-auth

这样一来,我们在编写/api-auth这个接口的时候,可以根据请求头拿到客户端的认证信息,进而判断是否对其请求进行放行,返回状态码为200即为放行,nginx会将客户端的请求转发到对应的后端服务;返回状态码为401即表示没有授权,nginx直接对其拦截,并返回给客户端默认的响应。

响应Header头:

1
2
3
4
HTTP/2 401
date: Mon,21 Feb 2022 06:42:41 GMT
content-type: text/html
content-length: 574

响应Body体:

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->

但是客户端仅知道请求是因为授权问题被拒绝了,但是不知道具体的原因,如果需要得知具体的拒绝原因,可以按照如下方法进行优化。

优化方法

因为nginx中没有直接获取upsream返回结果的方法(可通过重新编译,用Lua实现),但是可获取到响应头,所以我们利用响应头来返回拒绝的原因。

首先,在/api-auth中,增加一个响应头my_auth_error,内容可以直接填写您需要返回给客户端的原因,我这里会填入一个json串的Base64编码值。

然后我们回到nginx-ingress的配置文件,增加两个声明:nginx.ingress.kubernetes.io/configuration-snippetnginx.ingress.kubernetes.io/server-snippet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
metadata:
# 此处省略N个字
annotations:
nginx.ingress.kubernetes.io/auth-url: http://10.11.0.123:8081/api-auth
nginx.ingress.kubernetes.io/configuration-snippet: |
error_page 401 = @ingress_service_custom_error_401;

auth_request_set $my_auth_error $upstream_http_wwd_auth_error;
auth_request_set $my_auth_error_content_type $upstream_http_content_type;
auth_request_set $my_auth_status $upstream_status;
nginx.ingress.kubernetes.io/server-snippet: |
location @ingress_service_custom_error_401 {
internal;

# Decode auth response header
set_decode_base64 $my_auth_error_decoded $my_auth_error;

# Return the error from auth service if any
if ($my_auth_error_decoded != ""){
add_header Content-Type $my_auth_error_content_type always;
return 401 $my_auth_error_decoded;
}

# Fall back to default nginx response
return 401;
}
# 此处省略N个字

配置解释

configuration-snippet用来对location进行自定义配置,上面对401的错误页面定义了一个@ingress_service_custom_error_401,然后增加了3个变量my_auth_errormy_auth_error_content_typemy_auth_status分别取值自定义响应头、响应类型和响应状态码。

server-snippet用来对server块进行自定义配置,上面相当于在server块增加了一个location,该location即为401时的默认响应,其中会对my_auth_error进行base64解码,然后判断解码内容,若其内容为空,则直接返回最初的默认401页面,否则在响应头中增加Content-Type为具体的自定义类型,并返回401状态码和自定义响应Body。

如此一来,就可以实现nginx-ingress根据auth接口响应的结果来执行不同的行为。最终实现不同的效果。

响应头:

1
2
3
4
5
HTTP/2 401
date: Mon, 21 Feb 2022 07:14:36 GMT
content-type: text/html
content-length: 51
content-type: application/json

响应Body体:

1
2
3
4
5
{
"message": "用户未登录",
"code": 14,
"data": null
}

参考资料

Custom response for Ingress-Nginx External Authentication

阅读剩下更多

默认配图
学习笔记

记一次使用CGo的Golang项目交叉编译遇到的问题及解决步骤

本篇文章对我在交叉编译EasyDarwin项目到Arrch64架构的Linux上做了简单的记录和总结,总体上遇到的问题分为那么几类: 1. 项目依赖库的缺失和更新 2. syscall.Dup2方法不存在 3. CGO的交叉编译支持 4. 执行二进制文件却提示:No such file or directory

阅读剩下更多

记一次使用CGo的Golang项目交叉编译遇到的问题及解决步骤
学习笔记

利用FFmpeg处理鱼眼视频分成4个方向的视野画面

介绍

首先,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它的功能强大,这里就不多做阐述了。

本次实验主要是为了学习FFmpeg的Filter功能,它提供了很多音视频的特效处理,比如:视频的缩放、翻转、叠加等等。常用的Filter有:

  • Scale:画面的缩放
  • Overlay:画面的叠加
  • Crop:画面的裁剪
  • More:查看更多

我们可以通过命令查看全部Filter的简介:

1
ffmpeg -filters

实验

原始材料

我们手里现在有一段鱼眼镜头录制的视频源文件,命名:original.mp4。我们先来看看它长什么样子:

out

尝试球形转方形

这一步,我暂时还没找到一个很好的方法把其展平成一个广角镜头全景的画面,但是我使用v360这个filter通过不断修改参数,得到了一个比较满意的部分画面的方形画面。

该Filter的基本参数格式如下:

1
v360=input:output:format_1:arg_name=value

其中inputoutput分别是原始投影格式和目标投影格式,这里我们是从鱼眼视频转换为常规视频,所以要填入的参数为:

1
v360=input=fisheye:output=flat # 都有哪些投影格式,可以通过ffmpeg -h filter=v360获取查看

format_1是指具体要设置的格式,这里我并没有用到。arg_namevalue指具体的参数项和值。

我的使用例子:

1
v360=input=fisheye:output=flat:ih_fov=180:iv_fov=180:h_fov=90:v_fov=60:w=720:h=360:pitch=45

解释一下,其中ih_foviv_fov分别表示设置的输入横向视野范围和输入纵向视野范围,我这里都设置为180度;h_fovv_fov分别表示设置的输出横向视野范围和输出纵向视野范围,我这里设置横向90度,纵向60度。然后还设置了输出画面的宽高为720x360,俯仰旋转角(pitch)为45度。

我的个人理解(个人瞎猜),就如同人眼可接受光的范围,理论上横向和纵向都能够覆盖180度的范围,但是我们在眼球不转动的情况下,有效的水平视野大概是90度,纵向视野60度。因为这个是我具体调参的出来的个人觉得比较好的参数条件,所以不具有权威性!哈哈!

那么现在能输出一个什么样的画面呢?

up

Nice!这就已经很像一个普通摄像头的画面了。那么如何得到其它几个方向的画面呢?前面我们有提到,FFmpeg可以使画面旋转!如果我先将原始画面旋转一下,让其它几个方向的画面都转到上面,然后转换画面不就行了吗?

画面旋转

FFmpeg有个Filter叫做transpose。它可以非常简单的完成画面的旋转或翻转:

阅读剩下更多

利用FFmpeg处理鱼眼视频分成4个方向的视野画面
学习笔记

自建CA服务器学习笔记

​ 我人生中的第一次遇到证书问题并加以解决,还是在大约3年前,那时还专门写了一篇文章《解决Chrome更新到63后.dev/.app后缀域名强制HTTPS的问题》。当时是因为本地开发环境一直都是用的.dev后缀结尾的域名,一直都是以http://www.test.dev的方式进行本地web开发。那天浏览器突然提示访问不安全的网站,此处黑人问号?? Chrome强制.dev后缀的域名都得走https,无奈之下,不想更换后缀的我走上了自签发https证书的道路,但当时直接使用了开源工具,并没有深入研究。

​ 日月如梭,今时今日的我已经不再是那个年少的小孩!日常工作中免不了与SSL/TLS这玩意儿打交道,除了访问web用https外,只要与建立加密连接有关的统统都少不了证书和秘钥。这次需要自建CA服务器并签发下级证书以达到加密访问的目的,那么这次的笔记将会成为以后温习的主要文献了。(哈哈哈)

阅读剩下更多

默认配图
学习笔记

ESP-Touch智能配网是如何实现的

写在前面

近年来物联网发展迅速,目前依旧是比较热门的领域,现今世界处处都是物联网,可谓无处不物联(哈哈,扯远了!)。我接触物联网这块比较晚,去年才开始入门,最早的实战项目就是将传感器上云,借助腾讯的物联网通信平台,我可以对传感器进行远程控制以及读取传感器采集到的数据。当然,这些都离不开网络(Internet)。设备上云的首要前提就是接入互联网,而接入互联网的方式有很多种(如:有线网络、无线WiFi、NB-IoT、移动蜂窝2G/3G/4G等),不同场景下自然有各自合适的网络接入方式。

我们现在生活中的很多智能家电都是通过WiFi接入的,不用我说大家也能举很多例子(像小米智能家居有小爱同学、空气净化器、电视、冰箱、洗衣机等blablabla~),这些设备刚到手的时候你一般都需要按照指导说明去下载个APP,然后绑定设备给设备配网,给设备配网可不像给手机连上WiFi那么容易,毕竟你买的小爱同学不能接鼠标键盘,也没有操作系统给你用。那么配网是如何完成的呢?

快速配网的两种途径:

  1. SoftAP配网
  2. SmartConfig配网

第一种很好理解,就类似给自己家里的路由器配置网络,你首先通过WiFi或者网线连接你家路由器,然后进入http://192.168.xxx.xxx进行Web可视化配置,也有一些小型单片机,自己搭载了一个WiFi模组以AP模式运行,你通过指定的APP就可以与其建立通信并发送配置信息过去。但是这种配网方式比较繁琐,用户体验较差。

第二种就比较高级了,你只需要打开设备的配网开关,并在你的手机上连接即将给设备配置的WiFi网络,然后在App或者小程序上输入对应的密码并点击开始,设备能够在很短的时间内(大约7~30s)就可以完成网络的配置。

这篇文章我将以我自己的学习成果来讲述SmartConfig配网的整个过程

阅读剩下更多

ESP-Touch智能配网是如何实现的
学习笔记

利用Dockerfile创建PHP7.3环境镜像

关于Docker以及Dockerfile

Docker容器就不详细介绍了,把它理解成类似“虚拟机”的一种介质吧。至于如何创建一个镜像,主要有两种方法:1. 从现有的镜像基础上,创建容器并自定义后Commit成镜像;2. 利用Dockerfile,根据自己的需要,如同写shell脚本一般,将自己需要搭建的容器环境所需的指令一条一条的汇集成指令集,然后让Docker根据Dockerfile来自动创建你想要的镜像

创建自己的PHP7.3镜像

下载PHP源码:https://www.php.net/downloads.php

我这里下载了php-7.3.6.tar.bz2

阅读剩下更多

默认配图
学习笔记

Go-Server/Client以及PHP-Client之间的GRPC初次尝试

写这篇笔记的目的

为了应对后续开发生涯中可能遇到的种种情况以及分布式计算的趋势(讲白了就是后续对工作会很有帮助)。如若总是依赖http-api/restful编写并提供外部调用接口,当接口数量不断上升,文档内容不断增加,这给设计者和使用者都带来非常不好的体验,而RPC在这体就现出了非常大的优势。我将自己的理解和体会以及学习的过程记录在这里,以便今后遇到问题能够从这儿获得些许的线索以及提供一个参考给同道中人。

前提

不妨思考这样一个情形:作为接口设计者,我早已经定义好的接口的请求方式(RESTFul)和返回结构(json),但是每个接口我还需要另外维护一个文档来说明各个接口的用法(请求参数)和解释返回的结果(字段描述)。而对于接口的调用者而言,不但要去文档中查找自己需要的接口并阅读说明,在实际调用中,还要以防接口提供者返回非既定结构的结果而导致的报错。

阅读剩下更多

默认配图
学习笔记

判断IP地址是否内网IP

当你的服务同时开放于公网和内网,子服务却仅允许内网访问,那么则会涉及到IP白名单的功能。但是如果名单太多或者服务进行了迁移,那么维护起来会相当的麻烦,最简单的就是判断访问的来源IP是否内网IP地址,从而直接屏蔽掉公网IP。

首先,我们认识了3类私有地址:

A类:10.0.0.0-10.255.255.255

B类:172.16.0.0-172.31.255.255

C类:192.168.0.0-192.168.255.255

还有一个本机地址:127.0.0.1

他们就是我们平时所谓的内网IP地址。

方法一: PHP自带函数

阅读剩下更多

默认配图
学习笔记

更新升级MacOSX到10.14 Mojave (MacBook Air 13-inch early 2014)

写在前面的话:

如果不是真的很需要,其实最好是不去更新系统,以免带来更多的麻烦。如果新的系统对你真的很重要,我也建议你备份现有数据,然后全新安装新的系统版本。我就是那个单纯的升级系统,导致原有的软件无法正常运行的傻逼,下面虽然记录了我的问题,但我最终的解决方案还是把软件卸载后重新安装和配置。

既然App Store推送了本次更新,我也就傻傻的更新了,谁知道会发生什么呢?

阅读剩下更多

默认配图
学习笔记

Linux下的安装Ngrok服务器的故事

使用场景

公司A是一家服务提供商,公司B是一家知名企业。
现在公司B中的一个软件服务出现了故障,需要公司A的专业人员来排查。由于两家公司相隔甚远,他们采用了远程排查方案。但是公司B的这个软件部署在内网环境的机器C上,层层网关以及种种原因(和谐部分)导致无法将机器C映射到公司B的公网端口。为了解决这种需要打通从一个局域网到另外一个局域网的网络通路,我们叫它‘内网穿透’。

总所周知,处在同一个局域网的所有机器是可以互通的,而不同局域网中的机器是无法跨域访问的。解决这种问题,我能想到的有:

  1. 交换机和路由
  2. 使用公网VPN服务器
  3. 使用内网穿透服务器

配置交换机和路由往往非常复杂,遇到复杂的组网环境,还是杀了我吧!

公网VPN服务器我也试过了,使用简单,但是稳定性得不到保证。

所以我最终尝试了内网穿透服务器:Ngrok。(当然还有别的比如:frp)

阅读剩下更多

默认配图
返回顶部