Cloud 01 -- 如何创建生产力Linux服务器

image-20211031221301343

内容简介:

前情提要: 自己买了一台服务器(自己的loser laptop 不能支持 笔者自己学习 做试验了, 难受 呜呜呜,)

​ 1. Linux 服务器基本环境搭建 ( docker, Java,maven,Git,Redis,MySQL)

​ 2. 微服务项目部署 PIG

​ 3. 微服务项目组网(利用zerotier-one 软件 搭建私有网络(走公网IP方式) 将两台云服务器连接起来.)

个人服务器推荐:

PS: 若文章字体偏大或者偏小,建议通过 ctrl键+鼠标滑轮 进行修改,以提升阅读效果.(带来不便,请谅解!)’


前提提要:

服务器类型: 2核2G centos7.6 阿里云轻量型服务器 60元/年(拉胯,部署不成功, 内存空间太小, 即使是在使用虚拟内存(会导致频繁的缺页中断))

Recommend: 腾讯云: 云产品限时秒杀,爆款2核4G轻量级云服务器,首年74元

具体步骤:

  1. 网络配置
  2. 主机名配置
  3. yum源更新
  4. 时钟同步
  5. 内核参数配置
  6. 语言时区
  7. 关闭SELINUX、防火墙(利用 安全组 做系统的安全策略)
  8. SSH 参数配置

系统初始化

  • 解决 yum , 始终同步, 主机名设置, 失去, selinux, 防火墙, ssh参数设置
curl -O http://pigx.vip/os7init.sh
 备选地址: 
 curl -O https://www.whywhathow.fun/about/os7init.sh
sh os7init.sh 主机名

SSH免密登录

思路 : 在你的开发机器(如 windows,centos ,ubuntu, macOS) 中生成 rsa 秘钥, id_rsa, id_rsa.pub然后将 公钥 发送给 远程服务器ECS 中, 这样自己的机器就可以免密登录

image-20210913105849312

Step:

  • 生成rsa 秘钥对,

    ssh-keygen -t  rsa
  • 将 *_rsa.pub 文件内容发送到 远程服务器ECS中 ,下面以root用户为例

    # 1. macos , 或者 linux
    # scp -p ${你的 *_rsa.pub 路径} root@${yourSSHIP}:/root/.sshauthoried_keys 
     scp -p C:\Users\John Nash\.ssh\remote\aliyun_rsa.pub root@192.168.192.240:/root/.ssh/authorized_keys
    # 或者 执行
    # ssh-copy-id root@192.168.192.240 
    # 输入你的ECS 登录密码
    *******
    # 2. windows , 安装 git ,在 rsa文件夹下打开git-bash.exe, 然后执行
    ssh-copy-id root@192.168.192.240

Docker

安装docker

另外一种安装方案~

# 安装 yum-utils
yum install  -y yum-utils
# 安装 Docker 官方源, ps 网络不好建议选择镜像网站
	
sudo yum-config-manager \
     --add-repo \
     https://download.docker.com/linux/centos/docker-ce.repo
  # ali 镜像 
 yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
     
 # 更新源
 yum makecache fast
 
 #  安装
 yum install -y docker-ce
 
 # 配置docker 镜像站  ,参考 网址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://hub.whywhathow.fun"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
 
更新镜像源:
  • 2024-06-16:
  • 国内的镜像站貌似都挂掉了,阿里的貌似也只有他们允许的镜像存在,😄.

目前的解决方案:

ref: cloudflare-worker-dockerhub-proxy

具体看他的代码就好 /doge

创建worker
更新 worker.js

worker.js:

import HTML from './docker.html';
export default {
    async fetch(request) {
        const url = new URL(request.url);
        const path = url.pathname;
        const originalHost = request.headers.get("host");
        const registryHost = "registry-1.docker.io";
        if (path.startsWith("/v2/")) {
        const headers = new Headers(request.headers);
        headers.set("host", registryHost);
        const registryUrl = `https://${registryHost}${path}`;
        const registryRequest = new Request(registryUrl, {
            method: request.method,
            headers: headers,
            body: request.body,
            // redirect: "manual",
            redirect: "follow",
        });
        const registryResponse = await fetch(registryRequest);
        console.log(registryResponse.status);
        const responseHeaders = new Headers(registryResponse.headers);
        responseHeaders.set("access-control-allow-origin", originalHost);
        responseHeaders.set("access-control-allow-headers", "Authorization");
        return new Response(registryResponse.body, {
            status: registryResponse.status,
            statusText: registryResponse.statusText,
            headers: responseHeaders,
        });
        } else {
        return new Response(HTML.replace(/{{host}}/g, originalHost), {
            status: 200,
            headers: {
            "content-type": "text/html"
            }
        });
        }
    }
}

