费曼学习法

费曼学习法

费曼,全名理查德·费曼,美国著名物理学家,于1965年获得诺贝尔物理奖。在沉迷于美妙的物理世界的同时,他还热衷于教育事业,喜欢向人们深入浅出的讲解艰深的物理知识。在他的自传里,他提到曾纠结于某篇艰深的研究论文。他的办法是,仔细审阅这篇论文的辅助材料(supporting material),直到他掌握了相关的知识基础、足以理解其中的艰深想法为止。费曼技巧,亦同此理。对付一个知识枝节繁杂如发丝、富有内涵的想法,应该分而化之,切成小知识块,再逐个对付,你最终能填补所有的知识缺口,否则,这些缺口将阻挠你理解这个想法。

拿出一张白纸和你所要理解的一本书,然后翻开书本,开始阅读你所要理解的内容,在把所要理解的内容阅读完之后,把你所要理解的知识点概括性的写在你所准备好的白纸上,最后是关键性的观点信息以及过程信息。

现在你已经明确了你所要理解的观点,接下来就是对你所要理解的观点进行深度拓展,纵向拓展以及横向拓展,这听起来很抽象,不过实践起来确实相当的容易并且具有很强的可执行性,接下来,进入一种无意识的状态,任凭你的手在纸张上写字,来理解你的观点,记住,必须是无意识的状态。在这种状态下你的潜意识会被激发出来,你的潜能会充分的被释放到纸张上,因为一个人97%的潜能一生存在于潜意识中无法被开发和利用!

如何进入无意识的状态,现在把你的眼睛凝视在你所写下的观点上的一个字,就这样,不要在意其他事物,心里默念着你所要理解的这个观点,之后你会发现你的视线开始逐渐的模糊,很多观点跳入你的大脑,这个时候你要抓紧时机把这些跳入你大脑的关键全部给复述到这一张纸上,记住,动作要快否则这种感觉很快就会消失了,在你的感觉消失之前写下你所预见的全部信息,还记得我说过是让你速度得读完材料的目的就在于此,由于你读的很快,大部分内容都还没有被你的主观意识所熟知,而主观意识是容易遗忘的,我所强调的是让你的潜意识熟知文本的内容,这样的记忆是尤为深刻的,你也可以参照一下东尼博赞的《启动大脑》,里面详细讲述了快速阅读的方法,而笔记流则是斯科特杨的方法,我把这两者做个有机的融合并且运用到了学习当中。以上讲的太笼统,接下来是这种方法的提纲总结:

费曼技巧,也可以称为四部学习法:

  • 第一步 - 选择一个你想要理解的概念

    选择一个你想要理解的概念, 然后拿出一张白纸, 把这个概念写在白纸的最上边.

  • 第二步 - 设想一种场景,你正要向别人传授这个概念

    在白纸上写下你对这个概念的解释, 就好像你正在教导一位新接触这个概念的学生一样. 当你这样做的时候, 你会更清楚地意识到关于这个概念你理解了多少, 以及是否还存在理解不清的地方.

  • 第三步 - 如果你感觉卡壳了, 就回顾一下学习资料

    无论何时你感觉卡壳了, 都要回到原始的学习资料并重新学习让你感到卡壳的那部分, 直到你领会得足够顺畅, 顺畅到可以在纸上解释这个部分为止.

  • 第四步 - 为了让你的讲解通俗易懂,简化语言表达

    最终的目的, 是用你自己的语言, 而不是学习资料中的语言来解释概念. 如果你的解释很冗长或者令人迷惑, 那就说明你对概念的理解可能并没有你自己想象得那么顺畅 – 你要努力简化语言表达, 或者与已有的知识建立一种类比关系, 以便更好地理解它。

参考

https请求过程

HTTP与HTTPS的不同点

  • 1、HTTPS需要用到CA申请证书。
  • 2、HTTP是超文本传输协议,信息是明文的;HTTPS则是具有安全性的SSL加密传输协议。
  • 3、HTTPS和HTTP使用的是完全不同的连接方式,用的端口也不一样,HTTP是80,HTTPS是443。
  • 4、HTTP的连接很简单,是无状态的,HTTPS是HTTP+SSL协议构建的,可进行加密传输、身份认证的网络协议,比HTTP协议安全。

HTTPS的优势

  • 1、内容加密,建立一个信息的安全通道,来保证数据传输过程的安全性。
  • 2、身份认证,确认网站的真是性。
  • 3、数据完整性,防止内容被第三方冒充或者篡改。

HTTPS请求过程

