1. 服务器部署步骤

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

    1.2 购买域名

  1. ssh root@103.45.172.152
  1. The authenticity of host '103.45.172.152 (103.45.172.152)' can't be established.
  2. ECDSA key fingerprint is SHA256:94hLvsp4mK8mv4abQaLVLMphZ3LctTAJEO1LXERMzFw.
  3. Are you sure you want to continue connecting (yes/no)? y
  4. // 这里的意思是说这个主机的认证没有建立,不认识这个签名,你是否想连接这个服务器,选择yes
  5. Please type 'yes' or 'no': yes
  6. // 把这个ip地址加入到已知组里面了
  7. Warning: Permanently added '103.45.172.152' (ECDSA) to the list of known hosts.
  8. // 这里需要输入公网地址对应的密码
  9. root@103.45.172.152's password:
  10. // 登录成功提示
  11. Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-87-generic x86_64)
  12. * Documentation: https://help.ubuntu.com
  13. * Management: https://landscape.canonical.com
  14. * Support: https://ubuntu.com/advantage
  15. 0 个可升级软件包。
  16. 0 个安全更新。
  17. Last login: Mon Feb 26 12:59:07 2018 from 111.67.201.161

2.2创建用户

root用户权限太大,如果直接操作,操作错误服务器就崩掉了,所有创建一个普通用户

  1. adduser zhangyong
  1. root@ubuntu:~# adduser zhangyong
  2. // 创建一个用户
  3. Adding user `zhangyong' ...
  4. // 把用户添加到新的用户组里
  5. Adding new group `zhangyong' (1001) ...
  6. Adding new user `zhangyong' (1001) with group `zhangyong' ...
  7. // 创建了一个加目录
  8. Creating home directory `/home/zhangyong' ...
  9. Copying files from `/etc/skel' ...
  10. Enter new UNIX password:zhangyong
  11. Retype new UNIX password:zhangyong
  12. passwd: password updated successfully
  13. Changing the user information for zhangyong
  14. Enter the new value, or press ENTER for the default
  15. Full Name []:
  16. Room Number []:
  17. Work Phone []:
  18. Home Phone []:
  19. Other []:
  20. Is the information correct? [Y/n] y

切换用户

  1. su zhangyong

2.3赋予权限

  • gpasswd命令是Linux下工作组文件/etc/group和/etc/gshadow管理工具。
    • -a: 添加用户到组
    • -d: 从组删除用户
  1. gpasswd -a zhufeng sudo
  1. root@ubuntu:/home/zhangyong# gpasswd -a zhangyong sudo
  2. // 把用户添加到sudo用户组里
  3. Adding user zhangyong to group sudo

2.4 添加用户权限

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

修改# User privilege specification下面添加一行

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

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

2.5SSH无密码登录

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

2.5.1 本地生成公钥和私钥

  1. ssh-keygen --help
  2. cd ~/.ssh
  3. ssh-keygen -t rsa -b 4096
  • t 指定加密方式
  • -b 字节数
  1. // 创建私有公有秘钥
  2. Generating public/private rsa key pair.
  3. // 秘钥保存文件路径
  4. Enter file in which to save the key (C:\Users\Administrator/.ssh/id_rsa):
  5. C:\Users\Administrator/.ssh/id_rsa already exists.
  6. Overwrite (y/n)? y
  7. Enter passphrase (empty for no passphrase):
  8. Enter same passphrase again:
  9. // 私钥的生成地址
  10. Your identification has been saved in C:\Users\Administrator/.ssh/id_rsa.
  11. // 公钥的生成地址
  12. Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub.
  13. The key fingerprint is:
  14. SHA256:Zj+dJZtToyUoS7e13ujiLpo/pMhBiK4KfwRD7t8KnfQ administrator@SKY-20190113LCN
  15. The key's randomart image is:
  16. +---[RSA 4096]----+
  17. | |
  18. | . |
  19. | + . |
  20. |. = . . |
  21. |.. +. S o + = |
  22. | ..ooo +.= + % . |
  23. |o .+o+Eo. + O |
  24. |o. .= o.o .o + |
  25. |o ....oo.=oo+ . |
  26. +----[SHA256]-----+

2.5.2 开启ssh代理