docker.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>镜像使用说明</title>
    <style>
        body {
            font-family: 'Roboto', sans-serif;
            margin: 0;
            padding: 0;
            background-color: #f4f4f4;
        }
        .header {
            background: linear-gradient(135deg, #667eea, #764ba2);
            color: #fff;
            padding: 20px 0;
            text-align: center;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        }
        .container {
            max-width: 800px;
            margin: 40px auto;
            padding: 20px;
            background-color: #fff;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
            border-radius: 10px;
        }
        .content {
            margin-bottom: 20px;
        }
        .footer {
            text-align: center;
            padding: 20px 0;
            background-color: #333;
            color: #fff;
        }
        pre {
            background-color: #272822;
            color: #f8f8f2;
            padding: 15px;
            border-radius: 5px;
            overflow-x: auto;
        }
        code {
            font-family: 'Source Code Pro', monospace;
        }
        a {
            color: #4CAF50;
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
        @media (max-width: 600px) {
            .container {
                margin: 20px;
                padding: 15px;
            }
            .header {
                padding: 15px 0;
            }
        }
    </style>
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&family=Source+Code+Pro:wght@400;700&display=swap" rel="stylesheet">
</head>
<body>
    <div class="header">
        <h1>镜像使用说明</h1>
    </div>
    <div class="container">
        <div class="content">
            <p>为了加速镜像拉取,你可以使用以下命令设置 registry mirror:</p>
            <pre><code>sudo tee /etc/docker/daemon.json &lt;&lt;EOF
{
    "registry-mirrors": ["https://{{host}}"]
}
EOF</code></pre>
            <p>为了避免 Worker 用量耗尽,你可以手动 pull 镜像然后 re-tag 之后 push 至本地镜像仓库:</p>
            <pre><code>docker pull {{host}}/library/alpine:latest # 拉取 library 镜像
docker pull {{host}}/coredns/coredns:latest # 拉取 coredns 镜像</code></pre>
        </div>
    </div>
    <div class="footer">
        <p>Powered by Cloudflare Workers</p>
        <p><a href="https://songxwn.com" target="_blank">访问博客 songxwn.com</a></p>
    </div>
</body>
</html>
配置访问域名

Settings\variables\environment

配置docker镜像&restart:
sudo tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": ["https://hub.whywhathow.fun"]
}
EOF

service docker restart 

Docker 常见命令:

  • 镜像操作:
# 1下载镜像
docker pull name:tag
 
# 2查看本地已下载
docker images
 
# 3删除镜像
docker rmi imageId
docker rmi $(docker ps -aq)
  • 容器操作:
# 1查询  docker run 文档
docker run --help  
# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 2启动 容器
# docker run --name test-nginx -d -p 8080:80 nginx
docker run --name nginx-01 -d --restart=always -p 80-90:80-90  -v /data/html/:/usr/share/nginx/html:ro nginx 
        #2.1 端口映射  主机端口: docker容器端口
        -p 80:80 
        -p 80-90:80-90
        -d #2.2后台运行 
        -e #2.3 环境变量
        -v #2.4  磁盘映射, 主机地址:docker内文件目录地址 
        --restart=aways # 开机自启

#3 删除容器
docker rm  -f containerID 
	 # -f 删除正在运行的container
	 
# 3.1删除所有 容器 container
docker rm $(docker ps -aq)

#4.停止容器
docker stop 容器id/名字

#5.再次启动
docker start 容器id/名字

#6. 进入容器, 修改容器内容, 建议 -v: 进行磁盘映射
# 进入容器内部的系统,修改容器内容
docker exec -it 容器id  /bin/bash
	# 参数说明
	-i 标准输入
	-t 终端

#7. 容器 提交,即在当前容器的基础上, 创建 副本|快照, 形成新的docker image
docker commit -a "author" -m "msg" containerID newImageName:version

#8 docker 复制 
#把容器指定位置的东西复制出来 容器ID/文件目录/文件 主机文件目录/文件 
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf  /data/conf/nginx.conf
#把主机内容复制到docker容器中
docker cp  /data/conf/nginx.conf  5eff66eec7e1:/etc/nginx/nginx.conf
  • 磁盘挂载操作:
	
run 容器
 
docker run --name test-nginx2 -d -p 8081:80 -v /data:/usr/share/nginx/html nginx
 
# 端口映射  主机端口: docker容器端口
 -p 80:80 
 -p 80-90:80-90 # 端口范围映射

# 目录映射 : 主机目录: docker容器中目录
-v /data:/usr/share/nginx/html
  • 日志操作 , 排错
	
docker logs -f test-nginx
 
docker logs -f 容器ID
  • 查询 && 删除正在运行的 container :
# 查询所有 容器ID
docker ps -aq
# 暂停 所有 容器
docker stop $(docker ps -aq)
# 删除所有正在运行的容器
docker rmi $(docker ps -aq )	
  • 网络操作

    	
    # 查看容器详细信息
    docker inspect test-nginx
     
     
    #镜像busybox 工具
    docker run  -it --name test-nginx3 --link test-nginx busybox sh
    
  • Docker Hub 发布自己镜像.

    	
    # 1.注册docker id后,在linux中登录dockerhub
    docker login
    
    # 官网案例:
    # docker tag local-image:tagname new-repo:tagname
    # docker push new-repo:tagname 
    
    # 注意要保证image名字 必须是  仓库名/镜像名称:版本
    docker tag hello-k8s:0.0.1 pig4cloud/hello-k8s:0.0.1
     
    # 推送docker image到dockerhub
    docker push pig4cloud/hello-k8s:0.0.1
     
     
    # 去dockerhub中检查镜像
    # 先删除本地镜像,然后再测试下载pull 镜像文件
    docker rmi pig4cloud/hello-k8s:0.0.1
     
    docker pull pig4cloud/hello-k8s:0.0.1

Dockerfile

指令 语法 说明
FROM FROM <image>:<tag> 指明构建的新镜像是来自于哪个基础镜像,如果没有选择tag,那么默认值为latest
MAINTAINER MAINTAINER <name> 指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用LABEL
LABEL LABEL <key>=<value> ... 功能是为镜像指定标签。也可以使用LABEL来指定镜像作者
RUN RUN <command> 构建镜像时运行的Shell命令,比如构建的新镜像中我们想在/usr/local目录下创建一个java目录
ADD ADD <src>... <dest> 拷贝文件或目录到镜像中。src 可以是一个本地文件,还可以是一个url。然后自动下载和解压
COPY COPY <src>... <dest> 拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压
EXPOSE EXPOSE <port> [<port>/<protocol>...] 暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP
ENV ENV <key>=<value> ... 设置容器内环境变量
CMD CMD ["executable","param1","param2"] 启动容器时执行的Shell命令。在Dockerfile中只能有一条CMD指令。如果设置了多条CMD,只有最后一条会生效
ENTRYPOINT ENTRYPOINT ["executable", "param1", "param2"] 启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖,如果设置了多条ENTRYPOINT,只有最后一条会生效
WORKDIR WORKDIR param 为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录
VOLUME VOLUME ["param"] 指定容器挂载点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时
FROM nginx:1.17.6 # FROM : 基于某个镜像开始
LABEL version="1.0" #LABEL 添加容器元信息-Metadata,类似于代码注释 ,格式 LABEL <key>=<value> 
ENV LANG en_US.UTF-8 # ENV:  环境变量, 可以在后续命令中使用	
#对于复杂的RUN命令,避免无用的分层,利用&& ==连接命令, \ == 进行换行多条命令用反斜线换行,将多条命令合成一条命令
RUN yum update && yum install -y vim \
    Python-dev #反斜线换行
ADD index.html /usr/share/nginx/html #复制 index.html 到/usr/share/nginx/html目录下, 若为压缩文件,会自动解压

ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]
EXPOSE 80  # 端口暴露
  • FROM: 基础镜像

  • MAINTAINER: 作者, 元信息

  • LABEL: key=value ,注释,元信息, 建议 # 文件注释,减少不必要的层数 eg :LABEL version=1

  • RUN : 容器构建时(docker build) 运行的命令, 建议 RUN 将所有命令 利用*&&** 和 *\ 合并成一条命令.

  • ENV : 环境变量,可以在后续的命令中使用 如**ENV PARAMS=“–spring.profiles.active=prod –spring.cloud.nacos.server-addr=174.24.100.1:8848” **

  • WORKDIR: 容器运行的根目录 如 WORKDIR /home/whywhathow/redis

  • VOLUME: 定义的匿名数据卷 (linux 系统的默认位置是/var/lib/docker/volumes/) **如: VOLUME /home/whywhathow/redis **

  • ADD: 复制文件到指定目录,如果是压缩文件会自动解压 如 ADD index.html /usr/share/index.html

  • ENTRYPOINT: ** 指容器启动时(docker run)**使用的命令

    FROM openjdk:8-jdk
    #docker run -e PARAMS="--server.port 9090"
    ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
    COPY target/*.jar /app.jar
    EXPOSE 8080
    ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]

Docker-Compose

  • Github仓库
  • 参考地址

compose 文件是一个定义服务、 网络和卷的 YAML 文件 。

image-20211013170115980

install docker compose
######################方案一##############################
#1 .下载docker-compose , 或者上传

# sol_1 : 下载 docker-compose , 并将docker-compose 移动到/usr/local/bin/下
# sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# sol_2:  上床文档
mv docker-compose-Linux-x86_64 docker-compose

# 2 .添加执行权限
chmod +x /usr/local/bin/docker-compose

##########################Recommend##################
############################方案二####################
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
使用docker-compose
  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
常用命令:
	
# 构建镜像
docker-compose build
 
# 启动服务 -d 后台启动 
docker-compose up -d
 
# 停止服务
docker-compose down --rmi all -v
 
# 查看日志
docker-compose logs -f

Docker Portainer:

Docker web 页面管理 工具: portainer

  • 创建 docker 磁盘, 将 portainer 信息 持久化保存下来.

    docker volumes  portainer_data # 默认位置 /var/lib/docker/volumes/ 文件夹中
  • 运行portainer

    docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
  • portainer 管理多台主机 docker 部署( 每一台主机做相同 的配置)

    # 参考链接: https://www.cnblogs.com/sanduzxcvbnm/p/13182948.html
    # step 01 :  找到 docker.service配置文件的位置 , 可以忽略, 从第二步开始操作
    service docker status 
    #  文件路径 是 /usr/lib/systemd/system/docker.service
    # step 02 : 修改 docker.service 文件内容, 即 将负责多机通信的端口暴露出去
    vi /usr/lib/systemd/system/docker.service
    # step 03 :修改文件内容 , 开放端口 2375 , 可以使其他的端口, 保证 各个主机间 开放的端口相同就行
    #ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
    #step 04  重启 docker服务
    systemctl daemon-reload 
    service  docker restart 
  • Hint:

    在第四步中, 可能会重启docker服务失败, 你需要检查的是你的docker-daemon服务是否已经停止, 即 检查下是否存在 **/etc/docker/daemon.json 文件, ** 是的话,请删除. 然后重启docker 服务即可.

