svdu

Sotvokunia 搭建过程

Sotvokunia 是一个新的开始,比起之前的 Thinking 也换了一个“架构”,最主要的就是将 lighttpd 换成了更轻以及更强大的 nginx, 比起最初对 nginx 的一点都不了解到现在曾用 Nodejs 自己写了一个功能简易的反向代理后,算是基本了解了 nginx 的用法。

运行环境

nginx

nginx 本质是一个反向代理服务器,其本身不具备解析内容的功能,功能就如同其他代理一样——将内容转发到相应的端口上。所以这里我们需要安装 php7.0 和 php7.0-fpm 这两个包,其中第一个包含 zend 引擎,而第二个包含 CGI 和 CGI 的进程管理器。Ubuntu 默认是安装好 php7.0-fpm 后就启动它,之所以我选择 16.04.3 LTS 是因为比起以前的 init.d 我更喜欢用 systemd,大概是因为命令更加规范和易读。

nginx 接受由外部传来的数据,监听各个端口进行处理后返回各个目标位置,由目标程序处理后通过 nginx 再返回出去。所以当我们通过浏览器访问一个网站时,虽然好似通过 HTTP 的 80 访问,但实际上内容却交到了服务器上的其他的程序(可能实际上这些程序监听的是 8080 端口)进行处理。

而在这里只需要将 nginx 接收到的内容转发到 php7.0-fpm 就可以了。

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/public;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name sotvokun.info;

        location / {
                try_files $uri $uri/ =404;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ [^/]\.php(/|$) {
                include snippets/fastcgi-php.conf;

                # With php7.0-cgi alone:
                # fastcgi_pass 127.0.0.1:9000;
                # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        }
}

这里有个小插曲,当我一切就绪后,发现 Typecho 的伪静态未生效,于是网上查了一遍,发现最主要的问题是这个 server 在接受 path 时没有规则去处理,导致只能接受规则的动态页面,如同 http://example.com/index.phphttp://example.com/A/index.php 这种形式,于是在网上找了一下,发现一个最简洁的方法就是,就是将原来的 location 的规则换成 [^/]\.php(/|$) 的正则表达式,并添加 fastcgi_split_path_info 以及后面的正则表达式,来获取两个值,分别是:

  1. $fastcgi_script_name 变量。
  2. $fastcgi_path_info 变量。

举个例子: URL 是 https://sotvokun.info/index.php/category/Nocategory/ $fastcgi_script_name 则就是 /index.php。$fastcgi_path_info 则是 /category/Nocategory/ 将这两作为 fastcgi 的变量,就可以让 php7.0-fpm 正确处理了。而不会出现找不到文件的情况。

Let's Encrypt

搞 HTTPS 完全就是碰巧的事,我一直在使用 Hran 的付费主题 Mirages ,最新的 1.7.4 有一个严重的 BUG,让主页无法访问,而更新方式则是通过插件更新。由于一直点击更新都是显示 400 Bad Request: The plain HTTP request was sent to HTTPS port,于是我最初的第一反应就是可能由于我没有配置 HTTPS 而导致插件更新时走的是 HTTP。

这里需要注意的是,Hran 的 Mirages 更新不强制走 HTTPS ,所以后来我更改了源代码把更新所用的 requestURL 更换成了 http:// 也就成功更新了。

话回正题,Let’s Encrypt 算是傻瓜式的配置,自动生成证书,然后在 nginx 配置一下就可以了,唯一觉得遗憾的是我的证书不知道为什么只签到了4月,而不是签的一年,不知道是不是第一次签只有那么长时间。至于 HTTPS 的工作原理是咋样,没有深入学习过,所以也搞不明白到底为何生成的公钥密钥的作用,可能还真是需要再好好学习一下加密相关的知识。

Done

整个过程不算太困难,需要注意这期间需要安装 php7.0-xml 和 php7.0-mbstring 这两个包,这其中包含了 utf8_decode() 和 mbstring_split() 这两函数,如果不安装则无法正常运行 Typecho。至于使用 SQLite ,主要是为了方便迁移。另外,国内的云存储服务绑定自定义域名都必须要备案,这点是在是坑爹了,国外的服务又太贵。估计以后照片之类的还是只有放在 OneDrive 然后再共享出来贴在文章里面吧。