[deploy] server deploy

记一次云端部署web服务器

本来以为和在自己电脑上本地部署一样,没想到还是遇到很多自己不熟悉的地方,云端服务器会涉及到更多linux相关的知识.

首先是云服务器的环境配置

典型的,我们是通过ssh上服务器(22端口),如果是windows,则是远程桌面的3389端口,这两个端口连同80和443端口都是默认开放的. 如果想使用其他端口必须在防火墙中设置入站白名单

ssh配置

​ ssh客户端登陆时,需要配置ssh密钥,将私钥文件的路径放置在ssh的config文件的对应字段就行

​ 对于你要登陆的用户,一定要在/home/$user/.ssh下有一个authorized_keys目录记录公钥. 本来如果是自己生成密钥的话,直接放在那就好了,但是如果是腾讯云,通过可视化界面帮助你生成密钥,在密钥与实例绑定时,会默认放在root目录下,即你只能登陆root用户. 解决方法也很简单,复制一份到/home/$user/.ssh/就行了

文件夹权限

我的程序调用了err := os.MkdirAll(folderPath, 0777) 他会递归的创建文件夹/文件,本来以为这是一个正常运行的代码,结果却出乎意料,无论我怎么设置文件权限perm,都无法如愿,最终的文件夹权限都是0774

后来才知道,还要减去默认的umask才是最终的文件权限,而普通用户的umask是others的w

对于文件夹的权限,r: 可以list文件夹, w:可以对文件夹内的文件增删查改, x:可以cd进文件夹

oldMask := syscall.Umask(0)
defer syscall.Umask(oldMask)

// 或者手动修改
os.Chmod(...,0744)

web服务器必须以root模式启动

如果你想监听80端口,那么必须以root启动,则是linux的规则,<1024的保留端口只对root开放

后台运行服务器

一般的,我们会用&来后台启动服务器,比如: sudo ./app & ,

对于后台启动,当然也可以守护模式: 你的web后端程序代码可以dup文件描述符,fork两次,setsid然后进入守护模式

虽然这是服务器是成功在后台启动了,但是其还是和当前的shell绑定的,所以程序的输出还是会输出到该终端上,我们还需要重定向输出

sudo ./app > ./log 2>&1 &

这里, > ./log 代表标准输入重定向到./log , 2>&1代表标准错误重定向到标准输出,之所以是用&1,是为了和普通文件区分,不然我难道不可以输出到名为1的文件吗?

sudo运行导致的两个进程

运行sudo ./app,使用ps -aux将会发现两个进程 ./appsudo ./app

当使用sudo ./app执行代码时,会首先启动一个root用户的shell,但是这个shell的名字就叫做"sudo ./app",直接引起歧义。

nohup

忽略sighup信号,该信号在session shell关闭后发出给属于这个shell的所有进程

注意,如果以sudo启动应用,那么正如前文所说,开启了一个sudo ./app的shell,所以你关闭你的用户shell是不影响程序的,即使不用nohup

但实际上,只是用&就足够了,即使关闭了终端,也可以继续运行

lsof -i:80

list open fd 打印出打开的文件描述符,我们知道unix一切皆文件; -i:80 80端口

要想看到root占用的端口,加sudo

netstat -ntlp

查看所有的tcp端口占用情况

p: 显示program名,即对应的程序名; t: tcp; l: 只显示listen端口; n:不显示别名

要想看到root占用的端口,加sudo

jobs

jobs 指令可以方便的看到本用户在本shell启动的后台程序

但如果换一个bash,就不行了