今天来说说NVDA远程服务器在linux的搭建,windows自行看说明研究。
主要是针对debian、ubuntu等系统,centOS的大同小异。

学习之前

你需要掌握

  • linux的基本知识
  • 熟练使用WinSCP
  • 魔法{非必须}

    获取文件

    可以从NVDARemoteServer的release页面找到最新版本的文件,通常,linux64位的就下载nvdaRemoteServer_linux_amd64.tar.gz,32位就下载386的,arm处理器的就选择带arm的,这里不再赘述。
    如只是想安装,不想要那么多自定义功能,或者只想直接使用,下载困难,可从文末下载。

    解压相关文件并赋予权限

    我们仍使用WinSCP进行相关操作。

    对于小白用户

    从文墨下载我的两个安装脚本,把nrs.tgz复制到vps的home文件夹,在命令行中输入

    tar -xzvf nrs.tgz && cd nrs && chmod +x install.sh && ./install.sh

    这样就安装完成了,运行脚本的时候要输入证书和私钥的绝对路径,如果无证书文件可直接留空。
    把check-cert-update.tgz复制到任意位置,然后执行命令

    tar -xzvf check-cert-update.tgz && cd check-cert-update && chmod +x install.sh && ./install.sh

    同样,输入证书的绝对路径,即可配置完成。

    对于想自定义使用或者想自己动手的高级用户:

    从github下载好相关文件,连接到VPS后,找个你想放的文件夹,例如我放在/home里,右键菜单、文件自定义命令、UnTar/GZip,回车两次搞定。
    我们可以重命名一下文件夹,这名字太长了,比如改成nrs,然后f9给文件夹权限,改成0777,并选中递归设置所有者、分组与权限复选框,然后回车确定。
    进入文件夹内部,进入systemd文件夹,修改nvdaRemoteServer.service文件,把
    User=sample

    Group=sample
    从sample改成root,然后更改ExecStart的内容。
    ExecStart=/home/sample/bin/nvdaRemoteServer -cert-file /home/sample/nvdaRemoteServer/cert.crt -key-file /home/sample/nvdaRemoteServer/cert.key -log-level=3
    首先当然是主进程的位置,我们放在了/home/nrs里面,那么就要更改指向路径的位置,就变成了
    /home/nrs/nvdaRemoteServer

    更改-cert-file的路径

    这里分几种情况:

    没有ssl证书

    如果你没有ssl证书,那么就可以把cert-file和cert-key这两个参数直接删掉。

    有ssl证书

    那么就可以把后面的路径改成你指向你ssl证书和秘钥的路径,格式不限,不管是.crt还是.cer,都行,能打开查看里面的内容就行。

    使用配置

    -conf-file是使用配置文件的意思,后面加上配置文件的路径,至于如何得到配置文件,后面在说,首先我这么写:
    -conf-file /home/nrs/nvdaRemoteServer.json

    日志相关

    -log-level

    日志等级,-1到4,-1就是关闭日志,数字月高月详细。

    程序输出日志

    默认是
    StandardOutput=append:/home/sample/nvdaRemoteServer/stdout.log
    改成你想放这个日志的地方,比如我改成
    StandardOutput=append:/home/nrs/stdout.log
    注意你设置的输出日志的文件夹必须存在,比如放在/home/log/nrs-log里面,就要保证有log和nrs-log这两个文件夹并有相关权限,没有就要先创建在运行服务,否则会报错

    程序错误日志

    同上,比如我改成
    StandardError=append:/home/nrs/stderr.log
    当然,最后日志的文件名也可以随意更改。

    最终配置

    最后改好的配置就是

    ExecStart=/home/nrs/nvdaRemoteServer -cert-file /home/nrs/cert.crt -key-file /home/nrs/cert.key -log-level=3 -conf-file /home/nrs/nvdaRemoteServer.json
    StandardOutput=append:/home/nrs/stdout.log
    StandardError=append:/home/nrs/stderr.log

    注意证书文件不能直接用,要自己证书的位置,没有证书就删掉cert-file和key-file这两个参数吧,注意后面的路径要一起删掉,如果你以后或得了证书文件可以直接改配置文件,不需要在到找这里改了。

    复制文件

    把nvdaRemoteServer.service重命名为nrs.service,这样方便命令输入,放到
    /etc/systemd/system/里面。

    程序配置

    我会给一个配置文件的样本,后面也会解释相关参数,只需要在电脑上新建一个文本文件,粘贴配置的内容,文件名改成nvdaRemoteServer.json
    复制到服务器的/home/nrs目录下即可,当然这是我在上面所写的路径,如果你不想放在这里或者文件名不想这么长,也可以自行修改,当然也要记得同时修改nrs.service里面的-conf-file及其后面的路径。

    {
      "pid_file": "",
      "log_file": "",
      "log_level": 0,
      "addresses": [
          ":6837"
      ],
      "cert_file": "",
      "key_file": "",
      "motd": "1",
      "motd_always_display": false,
      "send_origin": true
    }

    注:命令行执行的参数高于配置文件的参数,相信细心的你已经看到,在这个配置文件里也有证书秘钥和日志等级的参数,但其实可以不必理会,因为在上面的nrs.service里面已经指定了位置,那个优先级要高于配置文件的,除非你想缩短ExecStart的内容,及删掉证书秘钥和日志等级的相关参数。
    下面我会逐一解释配置的每个参数:

    pid_file:

    这是程序pid的位置,我没有更改它,保持了留空。

    log_file:

    日志文件的位置,注意不包含错误日志,所以没必要也不需要改,因为在nrs.service改过了。

    log_level:

    日志等级,高一级的日志也会同时记录比它低的内容,比如设成1,就会同时记录0和1的内容,2就是记录0、1和2的内容,不过日志等级也在上面的service文件里,想改就改ExecStart的内容,除非你删掉了service文件里关于日志等级相关内容,具体数字涵义如下:

  • -1 将禁用日志记录,但错误日志除外,这些信息始终会被记录。这包括导致程序崩溃的严重错误。
  • 0 会在服务器启动、停止或发生不严重到需要始终记录的错误时进行日志记录。
  • 1 会记录连接的客户端的信息,包括它们的ID和IP地址。
  • 2 会记录每个客户端加入和离开的频道,其中包含频道密码。不要在生产环境中使用此日志级别。
  • 3 会记录程序在每个操作阶段所做的事情。仅用于调试目的。
  • 4 会记录服务器和客户端之间交换的协议。除非你是开发人员或者想要分析所使用的协议,否则不要使用这个级别。这可能会导致性能下降,因为交换协议的信息也会发送到控制台,或者如果你的操作系统设置了重定向,也会写入文件。

    addresses:

    无必要一般不用修改。
    程序监听传入连接的地址,格式为IP地址:端口。默认情况下,使用所有地址,服务器接受端口6837上的连接。
    如果你想监听IPV6地址,该地址必须用方括号括起来。例如:
    [fd80::ffe8]:6837
    只要您的某个网络接口上有一个有效的IPV6地址,例如IPV6地址的本地前缀,您就可以监听到服务器的传入连接。要只监听IPV6地址,请使用以下示例。
    [::]:6837
    要监听IPV4地址,只需使用以下示例中的有效参数即可,该参数将仅监听所有IPV4地址。
    0.0.0.0:6837
    如果没有声明地址,默认端口为6837。有效端口号介于1和65536之间。在声明服务器监听的地址时,您还必须声明端口,否则参数将无效。但是,您不需要声明地址。例如,如果你想监听所有地址,但使用端口5000,请使用以下命令。
    :5000

    cert_file:

    证书文件位置

    key_file:

    秘钥文件位置

    motd:

    每日消息内容

    motd_always_display:

    设置是否每次连接都显示没日消息,如果为true则每次连接都显示,false为第一次连接显示。

    send_origin:

    默认情况下,当服务器收到来自客户端的消息时,会将相同的消息发送给所有需要接收的客户端,但会在该消息中添加一个来源字段。这要求将消息解码为程序更易操作的值,添加来源信息后,再编码回要发送给所有客户端的值。这可能会导致轻微的性能损失。如果需要,可以通过设置为 false 来禁用此功能,不过这样做可能会导致某些功能无法正常工作。如果将其设置为 false,服务器会警告您,在需要来源字段时,这可能会影响客户端的功能。
    没必要不需要改。

    nvda远程服务器需要用到的命令

    设置开机自启

    systemctl enable nrs

    启动nvda远程服务器

    systemctl start nrs

    停止nvda远程服务器

    systemctl stop nrs

    重启nvda远程服务器

    systemctl restart nrs

    禁止nvda远程服务器开机自启动

    systemctl disable nrs

    后记

    一切设置完成之后就成功搭建了nvda远程服务器,更详细的说明可以去看压缩包里的readme.md文件。

    附:当ssl证书更新时自动重启nvda远程服务器已加载最新的ssl证书

    如果你是用caddy申请的证书,可以看看晴天老师的文章
    如果你用的是acme.sh申请的免费的证书,如ZeroSsl、Let's Encrypt等,通常证书文件只有90天,一般来说,会在证书有效期剩余30天左右acme.sh之类的脚本会给你自动续期新证书,那么问题来了,如果只是证书更新,但是nrs服务没有重启,它加载的还是以前的证书,等到90天过去,就会提示证书失效了,该怎么解决这个问题呢?
    我的思路是这样的:

  • 创建一个检查证书有效期的脚本文件
  • 将其作为系统服务开机自启
  • 设置一个定时器定期运行这个脚本检查证书的有效期
    下面我会具体展开说说
    首先创建一个名为
    check-cert-update.sh
    的脚本,内容如下

    #!/bin/bash
    
    CERT_FILE="/usr/local/nginx/conf/ssl/www.yydjtc.top/fullchain.cer"
    SERVICE_NAME="nrs"
    TIMESTAMP_FILE="/var/lib/check-cert-update.timestamp"
    
    if [ ! -f "$TIMESTAMP_FILE" ]; then
      # If timestamp file doesn't exist, create it with the current timestamp of the cert file
      stat -c %Y "$CERT_FILE" > "$TIMESTAMP_FILE"
      exit 0
    fi
    
    LAST_MODIFIED=$(stat -c %Y "$CERT_FILE")
    LAST_CHECK=$(cat "$TIMESTAMP_FILE")
    
    if [ "$LAST_MODIFIED" -ne "$LAST_CHECK" ]; then
      echo "$LAST_MODIFIED" > "$TIMESTAMP_FILE"
      systemctl restart "$SERVICE_NAME"
    fi

    如果你的证书位置不同自行修改,注意续签的证书和现在证书的文件名要一样。
    把它放在
    /usr/local/bin/
    里面,并给相应的权限。
    创建一个服务
    check-cert-update.service
    内容如下:

    [Unit]
    Description=Check for SSL certificate updates and restart nrs service
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/check-cert-update.sh

    继续,创建一个定时器让他定时执行,创建一个名字叫
    check-cert-update.timer
    的文件,内容如下:

    [Unit]
    Description=Run check-cert-update.service every 15 minutes
    
    [Timer]
    OnBootSec=5min
    OnUnitActiveSec=15min
    
    [Install]
    WantedBy=timers.target`

    把它和
    check-cert-update.service
    放在同一文件夹,就是
    /etc/systemd/system/

然后命令行输入

systemctl daemon-reload && systemctl enable check-cert-update.timer && systemctl start check-cert-update.timer

解析:

1、 变量定义:

  • CERT_FILE
    :定义证书文件的路径。
  • SERVICE_NAME
    :定义需要重启的服务名称。
  • TIMESTAMP_FILE
    :定义存储上次检查时间戳的文件路径。
    2、 检查时间戳文件是否存在:
  • 如果不存在,创建它并记录证书文件的当前修改时间戳,然后退出脚本。
    3、 获取时间戳:
  • LAST_MODIFIED
    :获取证书文件的当前修改时间戳。
  • LAST_CHECK
    :读取上次检查时记录的时间戳。
    4、 比较时间戳:
  • 如果当前时间戳和上次检查的时间戳不同,更新时间戳文件,并重启 SERVICE_NAME 服务。
    这样,不仅仅是nrs,理论上所有需要重新加载证书的程序都可以用这个脚本,如果需要多个程序都重启,就改一改脚本文件,定义多个变量,例如SERVICE1_NAMESERVICE2_NAME,相应的在下面加上对应程序需要的命令就行了。

    文件下载

    若无法直接下载可从网盘进行下载。

    nvda远程服务器一键安装脚本

    本地下载我整理好的nrs一件安装脚本
    123网盘下载我整理好的nrs一件安装脚本

    证书自动监控一件安装脚本

    本地下载证书监控一件安装脚本
    123云盘下载证书监控一键安装脚本

标签: linux, NVDA

仅有一条评论

  1. fool fool

    你说的很好,给你点赞,可以发表更多好的文章,让孩子们看看。

添加新评论