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

学习笔记

自建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)

阅读剩下更多

默认配图
学习笔记

mysql中几种Log和打开方法

Mysql中常见的log有:错误日志log_error慢查询日志slow_query_log二进制日志bin_log通用查询日志general_log

错误日志(error_log)

这个日志记载mysql服务器的启动和关闭以及运行过程中发生的故障或异常情况,如果你发现mysql无法正常启动,那么你首先应该查看这个日志。

配置:

1
log_error = error.log

服务器上查询log位置:show variables like 'log_error'

慢查询日志(slow_query_log)

为了改善数据库性能,需要减少慢查询SQL的使用次数,那么哪些SQL需要改善呢?通过这个日志可以更清楚如何去改善。

配置:

1
2
3
slow_query_log = 1
lone_query_time = 10
slow_query_log_file = slow_query.log

二进制查询日志(bin_log)

Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录;主要用于数据库的主从复制以及增量恢复。

配置:

1
log_bin = mysql_bin.log

通用查询日志(general_log)

会记录mysql运行期间的所有sql语句

配置:

1
2
3
log_output=[none|file|table|file,table]  #通用查询日志输出格式
general_log=[on|off] #是否启用通用查询日志
general_log_file[=filename] #通用查询日志位置及名字

阅读剩下更多

默认配图
学习笔记

skip-name-resolve可以解决远程连接mysql数据库时候的缓慢或超时

  咳咳,迁了新的机器,全新的机器但是环境还是跟以前一样,基本没变过什么配置。但是远程连接mysql却很慢,甚至10s超时都还没连上!!! 当然,仅仅只是建立连接的时候,连接成功后一切操作都行如流水。

  所以最快最简单的方法就是直接在数据库的配置文件my.cnf|my.ini中添加一行skip-name-resolve来解决。

  其实mysql在用户登录建立连接的时候,会对客户端进行DNS反查,如果遇到服务器的DNS解析出现问题,那么就可能导致客户端迟迟连接不上。此方法可禁止mysql进行DNS反查从而解决了这个问题。

阅读剩下更多

默认配图
学习笔记

Laravel5.5 发送邮件遇到Connection could not be established with host xxxxx

Laravel输出的错误页面如下图:
Laravel异常捕获-mail

服务器:阿里云香港节点(B区) CentOS6.8 64bit

lamp环境:PHP7.2.1

Laravel .env mail部分:

1
2
3
4
5
6
7
8
MAIL_DRIVER=smtp
MAIL_HOST=hwsmtp.exmail.qq.com
MAIL_PORT=465
MAIL_USERNAME=noreply@0x4f5da2.cn
MAIL_PASSWORD=XXXXXXXX
MAIL_FROM_ADDRESS=noreply@0x4f5da2.cn
MAIL_FROM_NAME=noreply
MAIL_ENCRYPTION=ssl

问题发生前景:本地测试完全正常,相同配置在服务器上就被抛出异常。

因为之前遇到过由于端口没有放行而造成无法建立连接的问题,在此问题上我也做了一样的尝试,在安全组配置里面对465端口进行放行(无论是出口还是入口)。但是结果表示并不是这个问题,而我在没有配置放行的情况下,telnet host:port 是通的。

经过大约两天的间接性排查和尝试,最终提交工单咨询阿里,他们给了我处理意见:尝试他们的Demo!

尝试阿里云提供的Demo测试发件是没有问题的,这就令我很纳闷的,于是我去看该Demo是如何建立连接的。

通过一步一步的探索,发现该Demo也是同样使用了stream_socket_client方法来建立连接,那为什么它可以,Laravel内的却不行?说明不是该环境的问题!

问题逐渐定位到了stream_socket_client这个方法上,查询PHP.NET来认识一下它。

1
resource stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context ]]]]] )

方法描述上,只有一个参数可能会不一样,就是最后那个$context,它是一个Resource,由stream_conntext_create方法创建并返回。

我注意到Laravel中使用的Swift_Mailer所引用的StreamBuffer类中,在stream_socket_client方法前面加上了@符号来屏蔽error,而在下面自己判断来抛出异常。

那么我果断将@符号去掉! 真正的错误爆出来了!!!!

1
2
stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

乍眼一看,证书校验失败????

上面的废话只是简单描述我遇到这个问题是如何应对的

解决方案来了! 既然是走SSL协议(465端口),且程序抛出错误为证书校验失败,那么就去直接搜索有关Laravel/SwitEmailer的证书校验问题。

在stackOverflow上找到两个相关的问题:

  1. localhost and “stream_socket_enable_crypto(): SSL operation failed with code 1”
  2. how to fix stream_socket_enable_crypto(): SSL operation failed with code 1

他们都提出了一个配置:

1
2
3
4
5
6
7
8
9
//	在/config/mail.php中增加

'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],

然后测试,Bingo!!!

当然,既然是SSL必然使用校验才是最安全的,但是我这里仅满足能够发件即可,至于如何进行证书校验,请移步:使用PHPMailer 中的报错解决 “Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:”

阅读剩下更多

默认配图
返回顶部