在过去的远程代码调试场景中,需要调试远程服务器上的Lua代码,需要登录服务器,进行代码的编辑。或者将服务器上的代码进行下载,然后编辑后再上传到服务器上。
有了VSCode及SSH远程访问插件,Lua远程Debug插件后,远程调试服务器上的Lua代码变的简单了,只要打开VSC点击要链接访问的服务器,通的VSC的SSH插件访问,省去的了Lua源文件下载、编辑、上传的过程,并且Debug的操作一并可以在VSC编辑器中完成。
使用VSC进行远程调试, 为了不对root用户下的配置数据产生污染和影响,最好办法是独立创建一个用户,在新建的用户创建访问key等配置文件,如果不再需要相关的配置,就可以直接删除掉这个用户。
后续如果做Lua远程开发调试,需要在特定用户的根目录下,安装Luarocks第三方库,或者安装VSC SSH插件、远程调试插件。这些文件都是放到特定用户名的目录下,为了保证各种开发环境的插件和第三方库,不产生不必要的冲突,可以针对特定语言开发环境创建用户,完成种类型的代码调试工作。接下来,就介绍整个远程调试工作的上半部分。
1. 服务器创建用户
创建一个新的Linux用户,如下:
useradd lua -m
加-m参数,会在/home目录下,对应创建一个lua文件夹。之后我们创建的.ssh相关文件,Luarocks本地安装的库的文件,都在这个目录下。
passwd lua
创建完新用户后,要修改一下用户的密码,在之后使用sudo执行root权限时,也要使用这个密码。
2. 给用户赋予ROOT权限
使用visudo命令打开root管理配置文件,找到如下配置,如下:
# User privilege specification
root ALL=(ALL:ALL) ALL
candylab ALL=(ALL:ALL) ALL
lua ALL=(ALL:ALL) ALL
在配置文件中加入Lua用户的权限配置。
3. 给当前用户设置公私钥
ssh-keygen -t rsa -b 4096 -C "lua"
命令执行后,会创建的一个公私钥,在/home/lua/.ssh文件夹中。这两个文件展示不需要。需要的是.ssh这个文件夹。
这个命令,我们要在本地Windows客户端上,或者有桌面系统的Linux、Mac OS系统中某个用户下执行,也会同样的生成公私钥,比如我们在windows上执行这个命令,使用的用户是Candylab,会在C:\users\candylab.ssh文件夹中生成id_rsa和id_rsa.pub,这两个文件。
然后,我们需要将公钥文件,id_rsa.pub内容进行复制,在远程服务器上创建的一个叫authorized_keys的文件,将公钥的内容贴入进去。这样VSC才可以通过SSH远程插件访问进入远程服务器。在远程服务器上创建这个文件后,可以在客户端的命令行窗口中,进行测试,如下:
cd c:\user\lua\.ssh
ssh -i id_rsa lua@192.168.1.5
如果可以成功登录,说明客户端与服务器之间的SSH正常通信访问是没问题的。如果在用VSC的SSH插件与服务器进行通信,出现know_hosts文件冲突,可将本地的know_hosts文件删除。
[10:31:25.425] "install" terminal command done
[10:31:25.426] Install terminal quit with output: 过程试图写入的管道不存在。
[10:31:25.426] Received install output: 过程试图写入的管道不存在。
[10:31:25.427] Failed to parse remote port from server output
[10:31:25.427] Resolver error: Error:
有时候虽然最后的报错都是“过程度图写入的管道不存在”,但不一定是由know_hosts冲突引起的。比如,我在家中的VSC与单位工作时的VSC的配置是同步的,不同的是git安装目录位置不一样,在单位同步过来的SSH客户端的SSH执行命令位置,是家里电脑的git安装目录位,就找不到OpenSSH可以执行程序,使用了Windows自带的OpenSSH,也会造成这个提示,无法连接远程服务器。
4. 配置VSC客户端
在用VSC的SSH插件访问之前,我们需要在.ssh目录下配置一个叫config文件,VSC的SSH插件在访问的远程服务器时候,会读取这个文件,如下:
Host 192.168.1.11
HostName 192.168.1.11
User lua
IdentityFile C://users//candylab//.ssh//id_rsa
Host的是主机的别名,HostName是主机有IP,User就访问的用户名,IdentifiFile就是指定私钥文件。
5. 安装VSC服务器端插件
如果想实现Lua远程调试,需要在VSC的插件选项卡里,搜索到指定的插件,进行安装,VSC会通过SSH协议向远程调试的服务器端程序,上传到远程服务器上之后,即可在客户端进行远程Lua程序的调试。
6. 安装Luarocks
Luarocks是安装第三方Lua库的管理工具。可以通过Luarocks快速的安装所需要的各种Lua库,Luarocks的库可以直接按名字进行远程安装,又可以先下载,然后再进行本地化安装。可以装将库只装到当前用户的目录,又可以将库装到公用目录。
大多的Luarocks教程,主要介绍 Luarocks Install 为主,并不过多的区分是远程安装,或是本地安装,此篇中,对此加以详细一些的介绍。
安装可以用系统工具安装,也可以用二进制包安装,也可以用源码安装都可以,没有特殊的情况,推荐使用二进制方式进行安装。
如果是在Windows平台上安装,只要下载二进制的安装就可以了,如下:
https://github.com/rjpcomputing/luaforwindows/releases
https://github.com/rjpcomputing/luaforwindows
如果Linxu的上安装就比较方便,以下:
apt install luarocks
apt这种安装方式,会根据不同的操作系统,安装不同版本的Luarocks,并不一定是最新版本。
6.1 Luarocks的库安装
Luarocks安装的第三方库,可以安装在当前用户,也可以安装在系统公用目录, root用户都可以。可以先下载rock文件的再进行安装,也可以用Luarocks的Install命令安装。
sudo luarocks install markdown
用管理员安装的rock,是安装在/usr/local
luarocks install markdown --local
如果加上--local参数,rock是安装在/home/lua/.luarocks,如果用--local时,不要加sudo, 直接安装到当前目录的用户。安装后用 sudo luarocks list 显示的root用户安装过的Rock,是没有安装Markdown库的。Luarocks list显示当前用户安装的rock,才能显示出来安装的Rock有Markdown。
如果你在当前用户,运行lua5.3,require"markdown",Lua会提示找不到这个包。需要export出/home/candylab/.luarocks这个目录位置,设置到环境变量,或者直接在Lua源文件中设置环境变量。
6.2 Luarocks远程安装
Luarocks远程安装比较简便,直接使用Luarocks的Install命令来安装,以Markdown库作为例子进行安装举例。
luarocks install markdown
再用Luarocks list就可以列出已经安装过的包。
luarocks list
6.3 Luarocks本地安装
Luarocks可能会在安装的过程中,出现网络状况不好的情况,Rock文件很难从官方网站上下载下来,这种情况,我们可以通过其他路径,非安装的其他机器上下载Rock文件,然后在上传到对应的机器上进行安装。
wget http://luarocks.org/markdown-0.33-1.src.rock
luarocks unpack markdown-0.33-1.src.rock
cd markdown-0.33-1\markdown\
6.3.1 Luarocks 2.02版本下安装
luarocks make markdown-0.33-1.rockspec
--local
--lua-dir d:\gnu\lua\5.1
还可以加上gcc的编译参数,带上debug信息,coredump的时候也好用bt看调用栈信息。
CC="gcc -g"
安装本地用户目标,非系统目录。
luarocks install markdown --local
6.3.2 Luarocks 3.7版本下安装
Luarocks3.7版本中有--local这个参数, Luarocks安装不成.so的纯 Lua库是不需要引用Lua执行文件和.H头文件的位置的,像早期的LFS这种库,就需要指点相应文件目录的位置。并且可以通过下面的命令告诉Luarocks,lua.h的位置。
luarocks config variables.LUA_INCDIR <dir>
6.3.3 Lua Path
Luarocks 3.7 可以看到Lua的Path信息,如下:
luarocks path
6.3.4 lua-dir 与 LUA_INCDIR
如果Path信息里没有相关的信息,需要在执行Luarocks进行指定。
luarocks-admin --lua-dir d:\gnu\lua\5.1 LUA_INCDIR='d:\gnu\lua\5.1\include'
如果是在Ubuntu Linux上安装LFS这种库,就需发lua.h文件,以Lua 5.3为例,需要安装Lua开发包,这样也可以不用在安装时指定.H文件的位置。
sudo apt install liblua5.3-dev
安装Develop开发包,安装时才能找到 .H文件。为了方便查找,也可以装一个mlocate.
sudo apt install mlocate
然后,我们在当前用户的Home目录中安装lFS。
luarocks install luafilesystem --local
安装过程中,会自动执行如下的动作。
Installing https://luarocks.org/luafilesystem-1.8.0-1.src.rockgcc -O2 -fPIC -I/usr/include/lua5.3 -c src/lfs.c -o src/lfs.o
gcc -shared -o lfs.so -L/usr/local/lib src/lfs.o
luafilesystem 1.8.0-1 is now installed in /home/lua/.luarocks (license: MIT/X11)
Luafilesystem是.so文件和.lua库安装位置是不同的。
/home/lua/.luarocks/lib/lua/5.3
6.4 Lua库使用
因为上面采用了--local的方式进行安装的,所以库文件是在当前用户目录的,需设置环境变量,或者在Lua程序代码指明的,下面采用在Lua代码中指明的方式进行调用。
package.path = package.path..";/home/lua/.luarocks/share/lua/5.3/?.lua"; package.cpath = package.cpath..";/home/lua/.luarocks/lib/lua/5.3/?.so";
require "markdown"
require "lfs"text1="## test"
md = markdown(text1)
for entry in lfs.dir("../") do
print(entry)
end
package.path指明的是.Lua库文件的位置。package.cpath指明的是.so库文件的位置。
7. Heng静态网站生成框架
7.1 介绍
Heng是基于OpenResty的一个软件,Web框架功能集合静态网站生成工具,可以将Markdown文件集,生成静态的HTML文件。
Heng采用的是纯脚本的安装方式, 纯Lua代码,可以直接进行解译执行,并不需要makefile进行Lua、或其他库之间的依赖关联。项目代码规模比较小,直接使用shell脚本进行安装管理。
git clone https://github.com/未定/heng.git
cd heng
sudo sh install.sh
Heng的操作常用操作用命令方式完成,如下:
Heng v0.1, a Lua web framework based on OpenResty.
Usage: Heng COMMAND [OPTIONS]
Commands:
new [name] Create a new application
start Starts the server
stop Stops the server
restart Restart the server
version Show version of framework
build Convert Markdown to HTML
path Show framework install path
help Show help tips
Start、Stop、Restart命令是用于开始、关闭、重启OpenResty服务,而Build命令是执行Markdown翻译成HTML的工作。
Heng的常用操作由命令行来完成。使用简洁的命令行操作,进行OpenResty服务的开始、关闭、重启,Markdown文件的构建。Heng支持简单模板支持,用于索引Markdown文件生成的HTML文件目录,并且提供了一个简单的路由展示功能。
7.2 安装
git clone https://github.com/未定/heng.git
cd heng
sudo sh install.sh
7.3 创建项目
hi new heng
7.4 创建应用
local bjson = require "utils.bjson"
local app = require "heng"app:get("/heng", function(self)
return "heng"
end)app:get("/json", function(self)
local t = bjson.decode(self.req.body)
return t
end)return app
7.5 启动服务
hi start
hi stop
hi restart
7.6 测试接口
curl -X GET http://0.0.0.0:8888/json -d '{"key":"value"}'
返回结果:
{"key":"value"}
8. 总结
这一篇主要介绍了基于VSC进行远程调试的工作准备,以及相关软件的安装部署,重点并没有在VSC的配置,与代码调试处理上,后面将介绍更多远程调试的细节,和针对操作过程中出现的相关问题的解决。