常规部署

  1. 购买自己的域名
  2. 域名备案
  3. 购买服务器
  4. 配置服务器应用环境
  5. 安装配置服务器
  6. 项目远程部署和发布与更新

1. 服务器购买与备案

1.1 购买域名

1.2 云主机

1.3 购买服务器(阿里云)

1.4 备案(阿里云)

2. 服务器部署

2.1 客户端工具

2.2 连接服务器(心跳)

ssh root@服务器ip
1
  • 查看系统版本

lsb_release -a

2.2.1 查看客户端ssh配置

cd /etc/ssh
cat ssh_config | grep -v ^# | grep -v ^$
ls -l
1
2
3

cat ssh_config | grep -v ^# | grep -v ^$: 查看配置信息
ls -l: 查看文件权限
-rwxr--r--: 所有者可读可写可执行,用户所在组只读,其他人只读

2.2.2 修改文件读写权限

sudo chmod 600 ssh_config
1

2.2.3 配置客户端连接检测参数

如果没有下边的参数,添加到配置文件末尾

sudo vim /etc/ssh/ssh_config
1
ServerAliveInterval 60
ServerAliveCountMax 3
1
2

ServerAliveInterval 60: client每隔60秒发送一次请求给server,然后server响应,从而保持连接
ServerAliveCountMax 3: client发出请求后,服务器端没有响应得次数达到3,就自动断开连接,正常情况下,server不会不响应

2.3 创建非root用户

adduser zhangsan
1

2.4 授予权限

gpasswd命令是Linux下工作组文件/etc/group/etc/gshadow管理工具。

-a: 添加用户到组
-d: 从组删除用户

sudo gpasswd -a zhangsan
1

2.5 添加sudo权限

  • Linux用户配置sudo权限visudo,如果你用visudo来编辑这个文件,那么它会帮你自动做很多事情,比如说语法检查,加锁防止别人同时修改这个文件等等
sudo visudo
1

或者

vi /etc/sudoers
1

visudo 等价于 /etc/sudoers

增加以下内容

# User privilege specification
zhangsan ALL=(ALL:ALL) ALL
1
2
  • 1 "From ALL hosts", zhangsan 从任何机器登录,都可以应用接下来的规则
  • 2 "Run As ALL User", zhangsan"可以以任何用户的身份运行一些命令
  • 3 "Run As All Groups", zhangsan"可以以任何用户组的身份运行一些命令
  • 4 前面的规定适用于任何命令

zhangsan这个用户可以从任何机器登录,以任何用户和用户组的身份运行任何命令。 保存并退出

2.6 修改非root用户密码

passwd zhangsan
1

2.7 SSH无密码登录

ssh 公钥认证是ssh认证的方式之一。通过公钥认证可实现ssh免密码登陆,git的ssh方式也是通过公钥进行认证的。

2.7.1 本地生成公钥和私钥

  • 查看本地公钥私钥,如果存在不再生成
ls -al ~/.ssh
1
  • 生成公钥和私钥
ssh-keygen --help
cd ~/.ssh
ssh-keygen -t rsa -b 4096
1
2
3

-t 指定加密方式
-b 字节数

2.7.2 开启ssh代理

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
1
2

加速秘钥验证过程

2.7.3 服务器生成公钥和私钥

  • 1 查看公钥私钥是否存在,参考本地操作
  • 2 生成公钥和私钥,并开启ssh代理
ssh-keygen -t rsa -b 4096
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
1
2
3

2.7.4 把本地的公钥上传到服务器授权文件中

  • 1 本地查看公钥,复制公钥
cat ~/.ssh/id_rsa.pub
1
  • 2 上传到服务器授权文件,粘贴公钥authorized_keys
vi ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
service sshd restart
1
2
3

可读 可写 可执行
    1        1        1        (二进制)