Docker Redis:

  • 参考Link

  • redis 生产 环境下的配置信息, (开发模式不需要修改,只需保证项目正常运行即可)

思路: 利用docker-compose.yml 配置, 直接加载镜像 ,配置磁盘映射,以及配置文件加载即可.

version: '3'
services: 
   ruoyi-redis:
    image: redis:6.0
    container_name: ruoyi-redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/conf/redis.conf:/etc/redis/redis.conf # 配置文件挂载
      - /data/redis/data:/data # 数据文件挂载,  宿主机de默认位置是 /data
#    restart: always   # 机器性能不足的话不要开启

Docker MySQL:

  • 参考链接

思路: 利用docker-compose.yml 部署mysql, 同时需要导入多条sql文件,以及自定义 mysql的配置

  • 前提 文件结构 : 仓库地址
./
├── docker-compose.yml
└── db
    ├── dockerfile
    |	├── conf
    |		├── mysqld.cnf
    └──ry-cloud.sql
    |__ry-config.sql
    1. 构建 自己的MySQL镜像
FROM mysql:5.7
MAINTAINER whywhathow(whywhathow.fun@gmail.com)
# 设置timezone
ENV TZ=Asia/shanghai
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 将sql文件放到容器中的 /docker-entrypoint-initdb.d/ 目录,就会在mysql第一次启动时执行。之后重启容器不会重复执行!