可以提高秘钥加密解密速度

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

2.5.3 服务器配置

  1. ssh-keygen -t rsa -b 4096
  2. eval "$(ssh-agent -s)"
  3. ssh-add ~/.ssh/id_rsa

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

  1. vi ~/.ssh/authorized_keys
  2. // 把权限改成600
  3. chmod 600 ~/.ssh/authorized_keys
  4. service ssh restart

用vim打开authorized_keys,将本地的公钥复制进去

  1. cat ~/.ssh/id_rsa.pub

2.6 安装软件

  1. //升级服务器
  2. apt-get update
  3. // 安装下载工具
  4. apt-get install wget curl git -y

2.7安装node

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

2.8 编写node程序

  1. var http = require('http');
  2. const hostname = '127.0.0.1';
  3. const port = 3000;
  4. const server = http.createServer((req, res) => {
  5. res.statusCode = 200;
  6. res.setHeader('Content-Type', 'text/plain');
  7. res.end('Hello World\n');
  8. });
  9. server.listen(port, () => {
  10. console.log(`Server running at http://${hostname}:${port}/`);
  11. });

2.9 启动程序

强大的进程管理器,进程异常退出时pm2会尝试重启

  1. cnpm install pm2 -g

用pm2启动node

命令 用途
pm2 start blog.js —name “blog” 启动应用
pm2 list 查看所有应用
pm2 restart crawl 重启应用
pm2 stop crawl 停止应用
pm2 delete crawl 删除应用
  1. pm2 start blog.js --name "blog"

查看服务器进程

  1. // 列出当前引用进程 | 过滤 node进程
  2. ps -ef | grep node

杀死进程

  1. kill -9 20984

2.10 nginx

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

2.10.1 安装

  1. apt-get install nginx -y

2.10.2 nginx命令

名称 命令
启动nginx nginx -c /etc/nginx/nginx.conf
关闭nginx nginx -s stop
重读配置文件 nginx -s reload / kill -HUP nginx
常用命令 service nginx{start stop status restart reload configtest }

2.10.3 nginx配置

  1. cd /etc/nginx/sites-enabled
  2. vi blog.conf
  1. //上游
  2. upstream blog {
  3. server 127.0.0.1:3000;
  4. server 127.0.0.1:4000;
  5. }
  6. server {
  7. listen 80;
  8. // 服务名字可以配置多个
  9. server_name 103.45.172.152 www.zhangyufan.tk;
  10. location / {
  11. // 这里的blog对应上游的名字
  12. proxy_pass http://blog;
  13. }
  14. }

2.10.4 重启nginx

  1. nginx -s reload

3. Docker 是什么

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

3.1 docker安装

  1. docker分为企业版(EE)和社区版(CE)
  2. docker-ce
  3. hub.docker

3.2 安装

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

3.3 启动

  1. systemctl start docker

3.4 docker命令

  1. // 查看docker版本信息
  2. $ docker version
  3. $ docker info
  4. // 查看本地镜像
  5. docker image ls
  6. // 查看docker 容器列表
  7. docker container ls -a
  8. // 删除运行中的容器,对应的ID
  9. docker container rm ba4b12dd04dd 44d146e7f534
  10. // 拉取docker镜像到本地
  11. docker pull node

3.5 卸载

  1. docker info
  2. yum remove docker
  3. rm -rf /var/lib/docker

3.6 Docker架构

image.png

3.7 阿里云加速

  1. mkdir -p /etc/docker
  2. tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. # 重载所有修改过的配置文件
  8. systemctl daemon-reload
  9. systemctl restart docker

启动服务

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

3.8 启动node服务

3.8.1 Dockerfile

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

3.8.2 创建image

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

3.8.3 使用新的镜像运行容器

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

3.8.4 CMD

Dockerfile

  1. + CMD npm start

重新制作镜像

  1. docker build -t zhufengblog .
  • RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件
  • CMD命令则是在容器启动后执行
  • 一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令
  • 指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令

重新启动服务

  1. docker container run -p 3333:3000 zhangyongblog

这样之后会一直卡在容器里执行,无法退出,所以要使用下面的方式执行

  1. // -d 守护进程,后台运行
  2. docker container run -d -p 3333:3000 zhangyongblog