HTTPS协议的本质就是HTTP + SSL(or TLS)。在HTTP报文进入TCP报文之前,先使用SSL对HTTP报文进行加密。从网络的层级结构看它位于HTTP协议与TCP协议之间。

1
2
SSL(Secure Sokcet Layer,安全套接字层)
TLS(Transport Layer Security,传输层安全协议)

HTTPS在传输数据之前需要客户端与服务器进行一个握手(TLS/SSL握手),在握手过程中将确立双方加密传输数据的密码信息。

1、浏览器发起往服务器的 443 端口发起请求,请求携带了浏览器支持的加密算法和哈希算法。
2、服务器收到请求,选择浏览器支持的加密算法和哈希算法。
3、服务器下将数字证书返回给浏览器,这里的数字证书可以是向某个可靠机构申请的,也可以是自制的。
    (注释:证书包括以下这些内容:1. 证书序列号。2. 证书过期时间。3. 站点组织名。4. 站点DNS主机名。5. 站点公钥。6. 证书颁发者名。7. 证书签名。因为证书是要给大家用的,所以不需要加密传输)
4、浏览器进入数字证书认证环节,这一部分是浏览器内置的 TSL 完成的:
    4.1 首先浏览器会从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥。
    4.2 用机构的证书公钥解密得到证书的内容和证书签名,内容包括网站的网址、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性(验证过程类似上面 Bob 和 Susan 的通信)。
    签名通过后,浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。
    4.3 浏览器生成一个随机数 R,并使用网站公钥对 R 进行加密。
5、浏览器将加密的 R 传送给服务器。
6、服务器用自己的私钥解密得到 R。
7、服务器以 R 为密钥使用了对称加密算法加密网页内容并传输给浏览器。
8、浏览器以 R 为密钥使用之前约定好的解密算法获取网页内容。

数字证书如何认证? 首先你的证书会在https握手过程中被传递到浏览器,浏览器从你的证书中找到了颁发者,从颁发者的证书(如果你电脑上有的话)又找到了CA的证书
(CA证书会在操作系统安装时就安装好,所以每个人电脑上都有根证书),使用CA证书中带的公钥来对颁发者证书做验签,一旦匹配,说明你电脑上的颁发者证书不是伪造的,
同理,再用颁发者证书中的公钥去验证你的证书,> 以此证明你的证书不是伪造的。这样整个链状的验证,从而确保你的证书一定是直接或间接从CA签发的,
这样浏览器地址栏会显示一个绿色的盾牌,表示你的网站能通过证书验证。
如果你的电脑上没有颁发者证书(断链)或者你自己本身就是自签名证书(自己做CA,但是要记得,人家电脑上并没有装你的自签名根证书),那么浏览器会报警提示不能验证证书,问你是否还需要继续。

对比HTTP和HTTPS的传输

HTTPS的优化

HTTPS 连接大致上可以划分为两个部分,第一个是建立连接时时的非对称加密握手,第二个是握手后的对称加密报文传输。
在最差的情况下,也就是不做任何的优化措施,HTTPS 建立连立连接可能会比HTTP 慢上几百毫秒甚至几秒,这其中既有网络耗时,也有计算耗时,就会让人产生“打开一个 HTTPS 网站好慢啊”的感觉。

优化措施

  • 硬件优化

    • 更快的CPU
    • SSL加速卡 如:阿里的Tengine
    • SSL加速服务器
  • 软件优化

    • 软件升级 如:Linux 内核由 2.x 升级到 4.x,把 把 Nginx 由 1.6 升级到 1.16,把 OpenSSL 由 1.0.1 升级到 1.1.0/1.1.1。
  • 协议优化

    • 采用 TLS1.3
    • 握手时使用的密钥交换协议应当尽量选用椭圆曲线的 ECDHE 算法。它不仅运算速度快,安全性高,还支持“False Start”
    • 椭圆曲线也要选择高性能的曲线,最好是 x25519,次优选择是 P-256。对称加密算法方面,也可以选用“AES_128_GCM”,它能比“AES_256_GCM”略快一点点。
  • 证书优化

    • 采用选择椭圆曲线(ECDSA)证书而不是 RSA 证书,因为 224 位的 ECC 相当于 2048 位的 RSA,节约带宽和计算量
    • “OCSP Stapling”(OCSP 装订),它可以让服务器预先访问 CA 获取 OCSP 响应,然后在握手时随着证书一起发给客户端,免去了客户端连接 CA 服务器查询的时间。
  • 会话复用

    • 会话复用的效果类似 Cache,前提是客户端必须之前成功建立连接,后面就可以用“Session ID”“Session Ticket”等凭据跳过密钥交换、证书验证等步骤,直接开始加密通信。