#  出问题, 没有导入数据到mysql中
    1. 编写docker-compose.yml
version: '3'# change
services:
  ruoyi-mysql: # 配置sql 服务, 需要明确的一点是, 初始化数据库的sql脚本在 dockerfile文件中, 即docker 构建容器过程中完成初始化.
    build: # 构建镜像,可以基于image,也可以基于 dockerfile
      context: ./db
    environment: # 环境变量 ,对应docker hub中给出的环境变量
       - MYSQL_ROOT_PASSWORD=aa12321.
    restart: always # 设置是否重复启动
    container_name: ruoyi-mysql # 容器命名
# image 启动镜像
    image: ruoyi-mysql
    volumes: # 磁盘挂载, 构建失败,原因, /data/mysql/data 存在文件内容,相当于缓存, 也就是说,此文件夹必须为空
      - ./db/sql/:/docker-entrypoint-initdb.d # 初始化文件
      - /data/mysql/data:/var/lib/mysql # mysql 数据文件 磁盘映射, 此文件夹必须为空,不为空的话,会导致mysql 数据初始化失败
      - ./db/conf/:/etc/mysql/mysql.conf.d/ # mysql 配置文件 磁盘映射

    ports: #端口映射
      - "3306:3306"
    # 会覆盖启动命令
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci


#    image: ruoyi-mysql
可能出现的问题:
  • mysql 数据初始化失败–导入sql文件失败.

  • 可能的原因:

    1. /data/mysql/data/文件夹不为空: 必须保证 空文件夹 映射mysql 存放数据的部分.

      若导入sql文件失败, 就本例而言, 需要 删掉 ruoyi-mysql 这个image, 以及清空 /data/mysql/data/ 这个文件夹的内容

    2. sql 脚本存在问题, 修改sql脚本, 建议在本地mysql部署测试通过后在提交.

MySQL:

安装 MySQL

  • 参考链接
  1. 下载 mysql 对应的版本 , 我的是 centos 7 所以选择 Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package

    https://dev.mysql.com/downloads/repo/yum/

    curl -O https://repo.mysql.com//mysql80-community-release-el7-11.noarch.rpm
  1. 将 rpm 包上传到云服务器 –centos7, 执行 以下命令,

    yum localinstall mysql80-community-release-el7-11.noarch.rpm
  1. 安装 mysql server

    yum install mysql-community-server
    
  2. 启动 mysql 服务,

    service mysqld start
    # 检查 mysql 是否已经启动
    service mysqld status

修改MySQL 密码

  1. 查询 mysql 的临时密码

    grep 'temporary password' /var/log/mysqld.log

    本机 临时密码为: 20>j.ix&o%qI

  2. 登录mysql, 并修改 mysql 密码(需要符合 mysql的密码要求, 大小写+数字+字符)

    mysql -uroot -p
    # 修改密码:  
    # ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
    alter user 'root'@'localhost' identified by 'Aa12321.';
  3. 刷新权限

    flush privileges;
    

    自定义配置汇总

将MySQL密码设置成 root

PS: 若将密码设置成 ‘root’ , mysql 提示

your-password-does-not-satisfy-the-current-policy-requirements

  • 解决方案: 参考链接
  • 官方解决方案: Click Here
  1. 查询 MySQL 的密码 权限
SHOW VARIABLES LIKE 'validate_password%';

​ 我的机器的查询结果如下: (MySQL 8 的默认格式)

+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+

​ MySQL 密码 是‘root’对应的权限 应该是:

+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | ON    |
| validate_password.dictionary_file    |       |
| validate_password.length             | 4     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 1     |
| validate_password.policy             | LOW   |
| validate_password.special_char_count | 1     |
+--------------------------------------+-------+
  1. 修改 用户密码 权限 policy:

    SET GLOBAL validate_password.length = 4;
    SET GLOBAL validate_password.number_count = 0;
    set global validate_password.policy =low; 
    
    alter user 'root'@'localhost ' identified by 'root';
    
    flush privileges;
  2. 换一个 终端, 重新登录, 测试 成功.

  3. ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘aa12321.’;

root 远程访问:

即 本地机器 连接云服务器的MySQL 数据库, 以阿里云为例:

1 . 暴露 mysql-server的服务端口3306 , 或者是你自己设置的端口.

  1. 授权

    1. 参考链接
