分类 其他 下的文章

之前搞的免费证书还没过期,但是被标记为不安全了。
今天下午抽空把网站换了 Let's Encrypt,还是这个靠谱。
记录下几个使用中要注意的点,这里以 Ubuntu + Nginx 为例

1. 服务器安装 certbot

可以在这里查看自己使用的系统和服务器软件对应的安装方式

2. 执行 certbot certonly

会看到如下提示

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Place files in webroot directory (webroot)
2: Spin up a temporary webserver (standalone)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 

这里会让我们选择 1 还是 2 强烈建议选择 1
因为选择 2 之后 certbot 会在 80 端口临时启动一个 webserver,但是我们的 nginx/apache 往往会占用 80 端口,需要停掉服务才可以继续,一次也就算了,每三个月要续期一次,续期的时候还要停止服务,不太合适。。
所以我们选 1

采用 1 以后需要指定一个文件夹用来存放认证文件,需要提前为要加 https 的域名配置好 nginx,certbot 会访问这个文件来确认这个域名绑定到了当前服务器。
设置方法:
假如我们指定的认证文件存放目录为 /data0/html/certbot
那么就在 nginx 中做如下配置

location '/.well-known/acme-challenge' {
    root /data0/html/certbot;
}

这段配置可以写在另外的文件中,用到时 include 进来。
之后按照 certbot 的提示操作,看到 Congratulations! 就说明证书生成成功了,记录下证书存放的位置,一会配置 nginx 要用到。

3. 配置 https

找到网站的 nginx 配置文件加入一个 server {} 配置如下

server {
    listen 443;

    ...

    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ...
}

这里省略掉了与 80 端口相同的配置项,只需将端口改为 443,加入以 ssl 开头的 3 行配置就搞定啦!
当然 example.com 要替换成我们自己域名,这个可以说是最简配置了
更多详细说明可以看这里

4. 自动更新证书

每两个月更新一次并重启 nginx
0 0 1 /2 /usr/bin/certbot renew >> /var/log/certbot.log && /usr/sbin/nginx -s reload

5. 可能遇到的问题

本来配置好了,然后自己清理了一下之前的配置,搞出问题了。。。
之前有个 listen 80 default_server 这样的配置 我又加了个 listen 443 default_server 重启 nginx 之后就不能访问了 会提示 ERR_CONNECTION_CLOSED 或者 ERR_SSL_PROTOCOL_ERROR。。。查了半天才解决这个问题,自己给自己挖坑,醉了。。不过好在涨姿势了。
listen 443 default_server 这种写法是不对的。
由于是泛解析,任意子域名都能访问到网站,https 建立连接是在判断 server_name 之前的,所以采用 https 的访问是无法统一处理的,目前采用的方式是:
在解析的域名中加一条配置

if ($host != 'blog.jiayx.net' ) {
    return 301 https://blog.jiayx.net$request_uri;
}

为什么 FAT32 格式的 U 盘无法存放大于 4G 的文件?
为什么 32 cpu 通常只支持 4G 内存?

所有的计算机术语中,所有的“位”都是指 bit 就是一个二进制位(即 0 或 1)

1bit = 1位

1B(byte) = 1字节 = 8bit
1KB = 1024B
1MB = 1024KB = 1024 * 1024B
1GB = 1024MB
1TB = 1024GB

FAT32

这个是硬盘分区格式,32 意思是采用了 32 位(即32个0/1)的文件分配表
也就是说采用 32 个 二进制位 来计数文件的 字节数
32个 0/1 所能记录最大的正整数为 2^32 也就是说能记录的最大文件大小为 2^32byte(字节)这数正好是 4G,所以采用 FAT32 格式的 U 盘无法存放大于 4G 的文件

操作系统以及 CPU 的“位”

这方面的文献搜集的不够全面和专业,先简单列出,后续再补充

  • 32 位系统
    CPU 一次最多能处理 32 个二进制位
  • 64 位系统
    CPU 一次最多能处理 64 个二进制位

介绍

lseek 可以显式地为一个文件设置偏移量,设置成功返回新的偏移量,设置失败返回 -1

