linux
要掌握的内容:虚拟机,文件,目录,vim,yum,防火墙
目录
目录结构
只用关心
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 :
增加用户
会在/home下新增同名文件夹
useradd lisi
删除用户
userdel lisi
修改用户
修改密码,切换到lisi,退出回到root
passwd lisi
su lisi
exit
用户组管理
查看用户组
cat /etc/group
增加用户组
groupadd group1
删除用户组
groupdel group1
修改用户组
给lisi分配api组
usermod -g api lisi
查看修改后的数据
cd home
ll
ll /home |grep lisi
文件权限管理
英文字母代表
d(directory):说明当前是一个文件夹
l(link):说明是一个链接
r(read):说明文件可读
w(write):说明文件可写,当然也可以被删除
x(execute):可以运行该文件
- 首先
-代表一个坑位,如果没有任何英文字母的情况会有10个坑位,最后一个.代表结束 - 第一个坑位可以是
l、d、-分别表示当前是一个链接、目录、文件 - 后面每三个一组代表文件
所有者、群组用户、其他用户的权限
用字母分配权限
+:增加某个权限-:移除某个权限=:分配某个权限 用u、g和o来表示当前用户、用户组、其他用户
#文件 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
改变文件的所有者与群组
- chown:用于设置文件所有者和文件关联组的命令
- chmod:控制用户对文件的权限的命令
- -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
实战
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
虚拟机
打开启动
输入账号密码登录,通过ip addr 获取ip地址
登录并开启网格
打开配置
vi /etc/sysconfig/network-scripts/ifcfg-ens33
找到
ONBOOT=’no’修改为 yes
重启网络:
service network restart
xshelll连接ip
测试服务器能不能在浏览器打开
安装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/ 发现不能打开
查看防火墙状态
systemctl status firewalld
关闭防火墙
systemctl stop firewalld
systemctl start firewalld // 打开防火墙
systemctl disable firewalld.service #禁止firewall开机启动
nginx
yum安装nginx
- 安装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 查看端口号
配置文件
find / -name nginx //查找服务下nginx相关的文件
cd /etc/nginx //进入nginx安装的目录
nginx.conf
include 代表包括子文件,即conf.d目录下的文件
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,可以通过代理访问
反向代理
修改本地host
因为本地DNS解析优先级高于网络,访问b.nginx.com时,会先在本地匹配到192.168.153.128
配置反向代理
反向代理:代理的是服务端,客户端看不到真实的服务端
现在我们访问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; //
}
}
负载均衡
pm2
作用
一般npm run server或者node app.js启动项目的,要一直开着,但是pm2 start app.js 就可以让他在后台运行,当前的界面还能继续操作
PM2 是一款非常优秀的 Node 进程管理工具,它有着丰富的特性:能够充分利用多核 CPU 且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model)和超出最大内存限制等情况下实现自动重启
- 安装
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
配置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
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 内核的程序以及相应的数据
- 搜索镜像
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镜像缓存
- 把本地镜像推送到dockerHub的仓库
- dockhub上注册一个账户
- 本地登录
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
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
进入容器访问url
docer exec -ti 0c2a20bbce80 /bin/bash
curl 127.0.0.1
在浏览器访问容器里面的nginx
docker images
-p 映射端口
docker run -ti -d -rm -p 81:80 f652ca386ed1
查看ip并访问
ip addr
docker容器内安装软件
Docker 容器内安装软件和以前 linux 中安装软是一样的。 进入指定的容器
docker exec -ti MyCentos /bin/bash
安装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端口
Dockerfile是指当前路径下,如果没有则会报错
Dockerfile
常用操作
FROM #基础镜像
RUN #编译镜像时运行的脚本
COPY #编辑镜像时复制文件到镜像中,不会减压
ADD #编辑镜像时复制文件到镜像中,tar.gz文件会自动减压
WORKDIR #镜像的工作目录
CMD #设置容器启动的命令
ENV #设置容器的环境变量
基本操作
- 新建
one文件夹,以及one/Dockerfile和one/index.js
//Dockerfile
FROM node
ADD index.js /
CMD ["node","index.js"]
console.log("node----")
- 根据
Dockerfile打包成名为one的docker image镜像
docker build -t one .
3. 查看镜像docker images
- 运行镜像
可以看到执行
index.js的结果
docker run one
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文件夹
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
部署前端vue
文件目录结构
frontend/dist frontend/nginx_conf frontend/Dockefile
文件详解
- dist
vue执行npm run build之后的生成dist,默认端口8080
- frontend/nginx_conf
配置
listen和location
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;
}
}
- 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 //
命令和浏览器
处理跨域
为什么会跨域
同源策略发生的场景在浏览器中,什么意思呢?如果不是浏览器的话, 就不会受到同源策略的影响。也就是说,两个服务器直接进行跨域请求是可以进行数据请求的。同源策略的目的是什么呢?同源策略限制了从同一个源加载的文档或者脚本如何与来自另 一个源的资源进行交互。
测试案例
- 浏览器请求
- 服务器请求
解决跨域
- 配置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
注意image和ports,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
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