use mysql;
update user set host="%" where user='root';
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
  1. mysql 8 会报一个 2058 的错误代码, 需要进一步修改.

    Reason : sqlyog 不支持 mysql 密码的编码方式

    *  [参考链接](https://www.cnblogs.com/Extnet/p/10044559.html)
    # 修改加密方式, 替换password 即可
    ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
    # 修改用户密码
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

字符集修改


vi /etc/my.cnf


#修改1:增加client配置(文件开头)
[client]
default-character-set=utf8mb4

#修改2:增加mysqld配置(文件结尾)
#charset
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

自定义配置汇总:

#important

  • 前提: 需要使用临时密码登录后MySQL配置.
# 更新密码权限
SET GLOBAL validate_password.length = 4;
SET GLOBAL validate_password.number_count = 0;
set global validate_password.policy =low;
flush privileges;

# 授予root用户远程访问
use mysql;
update user set host="%" where user='root';
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;

# 修改密码todo 替换 #{your_password}
# 修改加密方式, 
ALTER USER 'root'@'%' IDENTIFIED BY 'your_password' PASSWORD EXPIRE NEVER;
# 修改用户密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
# 写入
flush privileges;

Redis:

系统安装教程: 参考链接

#  已 6.2.5 版本为例
# 1 . download redis ,  and compile 
$ wget https://download.redis.io/releases/redis-6.2.5.tar.gz
$ tar xzf redis-6.2.5.tar.gz
$ cd redis-6.2.5 
$ make
# 2.  install redis  
$ make install  
# 3. 设置redis-server 后台运行 我的redis 默认安装路径在 /root/redis-6.2.5/文件中
所以启动redis的命令是redis-server /root/redis-6.2.5/redis.conf 

redis 后台运行 以及 以及允许其他机器进行访问:

#  修改你需要运行的redis.conf文件 我的是/root/redis-6.2.5/redis.conf
daemonize yes #允许 redis-server 后台运行
# bind 127.0.0.1 # bind 127.0.0.1 只允许本机访问
bind 0.0.0.0 # bind  允许 任意机器访问

这样的话, 你的电脑不出意外的话,应该就可以愉快的连接上 在云端的centos中redis了.

若没有连上, 请你检查一下自己的防火墙, 麻烦你把自己的360,电脑管家,火绒给关上, 这些安全软件都有非常严格的限制流量出站入站 的功能, 你可能会因为他发现自己的v2ray,ssr,等需要发起出站请求的第三方软件 会失效, 请你自行检查这个问题.

done!

  • Redis 定制化配置, 做当当前项目最优解.

微服务项目安装:

项目中的MySQL , redis 利用docker 进行创建, 因而不需要在centos 系统中install MySQL, Redis

	
# 安装相关软件 maven  默认版本3.1 
yum install -y git java  maven 
 
# maven 需要设置镜像源,  
mvn -v #查询 maven 安装地址, 默认 /usr/share/maven/conf/settings.xml 中添加 阿里云镜像库

/:
vi /usr/share/maven/conf/settings.xml 

NodeJS 12|14

# 1. Install a package with repository for your system:
# On CentOS, install package centos-release-scl available in CentOS repository:
 sudo yum install centos-release-scl-rh

# On RHEL, enable RHSCL repository for you system:
 sudo yum-config-manager --enable rhel-server-rhscl-7-rpms

# 2. Install the collection:
 yum install rh-nodejs14-nodejs
 yum install rh-nodejs12

# 3. Start using software collections:
scl enable rh-nodejs14 bash 
scl enable rh-nodejs12 bash

JDK-11

  • 安装jdk
wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz

# 解压
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz

# 或者使用这个版本的
wget https://builds.openlogic.com/downloadJDK/openlogic-openjdk/11.0.8%2B10/openlogic-openjdk-11.0.8%2B10-linux-x64.tar.gz

# 解压
tar -zxvf openlogic-openjdk-11.0.8+10-linux-x64.tar.gz
  • 将jdk-11 移动到 /usr/local/jdk/jdk-11

    mkdir /usr/local/jdk
    mv jdk-11 /usr/local/jdk/jdk-11
  • 配置环境变量
$ vim ~/.bashrc

# 末尾增加如下内容(根据自己jdk目录修改):
export JAVA_HOME=/usr/local/jdk/jdk-11
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
# 注:
# 修改所有用户的环境变量:/etc/profile文件
# 只修改root用户的环境变量:~/.bashrc文件


$ source ~/.bashrc   # 使配置文件生效
  • 检查是否配置成功

image-20220218114233868

Maven 3.x 升级

Hint: 替换成自己下载的maven 版本,当然也可以用我所下载的maven版本

  • maven 版本升级 : Link
  1. 官网 获取maven 最新版本下载链接: here,

    # wget 下载 文件在 /tmp 文件夹中 ,连接可能挂,需要自己去官网找 ok?
    wget https://dlcdn.apache.org/maven/maven-3/3.8.3/binaries/apache-maven-3.8.3-bin.tar.gz -P /tmp
    ## 可能出现的问题: ca 证书, 参考 
    # curl 下载
    curl https://dlcdn.apache.org/maven/maven-3/3.8.3/binaries/apache-maven-3.8.3-bin.tar.gz -o /tmp/maven.tar.gz
    

    PS: 可能出现的问题: CA证书 不可用, 解决方案

    PS: 方案二: 如果实在下载不了, 就用本地pc下载,然后上传,费这雄劲干嘛, waste time.-

  2. 解压,安装 maven

    HINT: 不要直接复制, maven 下载版本不同

     # 解压, maven 到 /opt 目录
    tar xf /tmp/apache-maven-3.8.3-bin.tar.gz  -C /opt
    # 创建软连接 
    ln -s /opt/apache-maven-3.8.3/ /opt/maven
  3. 设置maven 环境变量

# 1. 编辑 maven.sh
vi /etc/profile.d/maven.sh

#2 . 添加 一下环境变量
export JAVA_HOME=/usr/lib/jvm/jre-openjdk
export M2_HOME=/opt/maven
export MAVEN_HOME=/opt/maven
export PATH=${M2_HOME}/bin:${PATH}

#3. 为maven.sh 添加执行权限 
chmod +x /etc/profile.d/maven.sh

#4. 加载环境变量
source /etc/profile.d/maven.sh
  1. 验证 maven 升级成功与否
mvn -v 
# 我的执行结果如下
[root@aliyun-centos-whywhathow ~]# mvn -v
Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)
Maven home: /opt/maven
Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.41.1.el7.x86_64", arch: "amd64", family: "unix"
  1. 设置镜像仓库

    阿里云镜像库

    vi /opt/maven/conf/settings.xml

    line 159: 替换为 一下内容

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>



