前端运维

320 阅读12分钟

linux

要掌握的内容:虚拟机,文件,目录,vim,yum,防火墙

目录

目录结构

image.png 只用关心

root: linux超级权限root的主目录
home: 系统默认的用户主目录,如果添加的用户是不指定用户的主目录,默认在/home下创建与用户同名的文件夹
etc: 存放系统的配置文件,作为一些软件启动时默认配置文件读取的目录,如/etc/fstal存放系统分析信息
mnt: 临时文件挂载目录,也可以说是测试目录
opt: 第三方软件存放目录
tmp:临时文件夹
usr:应用程序存放目录,安装linux软件包是默认安装到/usr/local目录下

目录(文件夹)操作

创建

mkdir dir1 dir2 dir3

递归创建

mkdir -p a/b/c/d

删除

rm -rf dir1 dir2
rm -rf dir* //删除以dir开头的所有文件

重命名或者移动目录

mv dir1 dir1s

复制

cp -rf dir1 dir1s

文件操作

创建

touch fire1 fire2

删除

rm -rf fire1 fire2

重命名或者移动

mv fire1 fire1s

复制

cp fire1 fire1s

查看

cat fire1.txt

在服务器上查找文件

//在根目录下查找名字为test.txt的文件
find / -name test.txt

查找文件里的文字内容

// 在test.txt文件中查找aaa字符
cat test.txt | grep aaa

用户管理

查看所有用户
cat /etc/passwd
cat /etc/passwd |cut -f 1 -d :

image.png

增加用户

会在/home下新增同名文件夹

useradd lisi

image.png

删除用户
userdel lisi
修改用户

修改密码,切换到lisi,退出回到root

passwd lisi
su lisi
exit

image.png

用户组管理

查看用户组
cat /etc/group
增加用户组
groupadd group1
删除用户组
groupdel group1

image.png

修改用户组

lisi分配api

usermod -g api lisi

查看修改后的数据

cd home
ll
ll /home |grep lisi

image.png

文件权限管理

image.png

英文字母代表

d(directory):说明当前是一个文件夹
l(link):说明是一个链接
r(read):说明文件可读
w(write):说明文件可写,当然也可以被删除
x(execute):可以运行该文件
  1. 首先-代表一个坑位,如果没有任何英文字母的情况会有10个坑位,最后一个.代表结束
  2. 第一个坑位可以是ld-分别表示当前是一个链接、目录、文件
  3. 后面每三个一组代表文件所有者、群组用户、其他用户的权限

image.png

用字母分配权限

  • +:增加某个权限
  • -:移除某个权限
  • =:分配某个权限 用ugo来表示当前用户、用户组、其他用户
#文件 test.txt 的所有者增加读和运行的权限。
chmod u+rx test.txt

#文件 test.txt 的群组其他用户增加读的权限。
chmod g+r test.txt 

#文件 test.txt 的其他用户移除读的权限。
chmod o-r test.txt 

#文件 test.txt 的群组其他用户增加读的权限,其他用户移除读的权限。
chmod g+r o-r test.txt 

#文件 test.txt 的群组其他用户和其他用户均移除读的权限。
chmod go-r test.txt 

#文件 test.txt 的所有用户增加运行的权限。
chmod +x test.txt 

#文件 test.txt 的所有者分配读,写和执行的权限;
#群组其他用户分配读的权限,不能写或执行;
#其他用户没有任何权限。
chmod u=rwx,g=r,o=- test.txt 

改变文件的所有者与群组

  1. chown:用于设置文件所有者和文件关联组的命令
  2. chmod:控制用户对文件的权限的命令
  3. -R:递归

创建一个test.txt文件,分配给bar用户(来自ui组),让别的组的成员无法删除

useradd bar
groupadd ui
usermod -g ui bar
touch tetst.txt
chown bar:ui test.txt
su lisi
rm -rf test.txt
chown -R bar:ui /home  //把/home下面的文件和文件夹都分配给ui组的bar

image.png

实战

image.png

vim

编辑文件

vi test.txt

输入模式

i

换行

esc 
o

保存并退出

esc
:wq
enter(回车)

不保存退出

esc
:q!
enter(回车)

防火墙

查看

systemctl status firewalld

开启

systemctl start firewalld

关闭

systemctl stop firewalld

shell

sh文件在Linux上可以直接执行,在windows上是不可以执行,但是可以在git的窗口上运行

git命令窗口下,运行方式

1 ./文件名.sh 
2 sh 文件名.sh

声明变量,并执行输出