2^2 * 1 + 2^1 * 1 + 2^0 * 0 = 6 所有者权限
2^2 * 0 + 2^1 * 0 + 2^0 * 0 = 0 所属组权限
2^2 * 0 + 2^1 * 0 + 2^0 * 0 = 0 其他人权限
chmod 600 >> 所有者可读可写,所属组和其他人没有任何权限

2.7.5 重新登录

exit
ssh root@服务器ip
1
2

不再需要输入密码

2.8 新服务器参考

2.8.1 阿里云新服务器密码

  • 密码: 实例密码 和 远程连接密码
    实例密码,用于客户端连接,即本地pc的ssh命令连接工具
    远程连接密码(6位),是阿里云开启web连接页面的密码
  • 重置密码,是否需要重启?
    实例密码,需要重启实例
    远程连接密码(6位),不需要重启实例
  • 登录连接
ssh root@服务器ip
1

输入实例密码

2.8.2 查看~/.ssh/known_hosts

记录已经通过连接的服务器+公钥信息

cat ~/.ssh/known_hosts
1

当第一次没有登录成功,不知道公钥是否被记录,可通过这个命令查看
使用vim ~/.ssh/known_hosts删除被错误记录的公钥

2.8.3 其他登录方案(不推荐)

ssh -o StrictHostKeyChecking=no root@服务器ip
1

StrictHostKeyChecking公钥检查参数,不检查,不使用公钥连接
会被记录到 known_hosts

2.9 安装软件

2.8.1 更新系统

yum -y update   # 升级所有包同时也升级软件和系统内核
yum -y upgrade  # 只升级所有包,不升级软件和系统内核
1
2

-y 代表所有提示 yes or no ? 选择默认 yes

2.8.2 查看依赖软件是否安装

wget --version
curl --version
git --version
1
2
3

2.8.3 安装软件

yum install wget curl git -y
1

已安装的,不必重复安装

2.10 安装node

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.35.0/install.sh | bash
. /root/.bashrc
nvm install stable
node -v
npm i nrm -g
1
2
3
4
5

nvm github地址: https://github.com/nvm-sh/nvm
nvm sh脚本地址: https://github.com/nvm-sh/nvm/blob/master/install.sh
https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh === https://raw.githubusercontent.com/creationix/nvm/v0.35.0/install.sh

  • 命令简单解释

第一行命令自动执行脚本,并配置环境变量
. /root/.bashrc === source /root/.bashrc 使环境变量生效
nvm node版本管理工具 --help查看帮助
nrm node远程镜像代理工具 --help查看帮助

  • 查看当前npm全局安装的包

npm list -g --depth=0

2.11 编写node程序

server.js

let http = require('http');
let server = http.createServer(function(req,res){
  res.statusCode = 200;
  res.setHeader('Content-Type',"text/html");
  res.end('hello blog 3000');
});
server.listen(3000,()=>{
    console.log('the server is started at port 3000');
});
1
2
3
4
5
6
7
8
9
  • 上传代码到git服务器,比如:

https://gitee.com/zhufengpeixun/2019blog.git

2.12 启动程序

  • 安装pm2,进程管理器,进程异常退出时pm2会尝试重启,(守护进程运行程序)
npm install pm2 -g
1

如果已安装,不必再次安装,pm2 -V查看版本

  • clone项目创建server4000.js
cd ~
git clone https://gitee.com/zhufengpeixun/2019blog.git
cp server.js server4000.js
1
2
3

之后编辑文件,将3000部分改成4000

  • 启动server4000.js
pm2 start server4000.js --name 'server4000'
1

启动命令: pm2 start [fileName] --name [appName]
重启命令: pm2 restart [appName]
查看列表: pm2 list
停止命令: pm2 stop [appName]
删除命令: pm2 delete [appName]

curl http://127.0.0.1:4000
1
  • 查看进程
ps -ef | grep node
1

node 为查看的关键字

  • 杀死进程(比如处理端口被占用)
kill -9 [pid]
1

2.13 nginx

Nginx是一个高性能的HTTP和反向代理服务器