clone && build

# clone 源码
git clone https://gitee.com/log4j/pig.git
 
 
# 编译源码
mvn clean package -Dmaven.test.skip=true
# 会将jar包安装在本地maven 仓库
mvn clean install -Dmaven.test.skip=true
 

docker compose 部署:

	
# 构建镜像
docker-compose build
 
# 启动服务
docker-compose up -d
 
# 停止服务
docker-compose down --rmi all -v
 
# 查看日志
docker-compose logs -f

Zerotier-微服务组网:

卸载教程:

ubuntu:
sudo dpkg -P zerotier-one

sudo rm -rf /var/lib/zerotier-one/
centos:
sudo rpm -e zerotier-one
sudo rm -rf /var/lib/zerotier-one/

安装教程:

参考链接: link

zerotier 本质上讲 就是 租了一个私有网络, 保证各台机器可以以较低的时延进行连接.

对比 云服务器私有网络的缺点: 因为组的是私有网络, 也就是说各个云服务器之间通信依旧是需要通过公网进行访问,不像云服务器私有网络,走内网, 时延低,速度快.

  • 下载 并安装 zerotier-cli

    #https://www.zerotier.com/download/
    curl -s https://install.zerotier.com | sudo bash
  • 注册 zerotier 服务

    • 打开https://my.zerotier.com/ , 注册用户
  • 创建网络

    image-20211003220321239

  • 将机器加入到 此网络中.

    • 获取网络ID
    • image-20211003221120054
# linux 服务器
 zerotier-cli join NETWORKID 
#windows 
# 1. 打开zerotier-one 应用
# 2. 点击 join network , 输入 networkID
  • 分配IP地址

    第一步, 点击 auth 的多选按钮, 然后为机器分配IP地址, 若不选中auth ,各台机器不可以相互访问, auth 必须选中.

    image-20211003222104547

    • 测试网络连接, ping 一下各台机器的ip地址.

zerotier 原理简单示意图:

image-20210905211400428

如图所示:组网的基本思路就是 搭建一个虚拟交换机 zerotier-cli, 然后将 自己的 windows 以及 自己的云端服务加入到 zero-cli 中, 组成网络.

配置moon 服务:

**moon服务: 卫星服务, 即dns 副本, **

  • 目的: 加快设备之间的连接, 缩短连接延迟

  • 前提:

    1. 服务器 A(用作卫星服务): aliyun-centos 2c2g : 作为 moon 卫星服务
    2. 服务器 B: tencent-1c2g: 加入卫星服务
    3. 本地机器 windowsC: 加入卫星服务

image-20211003230025071

具体步骤
服务器A 搭建卫星 服务
cd /var/lib/zerotier-one/
#1. 生成 卫星服务的配置文件
zerotier-idtool initmoon identity.public > moon.json
#2.  修改配置文件 , 配置公网IP, 并开放对应的端口, 安全组
vim moon.json

moon.json 配置 网络IP 修改**${YOURIP/9903} ,替换成你自己的IP地址**

PS: 不要忘了开启公网端口

{
  # 网络ID
 "id": "5b5c9e57bc",
 "objtype": "world",
 "roots": [
  {
   "identity": "5b5c9e57bc:0:08378ad01eaa221a054e85d1f1357f352f0886fec81903cdfd2375aacf40836874270721b4d14abf813fa1a82984ac931cc3d0e50273448ff8cd19430f832b9d",
   "stableEndpoints": ["${YOURIP/9993}"]
  }
 ],
 "signingKey": "26b1cdc264e992e9c5858724a6f72f341219ca3ff33f503532698c3a2ca5bc0a1795ebb824b5364fd47bc5596e7ed677807f2842a74bc4705e5069021f8ff9c9",
 "signingKey_SECRET": "7024fc8339202719415abb78dc1dfea27eb47087c60682bfb61463376456de311c47d8750be003913c4fc9a995d71c1e838670fc37e0f428ccfd7f5909a3e3a3",
 "updatesMustBeSignedBy": "26b1cdc264e992e9c5858724a6f72f341219ca3ff33f503532698c3a2ca5bc0a1795ebb824b5364fd47bc5596e7ed677807f2842a74bc4705e5069021f8ff9c9",
 "worldType": "moon"
}
#3. 生成 client 机器的配置文件, 000000XXXXX.moon文件 , download 下来
zerotier-idtool genmoon moon.json
# ps 查看服务器 A的设备id
grep id /var/lib/zerotier-one/moon.json | head -n 1
# 4. 复制000000XXXXXX.moon 文件到 moons.d/ 文件夹
mkdir moons.d
cp 000000*.moon moons.d/
# 5. 开启 moon 服务 即 zerotier-one 服务
service zerotier-one restart
# 6. 加入卫星服务 ,XXXXXX 为搭建卫星服务及服务器A 的设备ID, 可以查询服务器Amoon.json文件夹获取
zerotier-cli orbit XXXXX XXXXXX