参考

RServe安装配置

RServe高级配置

## 1.RServe服务器启动

1) 在程序中,启动RServe服务器

1
2
> library(Rserve)
> Rserve()

2) 在命令行,启动RServe服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
~ R CMD Rserve --help

Usage: R CMD Rserve [<options>]

Options: --help this help screen
--version prints Rserve version (also passed to R)
--RS-port <port> listen on the specified TCP port
--RS-socket <socket> use specified local (unix) socket instead of TCP/IP.
--RS-workdir <path> use specified working directory root for connections.
--RS-encoding <enc> set default server string encoding to <enc>.
--RS-conf <file> load additional config file.
--RS-settings dumps current settings of the Rserve
--RS-source <file> source the specified file on startup.
--RS-enable-control enable control commands
--RS-enable-remote enable remote connections
--RS-pidfile <file> store the pid of the Rserve process in <file>
--RS-set <config>=<value> set configuration option as if it was
read from a configuration file

All other options are passed to the R engine.

1
2

~ R CMD Rserve --RS-enable-remote

查看Rserve进程

1
2
3
4
5
~ ps -aux|grep Rserve
conan 27639 0.0 1.2 116288 25236 ? Ss 20:41 0:00 /usr/lib/R/bin/Rserve --RS-enable-remote

~ netstat -nltp|grep Rserve
tcp 0 0 0.0.0.0:6311 0.0.0.0:* LISTEN 27639/Rserve

2. Rserve配置

通过配置文件,管理Rserve服务器。

Rserv.conf: 配置文件
source.R:初始化脚步文件
查看当前的Rserve 服务器的默认配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~ R CMD Rserve --RS-settings
Rserve v1.7-1

config file: /etc/Rserv.conf
working root: /tmp/Rserv
port: 6311
local socket: [none, TCP/IP used]
authorization required: no
plain text password: not allowed
passwords file: [none]
allow I/O: yes
allow remote access: no
control commands: no
interactive: yes
max.input buffer size: 262144 kB

修改默认配置,新建文件:/etc/Rserv.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
~ sudo vi /etc/Rserv.conf


workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source /home/jiaxf/R/RServe/source.R
eval xx=1

~ vi /home/jiaxf/R/RServe/source.R

cat("This is my Rserve!!")
print(paste("Server start at",Sys.time()))

source选项,用来配置Rserve服务器启动时加载的文件,例如:初始化系统变量,初始化系统函数等。

eval选项,直接定义环境变量。

## 4. Rserve高级使用:用户登陆认证

增加用户登陆认证,修改文件:/etc/Rserv.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
~ sudo vi /etc/Rserv.conf

workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source /home/jiaxf/R/RServe/source.R
eval xx=1
auth required
plaintext enable

用RSclient登陆

1
2
3
4
> library(RSclient)
> conn<-RS.connect()
> RS.login(conn,"jiaxf","jiaxf",authkey=RS.authkey(conn))
[1] TRUE

RServe安装配置

RServe安装配置

  1. Rserve的安装与配置
    Rserve主要是提供远程连接的服务,当然功能是很多的,具体可参考:https://rforge.net/Rserve/

在安装Rserve之前确保R能够正常运行,并正确配置了R的环境变量。 建议安装R 3.2.5 以上的R版本。

运行R,安装Rserve包

1
2
~ sudo R
> install.packages("Rserve")

查看Rserve配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~ R CMD Rserve --RS-settings
Rserve v1.7-3

config file: /etc/Rserv.conf
working root: /tmp/Rserv
port: 6311
local socket: [none, TCP/IP used]
authorization required: no
plain text password: not allowed
passwords file: [none]
allow I/O: yes
allow remote access: no
control commands: no
interactive: yes
max.input buffer size: 262144 kB
config file: 本地无此文件/etc/Rserv.conf
working root: R运行时工作目录 /tmp/Rserv
port: 端口6311
local socket: TCP/IP协议
authorization: 认证未开启
plain text password: 不允许明文密码
passwords file: 密码文件,未指定
allow I/O: 允许IO操作
allow remote access: 远程访问未开启
control commands: 命令控制未开启
interactive: 允许通信
max.input buffer size: 文件上传限制262mb

创建配置文件

1
~ sudo vi /etc/Rserv.conf
workdir /tmp/Rserv
remote enable
fileio enable
auth required
plaintext enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable

开启远程访问权限后配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~ R CMD Rserve --RS-settings
Rserve v1.7-3

config file: /etc/Rserv.conf
working root: /tmp/Rserv
port: 6311
local socket: [none, TCP/IP used]
authorization required: yes
plain text password: allowed
passwords file: [none]
allow I/O: yes
allow remote access: yes
control commands: yes
interactive: yes
max.input buffer size: 262144 kB

指定配置文件

1
~ R CMD Rserve --RS-conf /etc/Rserv.conf

启动Rserve远程模式

1
~ R CMD Rserve --RS-enable-remote

查看启动后Rserve端口

1
~ netstat -nltp|grep Rserve

tcp 0 0 0.0.0.0:6311 0.0.0.0:* LISTEN 73821/Rserve

0.0.0.0:6311 代表不受限的IP访问

  1. Java远程连接Rserve

首先,我们需要下载Rserve所使用到的两个Jar包:REngine.jar和RserveEngine.jar,下载地址http://www.rforge.net/Rserve/files/
如果项目使用maven进行管理,那么将下面的内容放入pom.xml文件中:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.rosuda.REngine</groupId>
<artifactId>REngine</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.rosuda.REngine</groupId>
<artifactId>Rserve</artifactId>
<version>1.8.1</version>
</dependency>
```

R语言初步

R语言初步

常用R对象

  • 向量
  • 列表
  • 矩阵
  • 数组
  • 因子
  • 数据帧

向量对象有六种数据类型的原子向量,也称为六类向量。 其他R对象是建立在原子向量之上的。六类向量类型如下表所示

向量

当要创建具有多个元素的向量时,应该使用c()函数,表示将元素组合成一个向量。

1
2
3
4
5
6
# Create a vector.
apple <- c('red','green',"yellow");
print(apple);

# Get the class of the vector.
print(class(apple));

R上面示例代码,执行结果如下

1
2
3
4
5
6
> apple <- c('red','green',"yellow");
> print(apple);
[1] "red" "green" "yellow"
> print(class(apple));
[1] "character"
>

列表

列表是一个R对象,它可以包含许多不同类型的元素,如向量,函数,甚至其中的另一个列表。

1
2
3
4
5
# Create a list.
list1 <- list(c(2,5,3),21.3,sin);

# Print the list.
print(list1);

R上面示例代码,执行结果如下

1
2
3
4
5
6
7
8
[[1]]
[1] 2 5 3

[[2]]
[1] 21.3

[[3]]
function (x) .Primitive("sin")

Let's Encrypt通配符证书开启HTTPS

Let’s Encrypt通配符证书开启HTTPS

什么是Let’s Encrypt?

部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。

Let’s Encrypt 也是一个 CA 机构,但这个 CA 机构是免费的!也就是说签发证书不需要任何费用。

什么是通配符证书

在没有出现通配符证书之前,Let’s Encrypt 支持两种证书。

1)单域名证书:证书仅仅包含一个主机。

2)SAN 证书:一张证书可以包括多个主机(Let’s Encrypt 限制是 20),也就是证书可以包含下列的主机:www.example.com、www.example.cn、blog.example.com 等等。

证书包含的主机可以不是同一个注册域,不要问我注册域是什么?注册域就是向域名注册商购买的域名。

对于个人用户来说,由于主机并不是太多,所以使用 SAN 证书完全没有问题,但是对于大公司来说有一些问题:

子域名非常多,而且过一段时间可能就要使用一个新的主机。

注册域也非常多。

读者可以思考下,对于大企业来说,SAN 证书可能并不能满足需求,类似于 sina 这样的网站,所有的主机全部包含在一张证书中,而使用 Let’s Encrypt 证书是无法满足的。

Let’s Encrypt 通配符证书

通配符证书就是证书中可以包含一个通配符,比如 .example.com、.example.cn,读者很快明白,大型企业也可以使用通配符证书了,一张证书可以防止更多的主机了。

这个功能可以说非常重要,从功能上看 Let’s Encrypt 和传统 CA 机构没有什么区别了,会不会触动传统 CA 机构的利益呢?

如何申请Let’s Encrypt通配符证书

为了实现通配符证书,Let’s Encrypt 对 ACME 协议的实现进行了升级,只有 v2 协议才能支持通配符证书。

也就是说任何客户端只要支持 ACME v2 版本,就可以申请通配符证书了,是不是很激动。

读者可以查看下自己惯用的客户端是不是支持 ACME v2 版本,官方介绍 Certbot 0.22.0 版本支持新的协议版本,我立刻进行了升级:

1
2
3
4
5
6
./certbot-auto -V
Upgrading certbot-auto 0.21.1 to 0.22.0...
Replacing certbot-auto...

./certbot-auto -V
certbot 0.22.0

在了解该协议之前有几个注意点:

1)客户在申请 Let’s Encrypt 证书的时候,需要校验域名的所有权,证明操作者有权利为该域名申请证书,目前支持三种验证方式:

dns-01:给域名添加一个 DNS TXT 记录。

http-01:在域名对应的 Web 服务器下放置一个 HTTP well-known URL 资源文件。

tls-sni-01:在域名对应的 Web 服务器下放置一个 HTTPS well-known URL 资源文件。

而申请通配符证书,只能使用 dns-01 的方式。

2)ACME v2 和 v1 协议是互相不兼容的,为了使用 v2 版本,客户端需要创建另外一个账户(代表客户端操作者),以 Certbot 客户端为例,大家可以查看:

1
2
3
4
$ tree /etc/letsencrypt/accounts
.
├── acme-staging.api.letsencrypt.org
└── acme-v01.api.letsencrypt.org

3)Enumerable Orders 和限制

为了实现通配符证书,Let’s Encrypt 在申请者身份校验上做了很大的改变。

有了订单 ID 的概念,主要是为了追踪通配符域名。

申请限制,在 V1 版本,Let’s Encrypt 为了避免滥操作,对申请证书有一些限制(很难学习,但是正常使用不会遇到该限制)。而 v2 版本,对于通配符证书,多了一个限制,New Orders per Account(每个证书订单数限制)。

这两个细节,后续再仔细研究。

实践测试

我迫不及待想使用 Certbot 申请通配符证书,升级 Certbot 版本运行下列命令:

1
2
3
4
5
6
$ certbot-auto certonly  -d *.newyingyong.cn --manual --preferred-challenges dns

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
The currently selected ACME CA endpoint does not support issuing wildcard certificates.

参数说明:

certonly,插件,Certbot 有很多插件,不同的插件都可以申请证书,用户可以根据需要自行选择
-d 为那些主机申请证书,如果是通配符,输入 *.newyingyong.cn
–preferred-challenges dns,使用 DNS 方式校验域名所有权
接下去就是命令行的输出:

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
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): ywdblog@gmail.com

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for newyingyong.cn

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: y

上述有两个交互式的提示:

是否同意 Let’s Encrypt 协议要求

询问是否对域名和机器(IP)进行绑定

确认同意才能继续。

继续查看命令行的输出,非常关键:

1
2
3
4
5
6
7
8
9
10
11
-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.newyingyong.cn with the following value:

2_8KBE_jXH8nYZ2unEViIbW52LhIqxkg6i9mcwsRvhQ

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
Waiting for verification...
Cleaning up challenges

要求配置 DNS TXT 记录,从而校验域名所有权,也就是判断证书申请者是否有域名的所有权。

上面输出要求给 _acme-challenge.newyingyong.cn 配置一条 TXT 记录,在没有确认 TXT 记录生效之前不要回车执行。

我使用的是阿里云的域名服务器,登录控制台操作如下图:

然后输入下列命令确认 TXT 记录是否生效:

1
2
3
4
5
6
7
8
9
$ dig  -t txt  _acme-challenge.newyingyong.cn @8.8.8.8    

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.newyingyong.cn. IN TXT

;; ANSWER SECTION:
_acme-challenge.newyingyong.cn. 599 IN TXT "2_8KBE_jXH8nYZ2unEViIbW52LhIqxkg6i9mcwsRvhQ"

确认生效后,回车执行,输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/newyingyong.cn/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/newyingyong.cn/privkey.pem
Your cert will expire on 2018-06-12. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

恭喜您,证书申请成功,证书和密钥保存在下列目录:

1
2
3
4
5
6
$ tree /etc/letsencrypt/archive/newyingyong.cn
.
├── cert1.pem
├── chain1.pem
├── fullchain1.pem
└── privkey1.pem

然后校验证书信息,输入如下命令:

1
openssl x509 -in  /etc/letsencrypt/archive/newyingyong.cn/cert1.pem -noout -text

关键输出如下:

1
2
3
4
5
6
Authority Information Access:
OCSP - URI:http://ocsp.int-x3.letsencrypt.org
CA Issuers - URI:http://cert.int-x3.letsencrypt.org/

X509v3 Subject Alternative Name:
DNS:*.newyingyong.cn

完美,证书包含了 SAN 扩展,该扩展的值就是 *.newyingyong.cn。

获取Let's Encrypt免费通配符证书实现Https

获取Let’s Encrypt免费通配符证书实现Https

3月14日,Let’s Encrypt的执行董事Josh Aas对外宣布,他们的通配符证书正式上线,用户可以基于此特性轻松部署/开启所有子域名的HTTPS功能。

Let’s Encrypt 是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由 Mozilla、思科、Akamai、IdenTrust 和 EFF 等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由 HTTP 过渡到 HTTPS,目前 Facebook 等大公司开始加入赞助行列。

Let’s Encrypt 已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被 Mozilla、Google、Microsoft 和 Apple 等主流的浏览器所信任,用户只需要在 Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let’s Encrypt 安装简单,使用非常方便。

Linux下获取证书生成工具certbot

1
2
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

获取证书

1
shell ./certbot-auto certonly -d *.你的域名 --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

上述有三个交互式的提示:

是否同意 Let’s Encrypt 协议要求
询问是否对域名和机器(IP)进行绑定
输入邮箱,给你发送一封验证邮件
确认同意才能继续。

继续查看命令行的输出,非常关键:

1
2
3
4
5
6
7
8
9
10
11
-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.xxx.cn with the following value:

2_8KBE_jXH8nYZ2unEViIbW52LhIqxkg6i9mcwsRvhQ

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
Waiting for verification...
Cleaning up challenges

要求给 _acme-challenge.xxx.cn 配置一条 TXT 记录,在没有确认 TXT 记录生效之前不要回车执行。

然后输入下列命令确认 TXT 记录是否生效:

1
2
3
4
5
6
7
8
9
$ dig  -t txt  _acme-challenge.xxx.cn @8.8.8.8    

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.xxx.cn. IN TXT

;; ANSWER SECTION:
_acme-challenge.xxx.cn. 599 IN TXT "2_8KBE_jXH8nYZ2unEViIbW52LhIqxkg6i9mcwsRvhQ"

确认生效后,回车执行

恭喜您,证书申请成功,证书和密钥保存在下列目录:

1
2
3
4
5
6
$ tree /etc/letsencrypt/archive/xxx.cn
.
├── cert1.pem
├── chain1.pem
├── fullchain1.pem
└── privkey1.pem

证书更新

证书有效期为三个月,到期之前需要更新证书,更新流程就是重新执行一遍上面的操作,新证书会在你申请证书的日期上加三个月。

Redis数据介绍与指令大全

Redis数据介绍与指令大全

作为 Key-value 型数据库,Redis 也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串,Redis 的键值还可以是以下形式之一:

  • Lists (列表)
  • Sets (集合)
  • Sorted sets (有序集合)
  • Hashes (哈希表)

适用场景

  1. 取最新的n个数据,如读取作家博客最新的50篇文章,通过List实现按时间排序的数据的高效获取
  2. 排行榜应用,以特定条件为排序标准,将其设成sorted set 的score,进而实现高效获取
  3. 需要精准设定过期时间的应用,把sorted set 的 score 值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了
  4. 计数器应用,Redis 的命令都是原子性的,可以轻松地利用 INCR,DECR 命令来构建计数器系统。
  5. 去除大量数据中的重复数据,将数据放入set中,就能实现对重复数据的排除
  6. 构建队列系统使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队列系统。
  7. 实时系统,反垃圾系统通过上面说到的 set 功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。
  8. Pub/Sub构建实时消息系统
  9. 缓存

redis数据类型及操作详解

1. strings类型及操作

2. hashes类型及操作

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,相较string,由于使用了zipmap而占用更少的内存

操作方法:

3. list类型及操作

list 底层实现是一个双向链表,最大长度为2^32,也可用作栈

操作方法:

4. set类型及操作

set 是 string 类型的无序集合。set 元素最大可以包含(2 的 32 次方)个元素。set 的是通过 hash table 实现的,hash table 会随着添加或者删除自动的调整大小。调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作。

操作方法:

5. sorted sets 类型及操作

sorted set 在set的基础上增加了一个标识属性,它可以在set添加或修改元素时指定,每次指定,set会自动按标识调整顺序,set的每一个元素都会关联一个double类型的score。使用时往往我们把要排序的字段作为score存储,对象id则作为元素存储。

操作方法:

redis 常用命令

1. 键值相关命令

2. 服务器相关命令

redis常用命令总结

redis常用命令总结

一、key pattern 查询相应的key

  (1)redis允许模糊查询key  有3个通配符 *、?、[]`

  (2)randomkey:返回随机key  

  (3)type key:返回key存储的类型

  (4)exists key:判断某个key是否存在

  (5)del key:删除key

  (6)rename key newkey:改名

  (7)renamenx key newkey:如果newkey不存在则修改成功

  (8)move key 1:将key移动到1数据库

  (9)ttl key:查询key的生命周期(秒)

  (10)expire key 整数值:设置key的生命周期以秒为单位

  (11)pexpire key 整数值:设置key的生命周期以毫秒为单位

  (12)pttl key:查询key 的生命周期(毫秒)

  (13)perisist key:把指定key设置为永久有效