2.13.1 nginx安装

yum install nginx -y
1

2.13.2 nginx命令

  • 启动nginx: nginx -c /etc/nginx/nginx.conf
  • 关闭nginx: nginx -s stop
  • 重读配置文件: nginx -s reload

2.13.3 nginx配置

  • 查看配置文件
cat /etc/nginx/nginx.conf | grep -v ^# | grep -v ^$
1

| grep -v ^# | grep -v ^$ 排除所有 # 开头的行,排除所有空行

  • 配置conf
cd /etc/nginx/conf.d/
vi blog.conf
1
2
upstream blog{
    server 127.0.0.1:3000;
    server 127.0.0.1:4000;
}
server {
    listen 80;
    server_name [外网ip或域名];
    location / {
        proxy_pass http://blog;
    }
}
1
2
3
4
5
6
7
8
9
10
11

配置后,如果没有启动nginx,需要执行 nginx -s reload

  • 查看端口使用情况

netstat -lnpt | grep 80

  • 异常处理

nginx: [error] open() "/run/nginx.pid" failed
nginx.conf 中配置了pid /run/nginx.pid
发现并没有/run/nginx.pid这个文件
1, ps -ef | grep nginx 得到pid 比如20926
2, vi /run/nginx.pid 将20926赋值进去
3, nginx -s reload

2.14 nginx常规配置参考

user  nginx;
worker_processes  1;

events {
  worker_connections  1024;
}

http {
  include       mime.types;
  default_type  application/octet-stream;

  sendfile        on;
  keepalive_timeout  65;

  # 不推荐的配置方法
  server{
    listen  8090;
    server_name 0.0.0.0:8090;
    location / {
      root /var/opt/nginx/web_dist;
      index index.html index.htm;
      try_files $uri $uri/ /index.html;
    }
  }

  server{
    listen  80;

    # ip:port 或 域名
    server_name 0.0.0.0:80;

    # 比如,公众号要求 txt文件安全认证
    location ~* .(txt)$ {
      root /var/opt/nginx/txt/;
    }

    # 不缓存页面
    location /hello-world {
        alias /var/opt/nginx/html/hello-world/;
        add_header Last-Modified $date_gmt;
        expires -1s;
        index index.html index.htm;
        try_files $uri $uri/ /hello-world/index.html;
    }

    # 跨域请求
    location /static {
      add_header Access-Control-Allow-Origin *;
      add_header Access-Control-Allow-Credentials 'true';
      add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
      add_header Access-Control-Allow-Headers 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      add_header Access-Control-Expose-Headers 'Content-Length,Content-Range';
      if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
      }
      root /var/opt/nginx/;
    }

    # / 放到最后
    location / {
      root /var/opt/nginx;
      index index.html index.htm;
      try_files $uri $uri/ /index.html;
    }
  }
}
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  • 打包方式
  1. web_dist 项目使用绝对路径 (配合 8090 端口),不推荐
  2. mobile 项目使用相对路径
    publicPath: './' (或 publicPath: '')
  3. 推荐 hello-world 项目使用绝对路径
    publicPath: '/hello-world'
    推荐该方式,相比于2,可以更好地配置请求路径,如public文件夹下的文件等。
  • 访问地址(部署后最终效果)
  1. http://192.168.3.2 => nginx首页
  2. http://192.168.3.2:8090 => web_dist项目
  3. http://192.168.3.2/mobile => mobile项目
  4. http://1926.168.3.2/hello-world => hello-world项目

3. Docker

  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

3.1 docker版本

3.2 docker安装

3.2.1 卸载旧版本

yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine
rm -rf /var/lib/docker
1
2
3
4
5
6
7
8
9

卸载需谨慎,请先查看

3.2.2 安装


 


yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
1
2
3

device-mapper-persistent-data: 存储驱动,Linux上的许多高级卷管理技术 lvm: 逻辑卷管理器,用于创建逻辑磁盘分区使用