补充说明: 第二部修改格式

image-20211003230744050

生成的000000xxxxxxx.moon 保存下来

客户端连接 moon服务
  • linux 或者macos 系统: 以服务器B centos 为例:
cd /var/lib/zerotier-one/
#1. 复制000000XXXXXX.moon 到moons.d 文件夹(ftp, scp 复制啥的都行,自己选择, 保证 moons.d/0000YourID.moon文件即可
mkdir moons.d/
# 2. 连接到卫星服务
zerotier-cli orbit ID ID 
# 3. 判断是否已经成功 连接到moon 
zerotier-cli listpeers |grep MOON # 若有打印输出,  判断ID是否为服务器A的设备ID,一致,证明已成功连接到moon
# 200 listpeers 服务器A的ID 121.41.120.202/52111;15046;15033 12 1.6.5 MOON
 
  • windows 系统:

    我的自我感受: windows 加入moon 后的连接速度取决于 你ping 公网ip 的网络延迟,如果你ping 公网的网络延迟高的话, windows 加入moon并不会带来任何的提升.

    暂时略过, 需要的朋友自行查抄,或者骚扰我

Q&A:

客户端连接到 zerotier 根服务器后, 机器ping不同 原因?

  • 路由问题, 自己手否手贱 自己配置了 路由(内网机器配置路由)

    路由问题

  • IPV4 网址 重复.

IDE 远程开发:

reason: linux 服务器 修改一个文件内容 勉强可以用vim 解决, 若修改一个项目的文件, vim 就有些力不从心了, 思路就是 本地开发机器 ,

idea

  • 进入settings 页面
  • 搜索 depolyment , 并创建自己的配置文件
    1. 与remote 服务器建立连接, 修改编码格式

image-20210927163430647

        2. 映射项目路径 

image-20210927163708615

VSCODE

vscode 连接远程开发机器方式
  • 公私钥 认证方式登录
  • 用户名密码方式登录, 即 ssh root@172.10.0.1 形式登录,(需要重复输入多次,过于繁琐,淘汰)
STEP:
  1. 下载扩展插件 remote-development

  2. 添加配置参数 ,使用公私钥 进行remote 远程连接

    1. 选择对应的远程开发方式, ssh, wsl,container, 我选择的是ssh

    image-20211031184617174

    Host  tx-1year 
        HostName 172.10.0.1 # 修改成你自己的云服务器IP地址
        User root
        PreferredAuthentications publickey # 选择公私钥认证方式
        IdentityFile ~/.ssh/id_rsa # 你的私钥地址
  1. 将公钥 信息配置到 开发机(即云服务器中)

    vi ~/.ssh/authorized_keys
    # 将 你的公钥信息复制到 此处, 没有私钥的话认证不通过 不要复制我的公钥信息!不要复制我的公钥信息!不要复制我的公钥信息!
    # HINT : 你的公钥信息,你的 id_rsa 对应的公钥信息
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/NnLMWCGxgKQDbhMOhEgcwNNDB0M6ptlDobaB9u/tayxDq7X8lfiirZgEEbw1DAgBcqvMg2LmF7S+4Wd5nGNhY4zcjjF8jjyC4k8PpQAIcmmQRslvJGcnKm+3FkrnFVnUMqoI5Z1+TzHF1on1pEyG7xjrniSm3CoyELUa6fGaydXDg3BvmIQkvMMaUs+CnAI0MJctpWnXkn6pDih2k/tP2jkHqZkMa0MCa40uIJFekePQ2HbO76QWKWXDERNKDUrWsG+g8masZ+0pAzh5LGRVDWyJTbVf9HBqx8UMnp49LqjLLzAObw7drvqDX45aKaTwUZXJ8IqgMQ/ZxNFP/pBZ John Nash@JohnNash-PC
    
  1. 建立远程连接 , 进行远程开发

PS: 参考链接

更进一步: link ,vscode 配置远程java 开发环境

shell 美化(选做)

linux, mac os 系统美化的主流思路是 : 使用zsh 替代bash , 然后使用 oh-my-zsh 美化 系统

  • 参考链接: Linux/Mac如何配置zsh并使用Oh-my-zsh?让你的终端更加好用 - Mintimate’s Blog