二、字符串类型的操作

  (1)set key value [ex 秒数] [px 毫秒数] [nx/xx]  

      如果ex和px同时写,则以后面的有效期为准

      nx:如果key不存在则建立

      xx:如果key存在则修改其值

  (2)get key:取值

  (3)mset key1 value1 key2 value2 一次设置多个值

  (4)mget key1 key2 :一次获取多个值

  (5)setrange key offset value:把字符串的offset偏移字节改成value

                  如果偏移量 > 字符串长度,该字符自动补0x00

  (6)append key value :把value追加到key 的原值上

  (7)getrange key start stop:获取字符串中[start, stop]范围的值

                  对于字符串的下标,左数从0开始,右数从-1开始

                  注意:当start>length,则返回空字符串

                     当stop>=length,则截取至字符串尾

                     如果start所处位置在stop右边,则返回空字符串

  (8)getset key nrevalue:获取并返回旧值,在设置新值

  (9)incr key:自增,返回新值,如果incr一个不是int的value则返回错误,incr一个不存在的key,则设置key为1

  (10)incrby key 2:跳2自增

  (11)incrbyfloat by 0.7: 自增浮点数 

  (12)setbit key offset value:设置offset对应二进制上的值,返回该位上的旧值

注意:如果offset过大,则会在中间填充0

   offset最大到多少

   2^32-1,即可推出最大的字符串为512M

  (13)bitop operation destkey key1 [key2..] 对key1 key2做opecation并将结果保存在destkey上

                          opecation可以是AND OR NOT XOR

  (14)strlen key:取指定key的value值的长度

  (15)setex key time value:设置key对应的值value,并设置有效期为time秒