//test.sh
your_name="qinjx"
echo $your_name

sh test.sh

image.png

虚拟机

打开启动

输入账号密码登录,通过ip addr 获取ip地址

image.png

登录并开启网格

打开配置

vi /etc/sysconfig/network-scripts/ifcfg-ens33

找到

ONBOOT=’no’修改为 yes

重启网络:

service network restart

xshelll连接ip

image.png

image.png

image.png

测试服务器能不能在浏览器打开

安装node环境
//安装node
# cd /usr/local
# wget https://nodejs.org/dist/v14.16.1/node-v14.16.1-linux-x64.tar.xz    // 下载
# tar xf node-v14.16.1-linux-x64.tar.xz         // 解压
# mv node-v14.16.1-linux-x64 nodejs

//配置node环境变量
1. vi /etc/profile
2. 最后面添加:
export NODE_HOME=/usr/local/nodejs/bin
export PATH=$NODE_HOME:$PATH
3.:wq 保存,然后运行
source /etc/profile

//配置npm淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org

npm config get registry //查看配置

新建node项目,监听3000端口(已经下载安装node环境)

cd /home
mkdir node
npm init -y
npm install koa koa-router --save
touch app.js

编辑app.js

//app.js
const Koa = require('koa')
const app = new Koa()
const router = require('koa-router')();

router.get('/',async(ctx, next) => {
     ctx.body = 'aa'  //返回json数据
})
app.use(router.routes());
 //端口
app.listen(3000,()=>{
    console.log('[demo] server is starting at port 3000');
})

启动node项目 node app.js

防火墙

在浏览器输入http://192.168.153.128:3000/ 发现不能打开

image.png

查看防火墙状态

systemctl status firewalld

关闭防火墙

systemctl stop firewalld
systemctl start firewalld // 打开防火墙
systemctl disable firewalld.service  #禁止firewall开机启动

image.png

image.png

nginx

yum安装nginx

  1. 安装nginx源
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2.查看 Nginx 源是否配置成功

通过 yum search nginx 看看是否已经添加源成功。如果成功则执行下列命令安装 Nginx。

3.安装 Nginx

sudo yum install -y nginx

4.启动 Nginx 并设置开机自动运行

sudo systemctl start nginx.service

5.查看ip并在浏览器中打开 如果不能打开,则关闭该服务器的防火墙,再刷新浏览器

ip addr 
systemctl stop firewalld

常用命令

systemctl start nginx.service 启动nginx,相当于打开这个软件
systemctl stop nginx.service 停止nginx,相当于关闭这个软件
nginx -v //版本
nginx -t //nginx配置是否正确
nginx -s reload //重新载入配置文件
nginx -s stop
netstat -tlnp 查看端口号

image.png

配置文件

find / -name nginx //查找服务下nginx相关的文件
cd /etc/nginx //进入nginx安装的目录


image.png

nginx.conf

include 代表包括子文件,即conf.d目录下的文件

image.png

Nginx的主配置文件

Nginx的主配置文件是nginx.conf,这个配置文件一共由三部分组成,分别为全局块、events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。在同一配置块中嵌套的配置块,各个之间不存在次序关系

#全局块 
#user nobody; 
worker_processes 1; 

#event块
events { 
    worker_connections 1024; 
} 

#http块 
http { 
    #http全局块 
    include mime.types; 
    default_type application/octet-stream; 
    sendfile on;
    keepalive_timeout 65;
    
    #server块 
    server { 
        #server全局块 
        listen 8000;
        server_name localhost;
        #location块 
        location / { 
            root html;
            index index.html index.htm; 
        } 
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        } 
    } 
    #这边可以有多个server块 
    server { 
        ... 
    } 
}

server模块

server {
    listen       80;   #配置监听端口
    server_name  localhost;  //配置域名
    location / {
        root   /usr/share/nginx/html;     #服务默认启动目录
        index  index.html index.htm;    #默认访问文件
    }
}

正向代理

正向代理:代理的是客户端,服务端看不到真实的客户端 例如正常情况下访问不了google,可以通过代理访问

image.png

反向代理

修改本地host

因为本地DNS解析优先级高于网络,访问b.nginx.com时,会先在本地匹配到192.168.153.128

image.png

配置反向代理

反向代理:代理的是服务端,客户端看不到真实的服务端 现在我们访问b.nginx.com然后反向代理http://127.0.0.1:3000;这个网站 反向代理的意思是,我们访问b.nginx.com其实是让b.nginx.com去访问http://127.0.0.1:3000,把得到的内容再返回给客户端