Step:

  1. 安装 zsh

    # 1-1.centos 
    yum install -y zsh
    # 1-2. ubuntu , debain 
    apt-get install zsh 
    # 2 检查 zsh 是否安装成功
    cat /etc/shells
  2. 设置成zsh 为默认shell 脚本 ,并重启终端

    chsh -s /bin/zsh
  3. 安装oh-my-zsh

    # 进入github 仓库 https://github.com/ohmyzsh/ohmyzsh
    # 安装脚本01 
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    # 安装脚本 02 
    zsh -c "$(curl -fsSL 'https://host.mintimate.cn/fileHost/download/MTM1NjkzNzI1OTIxMDg0NjIwOQ==')"
  1. 设置主题, ys(个人项,自己可以在github仓库中比较选择后选择自己喜欢的zsh主题)

    vi ~/.zshrc
    ZSH_THEME="ys"

    image-20211031190811671

    1. 插件安装(选做)

      1. 下载插件, github
      2. 启动插件
      vi ~/.zshrc
      plugins=(... vscode YourPlugins)

出现问题:

内存不足:

Recommend: 更换服务器, 4g内存 足够, 小于4g内存的服务器请不要考虑用在微服务项目中

AD: 腾讯云: 双十一 2核4G 70元/年, 错过等一年!!!

centos : 内存不足, 不足以支持 4个 微服务项目

[root@aliyun-centos-whywhathow ~]# free -h
              total 	    used        free      shared  buff/cache   available
Mem:           1.7G         1.1G         67M        524K        591M        506M
Swap:            0B          0B          0B
# total : os 的总内存
# used :已经使用的 内存
# free: 剩余内存 
# total = used +free + buff/cache
# buff/cache: 分配给缓存空间的内存
# available: 可以分配给一个进程的内存

解决思路: 为 Linux 创建 虚拟内存 . 默认内存的2-3 倍.

参考链接: Here

清除 buff/cache 内存大小:

echo 1 > /proc/sys/vm/drop_caches #:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches #:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches #:表示清除pagecache和slab分配器中的缓存对象。

只描述步骤, 具体内容 请查看参考链接.

具体步骤

  1. 添加swap 分区:

    #  虚拟内存大小设置: 不要超过你 机器内存的3倍
    dd  if=/dev/zero  of=/var/swapfile  bs=1024  count=4194304 # 4g
    dd  if=/dev/zero  of=/var/swapfile  bs=1024  count=6291456 # 6g
  2. swap 分区文件格式化

    mkswap /var/swapfile
  1. 挂载 并激活 swap 分区

    swapon /var/swapfile

    执行完之后, 可能会报 缺少0644,0600 权限, 如图

    swapon: /var/swapfile: insecure permissions 0644, 0600 suggested.

    解决方案:

    chmod -R 0644 /var/swapfile
  1. 开启自动挂载

    echo  "/var/swapfile   swap  swap  defaults  0  0" >>  /etc/fstab
  2. 更改swap 配置

    一般默认的情况,当我们开启交换虚拟内存空间后,默认好像是当内存使用百分 50 的时候,就会开始使用交换空间,这样就会造成一个情况,就是本身物理内存使用率不高, 就使用虚拟内存,这样肯定会影响我们的使用效率,那么我们怎么避免这个情况的发生呢?

    这个时候可以通过 swappiness 值进行管理,swappiness 表示系统对 Swap 分区的依赖程度,范围是 0~100,数值越大,依赖程度越高,也就是越高越会使用 Swap 分区。

    所以,我们现在并不希望我们的机器过度依赖 Swap 分区,只有当我们 负载超过某个百分比的时候,才使用交换空间,所以这也决定了,我们这个值并不是非常大,一般设置 10 ~50 左右。

    当然如果小伙伴的是 SSD 的话,那么这个值可以稍微大一些。

    下面我们查看当前的 swappiness 数值:

    cat /proc/sys/vm/swappiness

修改 swappiness 值,这里以 10 为例:

sysctl vm.swappiness=10

设置永久有效,重启系统后生效

echo "vm.swappiness = 10"  >>  /etc/sysctl.conf

我们最后再次通过 top 命令,能够查看到,交换空间已经被使用了,物理内存也大概占用了百分 90 左右

查看交换内存使用情况

  1. 重启, 查看系统 内存

    reboot 
    free -h 

Wget,curl–CA证书不可用

参考链接

解决方案: 下载ca证书解决问题

###centos
# 1. 更新软件源
yum update -y  
# 2, 下载ca证书
yum install -y ca-certificates

## Ubuntu
apt-get update -y
apt-get install -y ca-certificates

常见命令:

查询开机自启动:

systemctl list-unit-files |grep enable 

Top 命令 按照内存, cpu 排序:

top
P # : 按照 cpu 大小排序
M # :按照内存大小排序

远程复制:

scp local_file remote_username@remote_ip:remote_folder 
或者 
scp local_file remote_username@remote_ip:remote_file 
或者 
scp local_file remote_ip:remote_folder 
或者 
scp local_file remote_ip:remote_file 

总结:

  • 虚拟机 2G 内存是不够做微服务项目的.
  • docker 最优雅的配置方式是利用docker-compose 部署, 文件内容简介明了, 方便快捷.
  • dockerfile 文件格式: 写得好的dockerfile 文件生成的镜像文件小,写的不好的 镜像1g.
  • docker 构建的MySQL 与自己安装的MySQL的区别: docker构建的mysql相对较为简单, 配置项相对透明,不需要通过sql命令修改用户密码等.

参考:

  • https://www.bilibili.com/video/BV1XJ411D7Qu?p=1
  • https://notice.pig4cloud.com/ecs.html
  • vscode远程开发
  • Linux/Mac如何配置zsh并使用Oh-my-zsh?让你的终端更加好用 - Mintimate’s Blog
  • VsCode 搭建Java远程开发环境
  • 关闭swap分区