三、链表操作

  Redis的list类型其实就是一个每个子元素都是string类型的双向链表,链表的最大长度是2^32。list既可以用做栈,也可以用做队列。

  list的pop操作还有阻塞版本,主要是为了避免轮询

  (1)lpush key value:把值插入到链表头部

  (2)rpush key value:把值插入到链表尾部

  (3)lpop key :返回并删除链表头部元素

  (4)rpop key: 返回并删除链表尾部元素

  (5)lrange key start stop:返回链表中[start, stop]中的元素

  (6)lrem key count value:从链表中删除value值,删除count的绝对值个value后结束

                count > 0 从表头删除  count < 0 从表尾删除  count=0 全部删除

  (7)ltrim key start stop:剪切key对应的链接,切[start, stop]一段并把改制重新赋给key

  (8)lindex key index:返回index索引上的值

  (9)llen key:计算链表的元素个数

  (10)linsert key after|before search value:在key 链表中寻找search,并在search值之前|之后插入value

  (11)rpoplpush source dest:把source 的末尾拿出,放到dest头部,并返回单元值

    应用场景: task + bak 双链表完成安全队列

 业务逻辑: rpoplpush task bak

         接收返回值并做业务处理

         如果成功则rpop bak清除任务,如果不成功,下次从bak表取任务

  (12)brpop,blpop key timeout:等待弹出key的尾/头元素

                timeout为等待超时时间,如果timeout为0则一直等待下去

      应用场景:长轮询ajax,在线聊天时能用到

