Linux下部署个人站点后的运行问题

Linux下部署个人站点后的运行问题

Linux下部署个人站点后的运行问题

  昨天已经把个人站点部署在linux成功并可以发布运行,有一个问题,就是当退出远程登陆SSH之后,hexo的进程会被杀死导致无法访问,今天早上看了几篇博客之后知道怎么回事了,做一下记录。

1、进程杀死原因

1.1、进程与会话

  • 进程组: 一个或多个进程的集合,每一个进程组都有唯一一个进程组ID,即进程组
  • 会话期: 一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
  • 控制进程: 与控制终端(如ssh)连接的会话期首进程叫做控制进程。当前与终端交互的进程称为前台进程组, 其余进程组称为后台进程组。

    PID = 进程ID (由内核根据延迟重用算法生成)
    PPID = 父进程ID(只能由内核修改)
    PGID = 进程组ID(子进程、父进程都能修改)
    SID = 会话ID(进程自身可以修改,但有限制,详见下文)
    TPGID= 控制终端进程组ID(由控制终端修改,用于指示当前前台进程组)

关键点:每次用户登陆终端会产生一个会话session,session从登陆开始到结束为止,而这一段时间内在该会话中执行的所有进程都属于本会话。

1.2、挂断信号SIGHUP

挂断信号默认操作是终止进程

  • 当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)
  • 如果会话期首进程终止,则该挂断信号发送到该会话期前台进程组.
  • 一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程.

1.3、hexo 进程中断原因:

  • SSH退出连接或因网络问题中断连接,ssh终端检测到连接中断会将挂断信号SIGHUP发送到与终端连接的控制进程。
  • 控制进程被终止了,属于同一个会话期的其他进程也被终止了。

2、解决办法

说了那么多,意思就是说ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉!! 导致一旦ssh关闭,执行中的任务就取消了。

2.1、nohub命令与&命令

作用:后台执行

当平时在终端操作时,不希望运行一个程序占满了屏幕导致无法进行其他操作时,这时候就需要后台运行了。
本情形下:退出ssh后希望hexo依然继续工作,也需要后台运行了。

& 命令

比如

1
hexo s &

Alt text

虽然前台有打印,但是ctrl+c之后程序并没有退出,依然可以从公网访问。但是有一个弊端就是:当退出控制进程之后该后台进程会被杀死,所以希望退出之后继续运行需要使用 nohup

nohup 命令

1
nohup hexo s &

Alt text

此时hexo进程已经后台运行了,可以看到一句话“忽略输入并将输出追加到’nohup.out’”,就是说把当前 hexo s 命令的输出文件追加到当前目录的 nohup.out 文件中去了,vim看一下。

Alt text

可以让程序输入到指定位置

1
nohup hexo s >/opt/output/out.file 2>&1 &

什么意思不记录了。

后台运行之后可以通过 jobs 查看当前后台进程,注意:jobs只显示当前会话期的后台进程,如果退出之后是查看不到 hexo的后台进程的,不过可以通过 ps -aux 进程命令查看到。

1
ps -aux | grep hexo

当不需要后台运行时

1
kill PID

Alt text

可以发现退出之后jobs是看不到后台进程的.

3、将ip地址映射到域名

  这里就需要用到域名的DNS解析了,由于前面已经搭建了放在Github的Hexo环境,自己的 yuzh.xyz 域名DNS解析中 A记录@记录 均指向到了github博客仓库地址 https://github.com/yuzh233/yuzh233.github.io 所对应的ip。所以通过 www.yuzh.xyz 和 yuzh.xyz 是不能够访问 linux下的hexo的。

3.1、 GitHub仓库作为服务器部署办法

  • 修改hexo根目录配置文件 _config.yml
1
2
3
4
5
6
7
# Deployment
## Docs: https://hexo.io/zh-cn/docs/deployment.html
deploy:
type: git
# 仓库地址,不是url地址,是拷贝仓库时的地址。
repo: https://github.com/yuzh233/yuzh233.github.io.git
branch: master

hexo是依据这个部署到git仓库的。

  • 上传到git仓库

    • 先安装上传的插件
1
npm install hexo-deployer-git --save
  • 上传命令,每次有更新都需要 “生成 -> 部署”
1
2
3
hexo clean
hexo generate
hexo deploy
  • 绑定域名
    • 该步可以跳过,不过我就是要绑定。
    • 在source文件夹下新建一个名为CNAME的文件,里面写指定的域名 比如 www.yuzh.xyz
    • 添加一条 DNS 解析。添加一条 A 记录和 @ 记录,IP地址填写hexo部署到git的仓库的地址,怎么获取仓库地址对应的ip? ping yuzh233.github.io 可以得到ip,这里有一个问题,仅仅通过这个ip就访问到了我的仓库吗?为什么不需要设置端口号啊(・∀・(・∀・ ) ,不管了,反正就是访问到了。
    • 然后访问的时候输入 www.yuzh.xyz 或 yuzh.xyz 就到了我的仓库了(设置了解析的结果),我的仓库由于添加了CNAME记录,将仓库的域名指向了文本中的域名了。

3.2、 云ECS linux环境服务器部署办法

  • 首先当然是 linux后台运行hexo s进程了。
  • 然后 ECS 安全组不能把默认4000端口拦截了。
  • 绑定域名

    • 由于一级域名已经被git中的仓库绑定了,这里可以更换DNS解析重新绑定到我的linux主机中,访问方式:www.yuzh.xyz:4000 为什么这里要加端口而绑定到git仓库时却不需要端口呢?鬼知道为什么~ 部署到git的时候通过一个ip直接访问到了仓库地址。但是访问linux主机中的应用本来就是要加端口的。
    • 这里不想更改DNS解析,但是可以使用二级域名解析哦~

      二级域名是免费的
      可以设置多个二级域名,指向到不同的主机地址

    如:

    Alt text

    这样通过 blog.yuzh.xyz:4000可以访问到linux下的hexo环境了。

    • 然而,还是要加个端口号,不想显式加端口,怎么办?—— 使用隐形URL作为解析记录

    Alt text

    如此,通过访问 bg.yuzh.xyz 转发到了 blog.yuzh.xyz:4000 再访问到了hexo应用了。
    注意:使用隐形URL或显性URL跳转需要备案。备案条件:1.主机在国内 2.ECS租用3个月以上 3.域名已经实名验证

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×