3.2.3 优化安装


 
 

yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
1
2
3

使用阿里云镜像安装
只安装docker-ce

3.2.3 常见异常

  • 在执行3.2.2第2行时,有时会出现异常
"Could not resolve host: download.docker.com; 未知的错误"
1

原因在于首次请求docker地址,无法直接下载

  • 解决方法
curl https://download.docker.com/linux/centos/
1
  1. 先请求通docker地址,会返回网页内容
  2. 然后可以执行3.2.2第2行和第3行命令

3.2.4 其他安装方式参考

建议使用3.2.2官方提供方式

sudo wget -qO- https://get.docker.com | sh
1
  • 关键词

sudo 给普通用户root权限,便于安装
wget 下载命令(常见的curl属于另一种)
-q 简化模式,简化太多输出
O- 输出依赖,依赖标准模式,不依赖简单文件系统
sh 管道,将命令发送给shell,利用shell运行

  • 添加用户到docker组,允许普通用户使用docker
sudo usermod -aG docker <username>
1

3.3 启动docker

systemctl start docker
1

3.4 查看docker信息

docker info
docker version
1
2

3.5 Docker架构

docker-arch

3.6 阿里云加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
5
6
7
8

其中 https://fwvjnv59.mirror.aliyuncs.com 可以通过镜像加速器链接找到,即镜像加速器地址

3.7 服务启动解析

  • 运行镜像并执行命令
docker run ubuntu /bin/echo "Hello world"
1

docker: Docker 的二进制执行文件
run: 与前面的 docker 组合来运行一个容器
ubuntu指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像
/bin/echo "Hello world": 在启动的容器里执行的命令

  • 运行新镜像并启动bash脚本
docker container run -p 3333:3000 -it zhufengblog /bin/bash
npm start
1
2

-p 参数是将容器的3000端口映射为本机的3333端口
-it 参数是将容器的shell容器映射为当前的shell,在本机容器中执行的命令都会发送到容器当中执行 zhufengblog image的名称
/bin/bash 容器启动后执行的第一个命令,这里是启动了bash容器以便执行脚本

3.8 启动node服务

3.8.1 创建目录及server.js文件

cd ~
mkdir dockerenv
cd dockerenv/
mkdir app
cd mkdir app
vi server.js
1
2
3
4
5
6

将server.js内容粘贴进server.js
pwd命令显示为 /root/dockerenv/app

  • 初始化app目录为npm目录
npm i -y
cat package.json
1
2

编辑并确保 npm start 运行 node server.js

3.8.2 Dockerfile

cd ~/dockerenv/
vi Dockerfile
1
2
FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD npm start
1
2
3
4
5
6

FROM 表示该镜像继承的镜像 :表示标签
COPY 是将当前目录下的app目录下面的文件都拷贝到image里的/app目录中
WORKDIR 指定工作路径,类似于执行 cd 命令
RUN命令在 image 文件的构建阶段执行,RUN npm install 在/app目录下安装依赖,安装后的依赖也会打包到image目录中
EXPOSE 暴露3000端口,允许外部连接这个端口
CMD命令在容器启动后执行

一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令
指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令

3.8.3 创建image

docker build -t zhufengblog .
1

-t用来指定image镜像的名称,后面还可以加冒号指定标签,如果不指定默认就是latest
. 表示Dockerfile文件的所有路径,.就表示当前路径

3.8.4 启动容器

docker run -d -p 3000:3000 zhufengblog
1

-d 以后台方式运行,即退出当前用户命令链接,容器不会死掉
-p 端口映射 :右边 --映射为--> 左边:

冒号左边是外网访问端口,冒号右边是docker容器端口

3.9 测试

  • 前边已经配置好nginx
  • pm2方式已经启动server4000
  • 开启浏览器输入 http://ip
  • 如当前为3000,开启浏览器新标签页,会变成4000
nginx 
  |   => server3000 => docker(zhufengblog)
  |   => server4000 => pm2(server4000)