四、hashes类型及操作

  Redis hash 是一个string类型的field和value的映射表,它的添加、删除操作都是O(1)(平均)。hash特别适用于存储对象,将一个对象存储在hash类型中会占用更少的内存,并且可以方便的存取整个对象。

  配置: hash_max_zipmap_entries 64 #配置字段最多64个

      hash_max_zipmap_value 512 #配置value最大为512字节

  (1)hset myhash field value:设置myhash的field为value

  (2)hsetnx myhash field value:不存在的情况下设置myhash的field为value

  (3)hmset myhash field1 value1 field2 value2:同时设置多个field

  (4)hget myhash field:获取指定的hash field

  (5)hmget myhash field1 field2:一次获取多个field

  (6)hincrby myhash field 5:指定的hash field加上给定的值

  (7)hexists myhash field:测试指定的field是否存在

  (8)hlen myhash:返回hash的field数量

  (9)hdel myhash field:删除指定的field

  (10)hkeys myhash:返回hash所有的field

  (11)hvals myhash:返回hash所有的value

  (12)hgetall myhash:获取某个hash中全部的field及value 

## 五、集合结构操作

  特点:无序性、确定性、唯一性

  (1)sadd key value1 value2:往集合里面添加元素

  (2)smembers key:获取集合所有的元素

  (3)srem key value:删除集合某个元素

  (4)spop key:返回并删除集合中1个随机元素(可以坐抽奖,不会重复抽到某人)   

  (5)srandmember key:随机取一个元素

  (6)sismember key value:判断集合是否有某个值

  (7)scard key:返回集合元素的个数

  (8)smove source dest value:把source的value移动到dest集合中

  (9)sinter key1 key2 key3:求key1 key2 key3的交集

  (10)sunion key1 key2:求key1 key2 的并集

  (11)sdiff key1 key2:求key1 key2的差集

  (12)sinterstore res key1 key2:求key1 key2的交集并存在res里 

