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

内容简介:
前情提要: 自己买了一台服务器(自己的loser laptop 不能支持 笔者自己学习 做试验了, 难受 呜呜呜,)
1. Linux 服务器基本环境搭建 ( docker, Java,maven,Git,Redis,MySQL)
2. 微服务项目部署 PIG
3. 微服务项目组网(利用zerotier-one 软件 搭建私有网络(走公网IP方式) 将两台云服务器连接起来.)
个人服务器推荐:
腾讯云: 云产品限时秒杀,爆款2核4G轻量级云服务器,首年74元
PS: 若文章字体偏大或者偏小,建议通过 ctrl键+鼠标滑轮 进行修改,以提升阅读效果.(带来不便,请谅解!)’
前提提要:
服务器类型: 2核2G centos7.6 阿里云轻量型服务器 60元/年(拉胯,部署不成功, 内存空间太小, 即使是在使用虚拟内存(会导致频繁的缺页中断))
Recommend: 腾讯云: 云产品限时秒杀,爆款2核4G轻量级云服务器,首年74元
具体步骤:
- 网络配置
- 主机名配置
- yum源更新
- 时钟同步
- 内核参数配置
- 语言时区
- 关闭SELINUX、防火墙(利用 安全组 做系统的安全策略)
- 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 中, 这样自己的机器就可以免密登录
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 <<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=1RUN : 容器构建时(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 文件 。
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
- 构建 自己的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中
- 编写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文件失败.
可能的原因:
/data/mysql/data/文件夹不为空: 必须保证 空文件夹 映射mysql 存放数据的部分.
若导入sql文件失败, 就本例而言, 需要 删掉 ruoyi-mysql 这个image, 以及清空 /data/mysql/data/ 这个文件夹的内容
sql 脚本存在问题, 修改sql脚本, 建议在本地mysql部署测试通过后在提交.
MySQL:
安装 MySQL
- 参考链接
下载 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
将 rpm 包上传到云服务器 –centos7, 执行 以下命令,
yum localinstall mysql80-community-release-el7-11.noarch.rpm
安装 mysql server
yum install mysql-community-server
启动 mysql 服务,
service mysqld start # 检查 mysql 是否已经启动 service mysqld status
修改MySQL 密码
查询 mysql 的临时密码
grep 'temporary password' /var/log/mysqld.log
本机 临时密码为:
20>j.ix&o%qI
登录mysql, 并修改 mysql 密码(需要符合 mysql的密码要求, 大小写+数字+字符)
mysql -uroot -p # 修改密码: # ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; alter user 'root'@'localhost' identified by 'Aa12321.';
刷新权限
flush privileges;
将MySQL密码设置成 root
PS: 若将密码设置成 ‘root’ , mysql 提示
your-password-does-not-satisfy-the-current-policy-requirements
- 解决方案: 参考链接
- 官方解决方案: Click Here
- 查询 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 |
+--------------------------------------+-------+
修改 用户密码 权限 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;
换一个 终端, 重新登录, 测试 成功.
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘aa12321.’;
root 远程访问:
即 本地机器 连接云服务器的MySQL 数据库, 以阿里云为例:
1 . 暴露 mysql-server的服务端口3306 , 或者是你自己设置的端口.
授权
- 参考链接
use mysql;
update user set host="%" where user='root';
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
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 # 使配置文件生效
- 检查是否配置成功
Maven 3.x 升级
Hint: 替换成自己下载的maven 版本,当然也可以用我所下载的maven版本
- maven 版本升级 : Link
官网 获取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.-
解压,安装 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
设置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
- 验证 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"
设置镜像仓库
阿里云镜像库
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/ , 注册用户
创建网络
将机器加入到 此网络中.
- 获取网络ID
# linux 服务器
zerotier-cli join NETWORKID
#windows
# 1. 打开zerotier-one 应用
# 2. 点击 join network , 输入 networkID
分配IP地址
第一步, 点击 auth 的多选按钮, 然后为机器分配IP地址, 若不选中auth ,各台机器不可以相互访问, auth 必须选中.
- 测试网络连接, ping 一下各台机器的ip地址.
zerotier 原理简单示意图:
如图所示:组网的基本思路就是 搭建一个虚拟交换机 zerotier-cli, 然后将 自己的 windows 以及 自己的云端服务加入到 zero-cli 中, 组成网络.
配置moon 服务:
**moon服务: 卫星服务, 即dns 副本, **
目的: 加快设备之间的连接, 缩短连接延迟
前提:
- 服务器 A(用作卫星服务): aliyun-centos 2c2g : 作为 moon 卫星服务
- 服务器 B: tencent-1c2g: 加入卫星服务
- 本地机器 windowsC: 加入卫星服务
具体步骤
在 服务器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
补充说明: 第二部修改格式
生成的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 , 并创建自己的配置文件
- 与remote 服务器建立连接, 修改编码格式
2. 映射项目路径
VSCODE
vscode 连接远程开发机器方式
- 公私钥 认证方式登录
用户名密码方式登录, 即 ssh root@172.10.0.1 形式登录,(需要重复输入多次,过于繁琐,淘汰)
STEP:
下载扩展插件 remote-development
添加配置参数 ,使用公私钥 进行remote 远程连接
- 选择对应的远程开发方式, ssh, wsl,container, 我选择的是ssh
Host tx-1year HostName 172.10.0.1 # 修改成你自己的云服务器IP地址 User root PreferredAuthentications publickey # 选择公私钥认证方式 IdentityFile ~/.ssh/id_rsa # 你的私钥地址
将公钥 信息配置到 开发机(即云服务器中)
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
- 建立远程连接 , 进行远程开发
PS: 参考链接
更进一步: link ,vscode 配置远程java 开发环境
shell 美化(选做)
linux, mac os 系统美化的主流思路是 : 使用zsh 替代bash , 然后使用 oh-my-zsh 美化 系统
- 参考链接: Linux/Mac如何配置zsh并使用Oh-my-zsh?让你的终端更加好用 - Mintimate’s Blog
Step:
安装 zsh
# 1-1.centos yum install -y zsh # 1-2. ubuntu , debain apt-get install zsh # 2 检查 zsh 是否安装成功 cat /etc/shells
设置成zsh 为默认shell 脚本 ,并重启终端
chsh -s /bin/zsh
安装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==')"
设置主题, ys(个人项,自己可以在github仓库中比较选择后选择自己喜欢的zsh主题)
vi ~/.zshrc ZSH_THEME="ys"
插件安装(选做)
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分配器中的缓存对象。
只描述步骤, 具体内容 请查看参考链接.
具体步骤
添加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
swap 分区文件格式化
mkswap /var/swapfile
挂载 并激活 swap 分区
swapon /var/swapfile
执行完之后, 可能会报 缺少0644,0600 权限, 如图
swapon: /var/swapfile: insecure permissions 0644, 0600 suggested.
解决方案:
chmod -R 0644 /var/swapfile
开启自动挂载
echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab
更改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 左右
重启, 查看系统 内存
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分区