1
2
3

4. Docker命令参考

4.1 docker基础命令

  • 查看docker volume帮助
docker volumn --help
1

volumn可以将数据及配置等,持久化的挂载到docker/volumns上

  • 进入docker容器
docker exec -it [container-id] /bin/bash
1

-it将docker容器shell映射到当前主机
[container-id]或者[image-name]都可执行
/bin/bash可以简写成bash,代表进入容器后运行bash

  • 根据DockerFile创建镜像
docker build -t hello_docker .
1

-t 给镜像添加标签
. 根据当前目录的所有 Dockerfile 文件创建镜像

4.2 docker镜像命令

  • 查看镜像
docker images
1
  • 拉取镜像
docker pull gitlab/gitlab-ce:latest
1
  • daemon方式运行镜像
docker run -p 8080:80 -d nginx
1

-p 端口映射 80 --映射为--> 8080
-d 以后台方式运行,即退出当前用户命令链接,容器不会死掉

  • 删除镜像
docker rmi [image-id]
1

4.3 docker容器命令

  • 查看运行中的容器
docker ps
1
  • 查看所有容器
docker ps -a
1
  • 删除容器
docker rm [container-id]
1
  • 停止容器
docker stop [container-id]
1
  • 将容器提交成镜像
docker commit -m 'message' [container-id] [image-name]
1
  • 拷贝文件到容器
docker cp [fileName] [container-id]://usr/share/nginx/html
1

4.4 docker-compose命令

docker多容器管理

  • 创建文件
cd ~/dockerenv/compose
touch docker-compose.yml
vim docker-compose.yml
1
2
3

创建后,编写相关配置
cd 到 docker-compose.yml 目录下

  • 运行
docker-compose up -d
1
  • 停止
docker-compose stop
1
  • 删除
docker-compose rm
1
  • 构建
docker-compose build
1
  • 查看日志
docker-compose logs -f
1

5. docker修改data目录

  • 修改daemon.json
  • 为了减少系统磁盘压力,可以将docker镜像、容器、volumes放到挂载的目录(/mnt/data/docker)

5.1 显示docker目录下所有文件

du /var/lib/docker
1

5.2 查看docker信息

docker info
1

Storage Driver: overlay2
Docker Root Dir: /var/lib/docker
Registry Mirrors: https://21f73xp7.mirror.aliyuncs.com/

5.3 创建data-root目录

mkdir /mnt/data/docker
1
  • 如果docker中已经有镜像,需要执行拷贝

cp /var/lib/docker /mnt/data/docker

5.4 停止docker服务

systemctl stop docker
1

5.5 编辑daemon.json

vim /etc/docker/daemon.json
1
{
  "registry-mirrors": ["https://21f73xp7.mirror.aliyuncs.com"],
  "data-root": "/mnt/data/docker",
  "storage-driver": "overlay2"
}
1
2
3
4
5

overlay2来自docker info的信息

5.6 显示docker新目录下所有文件

du /mnt/data/docker/
1

5.7 查看docker信息

docker info
1

Docker Root Dir: /mnt/data/docker

5.8 查看docker镜像信息

docker inspect [image-id]
1

最后看到镜像对应路径为新路径

6. docker-compose

docker-compose安装的前提是先安装docker

6.1 官网路径

github地址:https://github.com/docker/compose
官方文档:https://docs.docker.com/compose/cli-command/#install-on-linux
yml文件格式与内核关系:https://docs.docker.com/compose/compose-file/compose-file-v3/

6.2 旧版安装(1.9.2)



 

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
1
2
3

命令使用docker-compose,而新版里使用docker compose

6.3 给当前用户安装

 




mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
docker compose version
1
2
3
4

6.4 给所有用户安装 (推荐)

 




mkdir -p /usr/local/lib/docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
docker compose version
1
2
3
4
Last Updated: 3/11/2022, 12:53:56 PM