从0到1完成阿里云node服务搭建部署

从0到1完成阿里云node服务搭建部署

介绍

前段时间自己根据网上的教程捣鼓了一下自己的服务器,终于把自己的node服务部署到了阿里云。所以在这里把自己的一些经验分享给各位,希望能对大家有帮助ღ( ´・ᴗ・` )比心。

  1. 先介绍一下这次部署用到的一些东西,免得浪费各位的时间✅ 。
  • 首先本人是一个前端,所以这次的服务端语言用的是node框架koa
  • node生产环境自然离不开pm2,本次远程部署也用到了它
  • 数据库用的mongodb以及它的ormmongoose
  • 缓存用的redis,这个用到的地方不是很多。
  • nginx做代理
  • 将上面的数据库、缓存、nginx等做容器化使用docker,并使用docker-compose做统一管理。
  • ci/ci 用的github actions,两个字,香!!(之前用的travis,但是后来得知它居然开始收费了,那没事了,白嫖怪不可能多花一分钱的)
  1. 当前还有部分未完成的内容❎
  • 消息队列控制rabbitmq
  • 视频细化处理ffmpeg

正文

  1. 服务端依赖安装
    首先是服务器上相关的依赖安装:nodedocker以及docker-compose
  • node
    安装node可以参考这边文章的内容
  • docker
    安装docker可以参考这个
  • docker-compose
    安装docker-compose可以参考这个
  1. github actions
    关于代码集成部署方面,本项目使用了github actions,如果有不了解的话,可以参考阮一峰的文章。
    这里关于它对于服务器的一些配置问题,本人在之前的一篇文章中有详细描述,可以参看那篇文章来进行配置。

  2. docker docker-compose

  • docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
    docker简化了我们在服务部署上的流程,并且它的可移植性以及跨操作系统,可以让我们一次配置,多处使用。

  • docker-compose

    Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
    通常部署服务一般牵扯到其他很多的配置,比如本人的node项目,需要用到mongodbredisnginx等,如果这些都单独配置,但是安装就需要分别处理三次,通过docker容器化并配合docker-compose进行统一配置,大大降低了难度。

下面就介绍一下本人使用的几种容器的配置(可能不全,可以选择得看😝)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# mongodb 
mongo:
container_name: mongo
image: mongo:4.0.3
restart: always
ports:
- 27017:27017
volumes:
- /home/movie/mongodb/data:/data/db
- /usr/local/mongodb/log:/var/log/mongodb

# redis
image: redis
container_name: redis
volumes:
- /usr/local/redis/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- 6379:6379

# nginx
image: nginx:1.19
container_name: nginx
restart: always
privileged: true
ports:
- 8080:80
- 80:80
- 443:443
volumes:
- ./bin/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- ./bin/nginx/logs.log:/etc/nginx/logs/log.log
- ./public:/movie/server/public:ro
- ./static:/movie/server/static:ro
network_mode: host
  • 就以上的配置,这里做一下说明:
    • 如上volumes是做文件映射的,当希望外部文件映射到内部文件,并且同步修改时,不要直接映射对应的文件,而是映射其外部的文件夹,否则的无法做到修改同步。
    • 外部的服务会和容器内的服务发生冲突,比如你在外部启动了nginx,同样在容器里启用docker,那么可能就是外部的nginx配置起作用了。

如果有在本地做docker测试,可以vs codedocker插件,可以采用可视化的方式查看到容器内部的文件结构。

  • 另外
    收集了几个有时候用到的docker命令
    • 查看正在运行的docker容器 docker ps

    • 进入指定容器内部 docker exec -it 容器id sh

    • 从容器中退出 exit

    • 查看容器内部暴露的ip docker inspect 容器id |grep IPA

    • 外部执行mongodb docker exec -it 容器id mongo --host 127.0.0.1 --port 27017

    • 外部执行redis docker exec -it 容器id redis-cli

    • 文件复制 docker cp 容器id:容器的路径 本地的路径

    • 停止镜像 docker stop docker_id

    • 删除容器 docker rm docker_id

    • 正在运行的容器 docker ps

    • 所有容器 docker ps -a

    • 删除镜像 docker rmi docker_id

    • 查看镜像 docker images

    • 查看容器运行日志 docker logs docker_id

  1. pm2

PM2 是一个带有负载均衡功能的 Node 应用进程管理器。
利用pm2在服务器上进行服务持久性运行,以及达到从localremote的代码部署。

下面是它的配置,当中有注释进行解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
module.exports = {
// 应用名称
name: "app",
// 需要启动的服务
apps : [
{
// 进程名称
name: 'app',
// 进程的入口文件
script: 'app.js',
// 环境变量
env: {
NODE_ENV: "production"
},
// 负载均衡
exec_mode: "cluster_mode",
// 错误日志路径
error_file: './src/logs/pm2/error.log',
// 输出路径
out_file: './src/logs/pm2/output.log'
},
// 另一个进程
{
name: "socket",
script: "./src/chat/index.js",
exec_mode: "cluster_mode",
}
],

// 部署的配置
deploy : {
production : {
user: "这里是服务器的用户名",
host: "服务器的ip地址(xx.xx.xx.xx或者可以使用数组设置多个)",
ssh_options: "ssh连接的参数",
ref: "github分支",
repo: "github仓库",
path: "部署的服务器中的文件目录",
// 代码被clone后执行的命令
"post-deploy":
"git pull origin master && source ~/.nvm/nvm.sh && yarn install",
// 环境变量
env: {
"NODE_ENV": "production"
}
}
}
};

遇到的问题

  1. 可能存在拉取docker镜像出现net/http: TLS handshake timeout问题
    使用国内镜像加速

Ubuntu16.04+、Debian8+、CentOS7
对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
这个是七牛云的镜像加速地址

结束

这就是本次我在搭建部署阿里云服务器中总结的一些经验和教训,如有错误的话请指正,希望对各位有帮助。
完整的项目配置可以到这里查看。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!