server {
    listen 80;
    server_name b.nginx.com;
    location / {
      proxy_pass http://127.0.0.1:3000; //
    }
}

image.png

负载均衡

pm2

作用

一般npm run server或者node app.js启动项目的,要一直开着,但是pm2 start app.js 就可以让他在后台运行,当前的界面还能继续操作

PM2 是一款非常优秀的 Node 进程管理工具,它有着丰富的特性:能够充分利用多核 CPU 且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model)和超出最大内存限制等情况下实现自动重启

  1. 安装
npm install pm2 -g

2. 指定运行pm2程序

pm2 start app.js
pm2 stop app.j2 //停止

3.显示所有进程状态

pm2 list

4.关闭重启所有进程

pm2 stop all
pm2 restart all
网络访问的配置
 setsebool -P httpd_can_network_connect 1
本地服务器内启动4个node项目

分别对应端口localhost:3001,localhost:3002,localhost:3003,localhost:3004 image.png

配置nginx
//nginx.conf

http {
    upstream testServer{
	server 192.168.153.128:3001;
        server 127.0.0.1:3002;
        server 127.0.0.1:3003;
        server 127.0.0.1:3004;
    }
    server {
     listen 8080;
     location / {
       proxy_pass http://testServer;
}
打开浏览器

刷新会随机显示3001,3002,3003,3004

image.png

502

如果第一个端口返回502,在控制台输入如下,重启

setsebool -P httpd_can_network_connect 1

docker

安装前准备

关闭 selinux

修改/etc/selinux/config 文件

将 SELINUX=enforcing 改为 SELINUX=disabled

关闭防火墙

systemctl stop firewalld

安装 docker

# 卸载旧版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 安装依赖包
$ sudo yum install -y yum-utils

# 设置镜像仓库(不推荐使用官方仓库,速度很慢)
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
# 设置镜像仓库(推荐使用阿里云仓库)
$ sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum软件包索引
$ sudo yum makecache fast

# 安装社区版docker
$ sudo yum install docker-ce docker-ce-cli containerd.io

启动测试

# 服务方式启动
$ sudo systemctl start docker

# 查看版本
$ sudo docker version

# 测试运行容器
$ sudo docker run hello-world

# 查看下载的镜像
$ sudo docker images

# 退出容器
$ sudo exit //容器停止并退出

docker images镜像

Docker 镜像就是一个 Linux 的文件系统(Root FileSystem),这个文件系统里面包含可以运行在 Linux 内核的程序以及相应的数据

  1. 搜索镜像
docker search centos

2. 下载镜像

docker pull centos

3.查看本地镜像

docker images

4. 给镜像打标签

docker tag f652ca386ed1 docker.io/1134506391/nginx:latest

// 1134506391是docker的账号
// latest是版本

5. 删除镜像

docker rmi docker.io/1134506391/nginx:latest //只删除对应的标签

docker rmi -f f652ca386ed1 //删除镜像id为f652ca386ed1

docker system prune --volumes //清除docker镜像缓存

image.png

  1. 把本地镜像推送到dockerHub的仓库
  2. dockhub上注册一个账户
  3. 本地登录
docker login

3.docker pull 推送

// 1134506391是在dockhub上注册的用户名
docker pull alpine
docker tag c059bfaa849c docker.io/1134506391/alpine:v1.0.1
docker push docker.io/1134506391/alpine:v1.0.1

image.png

image.png

docker 容器

介绍

类似 linux 系统环境,运行和隔离应用。容器从镜像启动的时候,docker 会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。容器与镜像的关系,就如同面向编程中对象与类之间的关系

镜像: class Person{}
容器: const p1 = new Person()

因为容器是通过镜像来创建的,所以必须先有镜像才能创建容器,而生成的容器是一个独立于宿主机的隔离进程,并且有属于容器自己的网络和命名空间。

命令

查看所有运行的容器
docker ps
查看所有容器
docker ps -a
启动容器
docker run 

创建一个新的容器并运行一个命令

-i :表示启动一个可交互的容器,并持续打开标准输入
-t: 表示使用终端关联到容器的标准输入输出上
-d :表示容器放置后台运行
-rm:退出后即删除容器
-name :表示定义容器唯一名称
-p: 映射端口
-v:指定路径挂载数据卷
-e:运行容器传递环境变量
IMAGE :表示要运行的镜像
COMMAND :表示启动容器时要运行的命令

启动一个交互式的容器

docker run -it 1134506391/centos /bin/bash
退出容器
exit 容器停止并退出
ctrl+p+q:容器不停止退出
启动停止重启
docker start 07fb9c32ea61
docker stop 07fb9c32ea61
docker restart 07fb9c32ea61
docker restart MyCentos
docker stop $(docker ps -a -q) 停止所有

删除
docker rm $(docker ps -a -q) //删除所有
日志
docker logs 07fb9c32ea61
导入导出
docker save 07fb9c32ea61 > test.txt.tar
docker load < test.txt.tar

docker部署nginx以及端口映射

下载nginx镜像

docker pull nginx

打个标签

docker tag f652ca386ed1 docker.io/1134506391:latest

运行nginx容器

docker run -it -d --rm --name Mynginx 1134506391/nginx

查看容器

docker ps

image.png

进入容器访问url

docer exec -ti 0c2a20bbce80 /bin/bash
curl 127.0.0.1

image.png

在浏览器访问容器里面的nginx

docker images

image.png

-p 映射端口

docker run -ti -d -rm -p 81:80 f652ca386ed1

1638857775(1).png

查看ip并访问

ip addr

image.png

docker容器内安装软件

Docker 容器内安装软件和以前 linux 中安装软是一样的。 进入指定的容器

docker exec -ti MyCentos /bin/bash

image.png

安装net-tools

yum install -y net-tools

Dockerfile

Dockerfile(当前路径下) 就是用来构建 docker 镜像的构建文件,

命令详解

FROM #基础境像,一切从这里开始构建
RUN #编译镜像时运行的脚本
WORKDIR #镜像的工作目录
CMD #设置容器启动的命令

docker构建一个nginx镜像

新建Dockerfile文件

// Dockerfile

FROM nginx
RUN echo '你好 docker' > /usr/share/nginx/html/index.html
WORKDIR /usr/share/nginx/html

根据当前1134506391/nginx镜像,构建新的镜像 查看新的镜像 运行新的镜像,并对外映射端口83 访问83端口上的内容 浏览器打开83端口 image.png

image.png

Dockerfile是指当前路径下,如果没有则会报错

image.png

Dockerfile

常用操作
FROM    #基础镜像
RUN     #编译镜像时运行的脚本
COPY    #编辑镜像时复制文件到镜像中,不会减压
ADD     #编辑镜像时复制文件到镜像中,tar.gz文件会自动减压
WORKDIR #镜像的工作目录
CMD     #设置容器启动的命令
ENV     #设置容器的环境变量
基本操作
  1. 新建one文件夹,以及one/Dockerfileone/index.js
//Dockerfile

FROM node
ADD index.js /
CMD ["node","index.js"]

console.log("node----")

  1. 根据Dockerfile打包成名为one的docker image镜像
docker build -t one .

3. 查看镜像docker images

image.png

  1. 运行镜像 可以看到执行index.js的结果
docker run one

image.png

RUN

默认形式,不推荐,生成的镜像会比较大

FROM node
RUN mkdir dir1
RUN touch test.txt

推荐

FROM node
RUN mkdir dir1 && \ 
    touch test.txt

COPY

与ADD相比,COPY没有压缩功能

//Dockerfile.copy

FROM node
COPY index.js /app/index.js

可以指定别名运行

docker build -f Dockerfile.copy -t three .
WORKDIR

指定工作目录,例如可以上面的COPY可以修改成如下代码

FROM node
WORKDIR /app
COPY index.js index.js

CMD

容器启动时需要执行的命令

//Dockerfile


Dockerfile实例

部署node

初始化文件

新建backend文件夹

image.png

server.js

'use strict'

const express = require('express')

const PORT = 8080
const HOST = '0.0.0.0'

const app = express()
app.get('/', (req, res) => {
  res.send('Hello world\n')
})

app.get('/api/json', (req, res) => {
  res.json({
    code: 0,
    data: 'This is message from node container'
  })
})

app.listen(PORT, HOST)
console.log('Running on http://' + HOST + ':' + PORT)

.dockerignore

node_modules

Dockerfile

FROM node

WORKDIR /opt/express

COPY package*.json ./

RUN npm install --registry=https://registry.npm.taobao.org

COPY . .

EXPOSE 8080
CMD [ "npm", "start" ]

构建node服务镜像
//1. 进入到backend目录
cd wwwroot/1213/backend
//2. 构建镜像
docker build -t backend .
// 3. 生成后台运行的容器,映射8080端口
docker run -p 8080:8080 -d backend

image.png

image.png

部署前端vue

文件目录结构

frontend/dist frontend/nginx_conf frontend/Dockefile

image.png

文件详解
  1. dist

vue执行npm run build之后的生成dist,默认端口8080

  1. frontend/nginx_conf 配置listenlocation
server {
    listen       8080; //nginx监听的端口
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;

    location / {
        root   /usr/share/nginx/html; //对应dist的上一层文件夹
        index  index.html index.htm;
   }
    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

  1. Dockerfile
FROM nginx  //nginx镜像
COPY dist/ /usr/share/nginx/html/  //把dist复制到/usr/share/nginx/html
COPY nginx_conf/default.conf /etc/nginx/conf.d/default.conf //同上是复制功能
expose 8080 //
命令和浏览器

image.png

image.png

处理跨域

为什么会跨域

同源策略发生的场景在浏览器中,什么意思呢?如果不是浏览器的话, 就不会受到同源策略的影响。也就是说,两个服务器直接进行跨域请求是可以进行数据请求的。同源策略的目的是什么呢?同源策略限制了从同一个源加载的文档或者脚本如何与来自另 一个源的资源进行交互。

测试案例
  1. 浏览器请求

image.png

  1. 服务器请求

image.png

解决跨域
  1. 配置nginx代理
    location /api/ {
      # rewrite  /api/(.*)  /$1  break;
      # proxy_pass http://192.168.153.128:3000;
      #	add_header Access-Control-Allow-Origin *;
    }

docker-compose

安装

// 1.下载到本地linux服务器
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

2. 修改权限
sudo chmod +x /usr/local/bin/docker-compose
3. 
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. 检查是否安装成功
docker-compose -version
demo

把上面的vue和node镜像做成一个compose,一起生成容器 新建文件夹compose(名字和目录随便),新建文件compose/docker-compose.yml 注意imageports,depends_on是比自己先启动

version: '3'

networks:
  app-web:
   driver: bridge

services:
  backend:
    image: backend 
    ports:
     - 3000:3000
    networks:
     - app-web
  frontend:
    image: frontend
    ports:
     - 8080:8080
    depends_on:
     - backend

compose下执行命令,打开浏览器看到一起的效果

docker-compose up -d

image.png

CI/CD

前端自动化不是指自动生成代码,而是自动化构建项目。

如果没有自动化, 我们的前端从开发到提测工作流程可能如下:
1.本地机器上写代码
2.在命令行输入 npm run unit/lint,查看单元测试/eslint校验结果
3.提交代码,push 到 git 远程仓库
4.执行 npm run build,构建项目
5.ssh/ftp发包至测试服务器等各种方式
这个流程中,每一个步骤都要重复人工操作,很大增加了时间成本,不能保证操作的准确性。对于 unit 或者 build 的结果,没有一个自动的反馈机制,需要人工 check 运行结果,最后部署也是人工登录服务器执行脚本,非常繁琐。

引入自动化以后,整个流程变成:
1.本地机器上写代码
2.提交代码,push 到 git 远程仓库
3.git hook 触发 jenkins 的构建 job
4.jenkins job 中拉取项目代码,运行 npm run unit/lint 和 npm run build。
5.jenkins job 中执行测试服务器的部署脚本
在 自动化流程中,只有步骤1和步骤2需要人工操作,其他步骤都是自动运行,是一个非常标准化的流程,减少了人工操作的风险,省去了重复性工作,增强了项目的可见性。

安装git和nvm

git

先下载相关依赖

yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

下载Git

yum -y install git-core

验证Git

git --version

nvm

# 能方位github的话,使用这条命令
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
 
# 不能访问github的话, 可以用下面这条
curl -o- https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh | bash
 
# 然后执行下面的两条命令即可
chmod +x ~/.nvm/nvm.sh
source ~/.bashrc

nvm的命令简介

# 查看可安装版本
nvm ls
 
# 安装一个19版本
nvm install 19
 
# 列出所有可安装版本
nvm ls-remote
 
# 安装某个版本Node
nvm install lts/fermium
nvm install v12.20.1
nvm install v15.5.1
 
# 切换Node版本
nvm use system
nvm use 14.15    # 不用全部打出版本号
 
# 更新nvm
nvm-update

软连接

软连接是指向另外一个文件的文件,类似Windows中的快捷方式文件

创建

//创建/var/test 引向/var/www/test 文件夹
ln –s /var/www/test /var/test

删除

unlink test

端口

查找端口

netstat -tuln | grep 80

根据端口查到pid,根据pid 杀死进程

kill -9 pid