常规部署
- 购买自己的域名
- 域名备案
- 购买服务器
- 配置服务器应用环境
- 安装配置服务器
- 项目远程部署和发布与更新
1. 服务器购买与备案
1.1 购买域名
1.2 云主机
1.3 购买服务器(阿里云)
- 选择配置
- 镜像 CentOS 7.6 64位
1.4 备案(阿里云)
2. 服务器部署
2.1 客户端工具
- 工具下载 git bash
- 推荐教程 Git教程-廖雪峰的官方网站
2.2 连接服务器(心跳)
ssh root@服务器ip
- 查看系统版本
lsb_release -a
2.2.1 查看客户端ssh配置
cd /etc/ssh
cat ssh_config | grep -v ^# | grep -v ^$
ls -l
2
3
cat ssh_config | grep -v ^# | grep -v ^$
: 查看配置信息
ls -l
: 查看文件权限
-rwxr--r--
: 所有者可读可写可执行,用户所在组只读,其他人只读
2.2.2 修改文件读写权限
sudo chmod 600 ssh_config
2.2.3 配置客户端连接检测参数
如果没有下边的参数,添加到配置文件末尾
sudo vim /etc/ssh/ssh_config
ServerAliveInterval 60
ServerAliveCountMax 3
2
ServerAliveInterval 60
: client每隔60秒发送一次请求给server,然后server响应,从而保持连接
ServerAliveCountMax 3
: client发出请求后,服务器端没有响应得次数达到3,就自动断开连接,正常情况下,server不会不响应
2.3 创建非root用户
adduser zhangsan
2.4 授予权限
gpasswd
命令是Linux下工作组文件/etc/group
和/etc/gshadow
管理工具。
-a
: 添加用户到组
-d
: 从组删除用户
sudo gpasswd -a zhangsan
2.5 添加sudo权限
- Linux用户配置sudo权限
visudo
,如果你用visudo
来编辑这个文件,那么它会帮你自动做很多事情,比如说语法检查,加锁防止别人同时修改这个文件等等
sudo visudo
或者
vi /etc/sudoers
visudo 等价于 /etc/sudoers
增加以下内容
# User privilege specification
zhangsan ALL=(ALL:ALL) ALL
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
2.7 SSH无密码登录
ssh 公钥认证是ssh认证的方式之一。通过公钥认证可实现ssh免密码登陆,git的ssh方式也是通过公钥进行认证的。
2.7.1 本地生成公钥和私钥
- 查看本地公钥私钥,如果存在不再生成
ls -al ~/.ssh
- 生成公钥和私钥
ssh-keygen --help
cd ~/.ssh
ssh-keygen -t rsa -b 4096
2
3
-t 指定加密方式
-b 字节数
2.7.2 开启ssh代理
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
2
加速秘钥验证过程
2.7.3 服务器生成公钥和私钥
- 1 查看公钥私钥是否存在,参考本地操作
- 2 生成公钥和私钥,并开启ssh代理
ssh-keygen -t rsa -b 4096
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
2
3
2.7.4 把本地的公钥上传到服务器授权文件中
- 1 本地查看公钥,复制
公钥
cat ~/.ssh/id_rsa.pub
- 2 上传到服务器授权文件,粘贴
公钥
到authorized_keys
vi ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
service sshd restart
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
2
不再需要输入密码
新服务器
参考
2.8 2.8.1 阿里云新服务器密码
- 密码: 实例密码 和 远程连接密码
实例密码,用于客户端连接,即本地pc的ssh命令连接工具
远程连接密码(6位),是阿里云开启web连接页面的密码 - 重置密码,是否需要重启?
实例密码,需要重启实例
远程连接密码(6位),不需要重启实例 - 登录连接
ssh root@服务器ip
输入
实例密码
2.8.2 查看~/.ssh/known_hosts
记录已经通过连接的服务器+公钥
信息
cat ~/.ssh/known_hosts
当第一次没有登录成功,不知道
公钥
是否被记录,可通过这个命令查看
使用vim ~/.ssh/known_hosts
删除被错误记录的公钥
2.8.3 其他登录方案(不推荐)
ssh -o StrictHostKeyChecking=no root@服务器ip
StrictHostKeyChecking公钥检查参数,不检查,不使用
公钥
连接
会被记录到 known_hosts
2.9 安装软件
2.8.1 更新系统
yum -y update # 升级所有包同时也升级软件和系统内核
yum -y upgrade # 只升级所有包,不升级软件和系统内核
2
-y 代表所有提示
yes or no ?
选择默认 yes
2.8.2 查看依赖软件是否安装
wget --version
curl --version
git --version
2
3
2.8.3 安装软件
yum install wget curl git -y
已安装的,不必重复安装
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
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');
});
2
3
4
5
6
7
8
9
- 上传代码到git服务器,比如:
https://gitee.com/zhufengpeixun/2019blog.git
2.12 启动程序
- 安装pm2,进程管理器,进程异常退出时pm2会尝试重启,(守护进程运行程序)
npm install pm2 -g
如果已安装,不必再次安装,pm2 -V查看版本
- clone项目创建server4000.js
cd ~
git clone https://gitee.com/zhufengpeixun/2019blog.git
cp server.js server4000.js
2
3
之后编辑文件,将3000部分改成4000
- 启动server4000.js
pm2 start server4000.js --name 'server4000'
启动命令: pm2 start [fileName] --name [appName]
重启命令: pm2 restart [appName]
查看列表: pm2 list
停止命令: pm2 stop [appName]
删除命令: pm2 delete [appName]
- 访问4000端口 访问 http://127.0.0.1:4000 或者使用命令
curl http://127.0.0.1:4000
- 查看进程
ps -ef | grep node
node 为查看的关键字
- 杀死进程(比如处理端口被占用)
kill -9 [pid]
2.13 nginx
Nginx
是一个高性能的HTTP
和反向代理服务器
2.13.1 nginx安装
yum install nginx -y
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 ^$
| grep -v ^# | grep -v ^$ 排除所有 # 开头的行,排除所有空行
- 配置conf
cd /etc/nginx/conf.d/
vi blog.conf
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;
}
}
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;
}
}
}
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
- 打包方式
- web_dist 项目使用绝对路径 (配合 8090 端口),不推荐
- mobile 项目使用相对路径
publicPath: './' (或 publicPath: '') - 推荐 hello-world 项目使用绝对路径
publicPath: '/hello-world'
推荐该方式,相比于2
,可以更好地配置请求路径,如public文件夹下的文件等。
- 访问地址(部署后最终效果)
- http://192.168.3.2 => nginx首页
- http://192.168.3.2:8090 => web_dist项目
- http://192.168.3.2/mobile => mobile项目
- http://1926.168.3.2/hello-world => hello-world项目
3. Docker
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
3.1 docker版本
- docker分为企业版(EE)和社区版(CE)
- docker-ce社区版地址: https://docs.docker.com/install/linux/docker-ce/centos/
- docker-hub镜像中心地址: https://hub.docker.com/
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
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
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
2
3
使用阿里云镜像安装
只安装docker-ce
3.2.3 常见异常
- 在执行
3.2.2
第2行时,有时会出现异常
"Could not resolve host: download.docker.com; 未知的错误"
原因在于首次请求docker地址,无法直接下载
- 解决方法
curl https://download.docker.com/linux/centos/
- 先请求通docker地址,会返回网页内容
- 然后可以执行
3.2.2
第2行和第3行命令
3.2.4 其他安装方式参考
建议使用3.2.2官方提供方式
sudo wget -qO- https://get.docker.com | sh
- 关键词
sudo 给普通用户root权限,便于安装
wget 下载命令(常见的curl属于另一种)
-q 简化模式,简化太多输出
O- 输出依赖,依赖标准模式,不依赖简单文件系统
sh 管道,将命令发送给shell,利用shell运行
- 添加用户到docker组,允许普通用户使用docker
sudo usermod -aG docker <username>
3.3 启动docker
systemctl start docker
3.4 查看docker信息
docker info
docker version
2
3.5 Docker架构
3.6 阿里云加速
- 镜像仓库: https://dev.aliyun.com/search.html
- 镜像加速器: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- 配置加速器镜像
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
2
3
4
5
6
7
8
其中 https://fwvjnv59.mirror.aliyuncs.com 可以通过
镜像加速器
链接找到,即镜像加速器地址
3.7 服务启动解析
- 运行镜像并执行命令
docker run ubuntu /bin/echo "Hello world"
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
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
2
3
4
5
6
将server.js内容粘贴进server.js
pwd命令显示为 /root/dockerenv/app
- 初始化app目录为npm目录
npm i -y
cat package.json
2
编辑并确保 npm start 运行 node server.js
3.8.2 Dockerfile
cd ~/dockerenv/
vi Dockerfile
2
FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD npm start
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 .
-t用来指定image镜像的名称,后面还可以加冒号指定标签,如果不指定默认就是latest
. 表示Dockerfile文件的所有路径,.就表示当前路径
3.8.4 启动容器
docker run -d -p 3000:3000 zhufengblog
-d 以后台方式运行,即退出当前用户命令链接,容器不会死掉
-p 端口映射 :右边 --映射为--> 左边:冒号左边是外网访问端口,冒号右边是docker容器端口
3.9 测试
- 前边已经配置好nginx
- pm2方式已经启动server4000
- 开启浏览器输入 http://ip
- 如当前为3000,开启浏览器新标签页,会变成4000
nginx
| => server3000 => docker(zhufengblog)
| => server4000 => pm2(server4000)
2
3
4. Docker命令参考
4.1 docker基础命令
- 查看docker volume帮助
docker volumn --help
volumn可以将数据及配置等,持久化的挂载到docker/volumns上
- 进入docker容器
docker exec -it [container-id] /bin/bash
-it将docker容器shell映射到当前主机
[container-id]或者[image-name]都可执行
/bin/bash可以简写成bash,代表进入容器后运行bash
- 根据DockerFile创建镜像
docker build -t hello_docker .
-t 给镜像添加标签
. 根据当前目录的所有 Dockerfile 文件创建镜像
4.2 docker镜像命令
- 查看镜像
docker images
- 拉取镜像
docker pull gitlab/gitlab-ce:latest
- daemon方式运行镜像
docker run -p 8080:80 -d nginx
-p 端口映射 80 --映射为--> 8080
-d 以后台方式运行,即退出当前用户命令链接,容器不会死掉
- 删除镜像
docker rmi [image-id]
4.3 docker容器命令
- 查看运行中的容器
docker ps
- 查看所有容器
docker ps -a
- 删除容器
docker rm [container-id]
- 停止容器
docker stop [container-id]
- 将容器提交成镜像
docker commit -m 'message' [container-id] [image-name]
- 拷贝文件到容器
docker cp [fileName] [container-id]://usr/share/nginx/html
4.4 docker-compose命令
docker多容器管理
- 创建文件
cd ~/dockerenv/compose
touch docker-compose.yml
vim docker-compose.yml
2
3
创建后,编写相关配置
cd 到 docker-compose.yml 目录下
- 运行
docker-compose up -d
- 停止
docker-compose stop
- 删除
docker-compose rm
- 构建
docker-compose build
- 查看日志
docker-compose logs -f
5. docker修改data目录
- 修改daemon.json
- 为了减少系统磁盘压力,可以将docker镜像、容器、volumes放到挂载的目录(/mnt/data/docker)
5.1 显示docker目录下所有文件
du /var/lib/docker
5.2 查看docker信息
docker info
Storage Driver: overlay2
Docker Root Dir: /var/lib/docker
Registry Mirrors: https://21f73xp7.mirror.aliyuncs.com/
5.3 创建data-root目录
mkdir /mnt/data/docker
- 如果docker中已经有镜像,需要执行拷贝
cp /var/lib/docker /mnt/data/docker
5.4 停止docker服务
systemctl stop docker
5.5 编辑daemon.json
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://21f73xp7.mirror.aliyuncs.com"],
"data-root": "/mnt/data/docker",
"storage-driver": "overlay2"
}
2
3
4
5
overlay2
来自docker info
的信息
5.6 显示docker新目录下所有文件
du /mnt/data/docker/
5.7 查看docker信息
docker info
Docker Root Dir: /mnt/data/docker
5.8 查看docker镜像信息
docker inspect [image-id]
最后看到镜像对应路径为
新路径
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
2
3
命令使用
docker-compose
,而新版里使用docker compose
6.3 给当前用户安装
- 查看版本信息 https://github.com/docker/compose/releases
- 安装(
v2.2.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
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
2
3
4