六、有序集合

  概念:它是在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动按新的值调整顺序。可以理解为有两列的mysql表,一列存储value,一列存储顺序,操作中key理解为zset的名字。

  和set一样sorted,sets也是string类型元素的集合,不同的是每个元素都会关联一个double型的score。sorted set的实现是skip list和hash table的混合体。

  当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1)。另一个score到元素的映射被添加的skip list,并按照score排序,所以就可以有序地获取集合中的元素。添加、删除操作开销都是O(logN)和skip list的开销一致,redis的skip list 实现是双向链表,这样就可以逆序从尾部去元素。sorted set最经常使用方式应该就是作为索引来使用,我们可以把要排序的字段作为score存储,对象的ID当元素存储。

  (1)zadd key score1 value1:添加元素

  (2)zrange key start stop [withscore]:把集合排序后,返回名次[start,stop]的元素 默认是升续排列 withscores 是把score也打印出来

  (3)zrank key member:查询member的排名(升序0名开始)

  (4)zrangebyscore key min max [withscores] limit offset N:集合(升序)排序后取score在[min, max]内的元素,并跳过offset个,取出N个

  (5)zrevrank key member:查询member排名(降序 0名开始)

  (6)zremrangebyscore key min max:按照score来删除元素,删除score在[min, max]之间

  (7)zrem key value1 value2:删除集合中的元素

  (8)zremrangebyrank key start end:按排名删除元素,删除名次在[start, end]之间的

  (9)zcard key:返回集合元素的个数

  (10)zcount key min max:返回[min, max]区间内元素数量

  (11)zinterstore dest numkeys key1[key2..] [WEIGHTS weight1 [weight2…]] [AGGREGATE SUM|MIN|MAX]

      求key1,key2的交集,key1,key2的权值分别是weight1,weight2

      聚合方法用 sum|min|max

      聚合结果 保存子dest集合内

      注意:weights,aggregate如何理解?

答:如果有交集,交集元素又有score,score怎么处理?aggregate num->score相加,min最小score,max最大score,另外可以通过weights设置不同的key的权重,交集时 score*weight

七、服务器相关命令

  (1)ping:测定连接是否存活

  (2)echo:在命令行打印一些内容

  (3)select:选择数据库

  (4)quit:退出连接

  (5)dbsize:返回当前数据库中key的数目

  (6)info:获取服务器的信息和统计

  (7)monitor:实时转储收到的请求

  (8)config get 配置项:获取服务器配置的信息

     config set 配置项 值:设置配置项信息

  (9)flushdb:删除当前选择数据库中所有的key

  (10)flushall:删除所有数据库中的所有的key

  (11)time:显示服务器时间,时间戳(秒),微秒数

  (12)bgrewriteaof:后台保存rdb快照

  (13)bgsave:后台保存rdb快照

  (14)save:保存rdb快照

  (15)lastsave:上次保存时间

  (16)shutdown [save/nosave]

  注意:如果不小心运行了flushall,立即shutdown nosave,关闭服务器,然后手工编辑aof文件,去掉文件中的flushall相关行,然后开启服务器,就可以倒回原来是数据。如果flushall之后,系统恰好bgwriteaof了,那么aof就清空了,数据丢失。

  (17)showlog:显示慢查询

      问:多慢才叫慢?

      答:由slowlog-log-slower-than 10000,来指定(单位为微秒)

      问:服务器存储多少条慢查询记录

      答:由slowlog-max-len 128,来做限制       

,
Fork me on GitHub