每个文件都有一个与其相关的“当前文件偏移量”,一般是个非负整数,用来度量从文件开始出计算的字节数。通常对文件的读写操作都是从“当前文件偏移量”处开始

文件偏移量允许大于当前文件长度,这样一来文件中会包含一个“空洞”。这部分“空洞”不占用磁盘块。在读的时候被读为 0

用途:迅雷下载

之前看到过迅雷下载的文件,只要任务创建好,文件的大小就是将来下载完的文件大小(只是看起来比较大,并没有实际占用那么多磁盘空间)。当时有点奇怪,但是没有深究,看到 lseek 的时候去搜了一下,原来是这样的原理!
先利用空洞文件的特性,建立一个跟目标文件大相同的文件,之后下载可以采用多线程的方式同时写入,加快下载速度。
有的人问为什么没有采用写多个小文件最后合并的策略。两方面原因:

  • 合并文件比较费时间,很多小的碎片,硬盘也很累
  • 提前占用空间的好处是,如果下载空间不足,可以在任务创建时就提醒用户,而不是等下载到一半才发现空间不够用

之前随便申请的 CA 沃通免费SSL证书 现在被 Chrome 标记为不安全了。改日换成 Let's Encrypt 吧

第一章

1.1 引言

1.2 UNIX 体系结构

从底层到上层:

  • 内核
  • 系统调用
  • 公共函数
  • shell
  • 应用程序

1.3 登录

/etc/passwd 定义了登录用户、口令、登录之后的起始目录
登录之后运行的 shell 取决于 /etc/passwd 文件中列出的对应 shell
常见的 shell 的种类 sh bash csh ksh tcsh

1.4 文件和目录

  • 根目录 /
  • 目录命名规则
  • 文件名、路径名
  • 进程的工作目录 默认工作目录是启动当前进程的目录,所以会有一些(PHP)框架调用 chdir 函数改变工作目录,使得框架中可以方便地无歧义地使用相对路径
  • 实例 列出指定目录下的文件

1.5 输入和输出

  • 文件描述符

    就是一个非负整数用来标识一个 进程正在访问的文件
  • 标准输入、输出、错误

    每当运行新程序时,shell 都会为它开启3个文件描述符,就是标准输入、输出、错误
    可以通过 < 和 > 以及 | 重定向输入输出到其他文件或命令
  • 不带缓冲的 I/O
    几个 UNIX 函数提供了不带缓冲的 I/O,并且用到了文件描述符,函数(c 函数)出错,大多数情况返回 -1
  • 标准 I/O (带缓冲)

1.6 程序和进程

  • 每个进程都有一个唯一的进程 ID 是个非负整数。
  • 可以用 fork、exec、waitpid 控制进程 (在 C 语言中 NULL 和 0 是等价的)

    文中提到 fork 调用一次 返回两次(分别在子进程和父进程中),这里还不是很清楚 后面进行深入了解。
  • 进程与线程

    线程用线程 ID 标识,线程 ID 只在所属进程内有意义
    一个进程内的所有线程共享地址空间、文件描述符、栈、进程相关属性。
    由于线程共享存储区,多线程访问时要做好同步措施。

1.7 出错处理

  • UNIX 系统函数出错通常返回负值,也有返回 null 的
  • 可从 errno 变量中读取具体错误标识

1.8 用户标识

  • 用户、用户组、附属组
  • root 用户 ID 为 0
  • 支持多个附属组(16 个以上)

    1.9 信号

  • 可以注册自定义函数处理信号
  • 信号有系统默认的处理方式

1.10 时间值

  • 日历时间
    UNIX 时间戳
  • 进程时间
    每个进程有 3 个进程时间,分别是:时钟时间、用户 CPU 时间、系统 CPU 时间
    可以使用 time -p + 命令 的形式查看运行这个命令所需的时间

1.11 系统调用和库函数

UNIX 中每个系统调用都对应一个名字相同的 C 函数(在 C 标准库中) 应用程序可以直接调用系统调用和库函数

  • 系统调用使用 C 语言定义
    系统调用是直接进入被和的入口点
    早期操作系统使用汇编定义
  • 库函数使用 C 语言定义

1.12 小结

第二章