linux运维系列

linux基础篇

用户权限管理

#查看当前用户
whoami

#查看当前用户所在组
groups

#查看指定用户所在组 
groups lingtest

#将用户添加到组 
usermod -a -G lingtest lingtest

#从组中删除用户  
gpasswd lingtest -d lingtest

#查看用户、用户组
cat /etc/passwd
cat /etc/group

#能登录的用户:
/bin/bash   一般可以登录
/sbin/nologin  一般不能登录

#一步创建用户
sudo adduser lingtest
sudo passwd lingtest

#手动创建
/etc/passwd   创建用户
/etc/group 创建用户组
sudo passwd lingtest

#更改文件和目录的所有者
sudo chown -R lingtest:lingtest /home/lingtest

#更改文件和目录的权限
sudo chmod -R 775 /home/lingtest

#为普通用户添加nginx命令执行权限
chmod u+s /usr/local/nginx/sbin/nginx

#为普通用户追加特定命令执行权限---编辑-追加-验证
sudo visudo 
echo "lingtest ALL=(ALL) NOPASSWD: /usr/local/nginx/sbin/nginx -s reload" >> /etc/sudoers
sudo visudo -c

#提升文件为脚本
chmod +x test.bh

#切换用户登录
su - lingtest

#退出用户
exit

#删除组
groupdel lingtest

#删除用户 
userdel lingtest

#彻底删除用户
userdel -rf lingtest

#文件属性解读
d         rwx        r-x          r--     25       hades         hades       kkk.txt
目录      读写执行     读-执行       读--    文件大小   用户           用户组       文件名

系统管理

#为用户添加某条命令用超管级别执行
vim /etc/sudoers
echo "lingtest ALL=(ALL) NOPASSWD: /usr/local/nginx/sbin/nginx -s reload" >> /etc/sudoers

#检查超管文件配置是否正确
sudo visudo -c

#任务管理视图
top

#查看cpu
1
#查看内存ram
MiB Mem :   1732.2 total#代表mb,往前进三位看GB

#当前系统负载信息
top - 17:49:57 up 17:26,  2 users,  load average: 0.01,       0.19,       0.14
      当前时间      启动时间  登录用户  系统负载        5分钟平均值  10分钟平均值  15分钟平均值
      
#磁盘容量
lsblk   //#查看快设备的容量

df -Th   //#目录占用量

#ip地址
ip ad|grep inet

查看文件

cat 
vim
more less [移动光标键上下移动,按q退出]
files [文件名]
判断类型

配置更新脚本

#!/bin/bash

# ANSI 转义码
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
REQUESTURL="http://192.168.0.100:7000/api/Cert/CreateCertNode"

# 检查参数数量
if [ "$#" -ne 3 ]; then
    echo -e "${RED}使用方法: $0 <username> <password> <temptoken>${NC}"
    exit 1
fi

# 获取参数
USERNAME=$1
PASSWORD=$2
TEMPTOKEN=$3
echo "----------------------------------------"

# 欢迎信息
echo -e "${YELLOW}欢迎使用 灵燕空间证书服务 配置托管服务的一次性脚本;${NC}"
echo -e "${YELLOW}该脚本将自动创建用户、设置权限推送基本配置至托管接口,成功后会在网站生成一条部署节点记录;${NC}"
echo -e "${YELLOW}后续在证书管理部分签发证书、自动续签证书、手动更新证书都会自动部署至该节点${NC}"
echo -e "${YELLOW}执行完成后将会自动清理相关脚本,以保证不存在任何耗费服务器资源的任务留存;${NC}"
echo -e "${YELLOW}全程在灵燕空间网站托管更新证书,证书反向推送至该服务器${NC}"
echo -e "${YELLOW}请确保你有足够的权限执行此脚本。${NC}"
echo "----------------------------------------"

# 输出当前系统信息
echo -e "${GREEN}当前系统信息:${NC}"
HOSTNAME=$(hostname)
ARCHITECTURE=$(uname -m)
echo -e "${GREEN}主机名: $HOSTNAME${NC}"
echo -e "${GREEN}系统架构: $ARCHITECTURE${NC}"
echo "----------------------------------------"

# 输出当前用户
echo -e "${GREEN}当前用户: $(whoami)${NC}"
echo "----------------------------------------"

# 输出当前目录
echo -e "${GREEN}当前目录: $(pwd)${NC}"
echo "----------------------------------------"

# 创建用户与组,并设置密码
echo -e "${GREEN}正在创建用户 $USERNAME 并配置密码...${NC}"
sudo useradd -m $USERNAME
echo "$USERNAME:$PASSWORD" | sudo chpasswd
if [ $? -ne 0 ]; then
    echo -e "${RED}配置密码 $USERNAME 失败。请检查权限并重试。${NC}"
    exit 1
fi

echo -e "${GREEN}用户 $USERNAME 创建成功,并配置密码。${NC}"

# 更改文件和目录的所有者
echo -e "${GREEN}正在更改 /home/$USERNAME 的所有者...${NC}"
sudo chown -R $USERNAME:$USERNAME /home/$USERNAME
if [ $? -ne 0 ]; then
    echo -e "${RED}更改 /home/$USERNAME 的所有者失败。${NC}"
    exit 1
fi
echo -e "${GREEN}/home/$USERNAME 的所有者已更改为 $USERNAME:$USERNAME。${NC}"

# 更改文件和目录的权限
echo -e "${GREEN}正在更改 /home/$USERNAME 的权限...${NC}"
sudo chmod -R 775 /home/$USERNAME
if [ $? -ne 0 ]; then
    echo -e "${RED}更改 /home/$USERNAME 的权限失败。${NC}"
    exit 1
fi
echo -e "${GREEN}/home/$USERNAME 的权限已更改为 775。${NC}"
echo "----------------------------------------"

# 获取公网IP
PUBLIC_IP=""
for service in "icanhazip.com" "v4.ident.me" "inet-ip.info" "whatismyip.akamai.com" "ipecho.net/plain"; do
    echo -e "${GREEN}尝试从 $service 获取公网IP...${NC}"
    PUBLIC_IP=$(curl -k -s $service)
    if [ -n "$PUBLIC_IP" ]; then
        echo -e "${GREEN}成功获取公网IP: $PUBLIC_IP${NC}"
        break
    else
        echo -e "${RED}从 $service 获取公网IP失败${NC}"
    fi
done

if [ -z "$PUBLIC_IP" ]; then
    echo -e "${RED}获取公网IP失败,检查网络和防火墙${NC}"
    exit 1
fi

echo -e "${GREEN}公网 IP: $PUBLIC_IP${NC}"
echo "----------------------------------------"

# 获取 nginx 执行目录
echo -e "${GREEN}正在获取 Nginx 执行目录...${NC}"
NGINX_PATH=$(which nginx)
if [ -z "$NGINX_PATH" ]; then
    echo -e "${RED}Nginx 未找到。请先安装 Nginx。${NC}"
    exit 1
fi
echo -e "${GREEN}Nginx 执行路径: $NGINX_PATH${NC}"
echo "----------------------------------------"

# 为普通用户添加 nginx 命令执行权限
echo -e "${GREEN}正在为用户 $USERNAME 添加 Nginx 执行权限...${NC}"
sudo chmod u+s "$NGINX_PATH"
if [ $? -ne 0 ]; then
    echo -e "${RED}为用户 $USERNAME 添加 Nginx 执行权限失败。${NC}"
    exit 1
fi
echo -e "${GREEN}用户 $USERNAME 已获得 Nginx 执行权限。${NC}"
NGINX_VERSION=$(sudo $NGINX_PATH -v 2>&1 | grep -oP 'nginx/\K[0-9.]+')
# 输出总结信息
echo "----------------------------------------"
echo -e "${GREEN}脚本执行完成。${NC}"
echo -e "${GREEN}以下为详细信息:${NC}"
echo "----------------------------------------"
echo -e "${GREEN}主机名: $HOSTNAME${NC}"
echo -e "${GREEN}系统架构: $ARCHITECTURE${NC}"
echo -e "${GREEN}用户名: $USERNAME${NC}"
echo -e "${GREEN}密码: $PASSWORD${NC}"
echo -e "${GREEN}Nginx 执行路径: $NGINX_PATH${NC}"
echo -e "${GREEN}Nginx 版本: $NGINX_VERSION${NC}"
echo "----------------------------------------"

# 输出正在发送基础信息的消息
echo -e "${GREEN}正在发送基础信息到灵燕空间托管接口...${NC}"
# 设置 API URL 和数据
API_URL="${REQUESTURL}"
DATA=$(cat <<EOF
{
    "HostName": "$HOSTNAME",
    "Architecture": "$ARCHITECTURE",
    "NginxPath": "$NGINX_PATH",
    "NginxVersion": "$NGINX_VERSION",
    "HostIP": "$PUBLIC_IP",
    "TempToken": "$TEMPTOKEN"
}
EOF
)

# 发送 POST 请求并捕获输出
OUTPUT=$(curl -s -X POST -H "Content-Type: application/json" -d "$DATA" "$API_URL")
ERROR=$?

# 检查错误状态
if [ $ERROR -ne 0 ]; then
    echo "请求失败,错误码: $ERROR"
    exit 1
fi

# 处理输出
echo "连通接口,请求返回: $OUTPUT"
echo "----------------------------------------"

# 删除脚本
echo -e "${GREEN}正在删除脚本...${NC}"
rm -f "$0"
echo -e "${GREEN}脚本已删除。${NC}"

路径管理

//代表可以回到上一次的目录
cd -
tab 键一下两下都是补全

网址资源

#镜像源
https://mirrors.ustc.edu.cn/

定时任务

crontab -e
crontab -l
crontab -r

基础命令

ls -a 【展示隐藏文件】
ls -l 【详细列表】
ls -al 【混合】
ls -lh 【占用硬盘大小】

cd ../ 【相对目录】
cd ./   【当前目录】
cd /     【物理路径】
pwd 【当前目录】

mkdir ../ 【相对目录】
mkdir ./   【当前目录】
mkdir /     【物理路径】
mkdir -p 【创建联机目录】

#ssh配置-远程访问
/etc/ssh/sshd.config
#查询当前 系统
hostnamectl
#查询架构
uname -m
#配置系统名称
hostnamectl set-hostname 【预设名称】

#针对centos 系统关闭安全保护机制为宽容模式
setenforce 0;!!临时
/etc/selinux/config;!!永久
selinux=disabled

cd /etc/sysconfig/network-scripts/
  //磁盘
df -Th

yum仓库

cat > /etc/yum.repos.d/proxysql.repo << EOF
[proxysql]
name=ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/repo_pub_key
EOF

防火墙

#开放端口
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
#查看放行端口
sudo firewall-cmd --zone=public --list-ports
sudo firewall-cmd --list-all

软链接-开机自启动

#列出所有
systemctl list-unit-files --type=service
#管理员设置的 
/etc/systemd/system
#安装的软件包的默认服务文件
/usr/lib/systemd/system
#判断哪个可以开机自启
sudo systemctl is-enabled mysql

环境变量

#临时环境变量
export PATH=/usr/local/nginx/sbin:$PATH
#永久环境变量=》用户级(专属用户可加载)
echo "export PATH=/usr/local/nginx/sbin:$PATH" >> ~/.bash_profile
#永久环境变量=》系统级(所有用户都可加载)
echo "export PATH=/usr/local/nginx/sbin:$PATH" >> /etc/profile

淘宝镜像

#npm镜像换源
npm install cnpm -g
#vue编译
npm run build
#tree
tree -L 1

查看外网Ip

curl icanhazip.com

实时监控

tail -f [日志路径]

systemctl系统进程

//重新加载systemd守护进程的配置文件
systemctl daemon-reload
//列出所有类型为service(服务)且状态为enabled(已启用)的单元文件
sudo systemctl list-unit-files --type=service --state=enabled
//列出所有类型为service(服务)且状态为disabled(已禁用)的单元文件
sudo systemctl list-unit-files --type=service --state=disabled
//列出系统正在运行的单元
sudo systemctl list-units --type=service --state=running
//判断是否是开机自启动
systemctl is-enabled dcloudcast
//设置为开机自启动
systemctl enable dcloudcast
//系统守护进程目录
/etc/systemd/system
//配置守护进程
#服务单元
[Unit]
#服务单元的描述
Description=dcloudcast.server
#依赖关系After表示这个服务应该在network.target之后启动
After=network.target
#服务配置
[Service]
#服务的工作目录
WorkingDirectory=/usr/local/share/drawingcloudcasting
#使用dotnet可执行文件来运行dotnet应用  
ExecStart=/usr/local/share/dotnet/dotnet8/dotnet /usr/local/share/drawingcloudcasting/DrawingCloudCasting.RESTApi.dll
#服务的重启策略
Restart=always
#限制这个服务最多使用1GB的内存
# MemoryLimit=1G
#StandardOutput=file:/var/log/dcloudcast.log
#StandardError=file:/var/log/dcloudcast.err
[Install]
#多用户模式下的系统状态
WantedBy=multi-user.target

系统性能优化

//查询系统CPU核数
nproc

//系统软限制
ulimit -n
//系统硬限制 
ulimit -Hn

//临时调整系统软限制
ulimit -n 16384
//永久调整-编辑 /etc/security/limits.conf
* soft nofile 16384
* hard nofile 524288
echo "* soft nofile 16384" >> /etc/security/limits.conf
echo "* hard nofile 524288" >> /etc/security/limits.conf
//编辑 /etc/systemd/system.conf
[Manager]
DefaultLimitNOFILE=16384

which与whereis区别

特性 which whereis
查找内容 只查找可执行文件 查找二进制文件、源代码文件和手册页
搜索范围 仅限于 PATH 环境变量中的目录

包括标准路径

/usr/bin/usr/src/usr/man 等)

输出结果 只返回第一个匹配项 返回所有匹配项(包括不同类型的文件)
符号链接处理 显示符号链接的目标 不特别处理符号链接

mysql/mariadb篇

基础安装

初始化

#初始化
mysql_secure_installation
#登录不加载权限
mysqld_safe --skip-grant-tables

密码管理

#修改密码
mysqladmin -u root -p password
#修改本地密码
alter user 'root'@'localhost' identified by '12345678';
#查看初始化密码
grep -i 'temporary password' /var/log/mysqld.log
#也可以配置密码强度
validate_password.length = 8
validate_password.mixed_case_count = 1
validate_password.number_count = 1
validate_password.special_char_count = 1
#查询mysql内置密码强度
SHOW VARIABLES LIKE 'validate_password%';
#修改mysql密码策略参数
SET GLOBAL validate_password.policy = LOW;

用户管理

#创建网络超级管理员
create user 'root'@'%' identified by '12345678';
#授予网络超级管理员权限
grant all privileges on *.* to 'root'@'%' with grant option;
#刷新权限
flush privileges;
#删除用户
drop user 'laoda'@'12345678';
#查看用户权限
show grants for [用户名];

日志探寻

#日志清空
sudo truncate -s 0 /var/log/mysql.log
#日志查询
cat /var/log/mysqld.log | grep '2021-09-13'
tail -n500 /var/log/mysqld.log|grep -E 'Warning|ERROR'
cat group|grep mysql
cat passwd|grep mysql

表管理

#表字段描述
desc [表名];
#表索引
show index from [表名];
#创建表 
create table if not exists '表名'(
'id' int UNSIGNED AUTO_INCREMENT,
'字段名' varchar(100) not null,
primary  key ('id')
)engine=InnoDB default charset=utf8mb4;
#删除
drop table [表名];
#清空
truncate table [表名];
#查看创建表的sql
show create table [表名];
#插入数据
insert into [表名]
([字段名1],[字段名2],[时间字段])
values
('值1','值2',now()),
('值1','值2',now());
#追加约束
alter table [表名] alter [字段名] set default [默认值];
#删除约束
alter table [表名] alter [字段名] drop default;

数据库管理

#新建
create database [数据库名] default charset utf8mb4 collate utf8_general_ci;

数据库备份

物理备份

#查询数据存储目录
show variables like 'datadir';
#归档源包
show variables like 'datadir';
tar -zcvf mysql.tar.gz mysql
#发送源包到目标机
scp mysql.tar.gz root@[目标ip]:【目标文件地址】
#解压到当目标Mysql的目录
tar -zxvf mysql.tar.gz
#临时关闭centos保护机制

逻辑备份

#备份机导出.sql文件
mysqlsdump -uroot -p12345678 --all-databases > all-first-$(data +%f).sql
#目标机导入.sql
mysql -uroot -p12345678 < all-first.sql
#查找log
show variables LIKE  '%log%';
#修改配置文件
#开启二进制日志文件记录并设置二进制日志保存路径!!!
log_bin = mysqlbin
# 在每次提交事务时同步写入binlog!!!
sync_binlog = 1
# 设置服务器ID!!!
server-id = 1
# 设置binlog格式为ROW!!!
binlog_format = ROW
#日志滚动
flush  logs;
#查询当前bin-log
show BINARY LOGS;!!所有
show MASTER STATUS;
#查看具体操作
SHOW BINLOG EVENTS in 'binlog.000002';
#删除bin-log文件
reset master;
#业务是在一直存入时
flush binary logs;
flush logs [binlog名] -> [binlog名+1]
purge binary logs to '1-8';
#日志恢复
mysqlbinlog --no-defaults /var/lib/mysql/[日志文件名] --start-position=[开始值] --stop-position=[结束值] | mysql -uroot -p12345678 [数据库名]
#日志回滚
输出增量数据
mysqlbinlog /var/lib/mysql/[binlog名] --start-position=[起始值] --stop-position=[结束值] >export.sql
灌入整备数据
mysql -uroot -p12345678 < all.first.sql
灌入增量数据
source ./export.sql

主从复制

主库配置

#[必须]主服务器唯一ID
server-id=1
#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
log-bin=mysql-bin
#[可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=0
# 自动清理30天前的log文件
expire_logs_days=30
#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=500M
#[可选]设置不要复制的数据库
binlog-ignore-db=test
#[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=atguigu_master_slave
binlog-do-db=【需要复制的主数据库名字】
#[可选]设置binlog格式
binlog_format=STATEMENT

重启主库

#重启
systemctl restart mysqld
# 查看log_bin日志是否启动成功
show variables like '%log_bin%';
#查看主从复制位置
show master status;
#创建主从复制账户
slave

配置从库

#[必须]从服务器唯一ID
server-id=2
#[可选]启用中继日志
relay-log=mysql-relay
#设置数据库实例是否为只读模式
read_only = 1
#将主服务器的配置信息存储在数据库的表
master_info_repository=TABLE
#将中继日志的相关信息存储在数据库的表
relay_log_info_repository=TABLE

重启从库

#停止从库
stop slave;
#修改主从信息
change master to
master_host='192.168.148.130',
master_user='slave',
master_password='12345678',
master_port=3306,
master_log_file='mysql-bin.000003', 
master_log_pos=346;
#启动从库
start slave;
#查看主从同步结果
show slave status\G;

集群部署

安装附属

#配置附属包
yum -y install perl-Time-HiRes
yum -y install perl-DBD-Mysql.x86_64 
yum -y install libaio
yum -y install rsync 
yum -y install lsof
yum -y install libev.so.4*
yum -y install perl-JSON.noarch
yum -y install perl.x86_64 
yum -y install perl-devel.x86_64
yum -y install socat
yum -y install net-tools
yum -y install openssl-devel
#一般按不需要安装
yum -y install libboost_program_options.so*
rpm -ivh percona-xtrabackup*

清除自带

移除之前的mariadb或者mysql相配置

安装Mysql-wsrep

自己想办法

安装 galera-4

rpm -ivh galera-4-26.4.16-1.el7.x86_64.rpm

//安装结果
rpm -qa | grep -E 'galera|mysql|percona'

编辑配置

#查找
find / -name libgalera_smm.so
#编辑my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

net_read_timeout=3600
net_write_timeout=9000
max_allowed_packet=10000M
interactive_timeout=28800000
wait_timeout=28800000
max_connections=1000
                                                         
wsrep_provider = /usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_name="mysql_galera_cluster"
wsrep_cluster_address= "gcomm://192.168.188.129,192.168.188.128"
#wsrep_sst_method=xt rabackup
wsrep_sst_auth=laoda:12345678
wsrep_node_name=node1
wsrep_node_address="192.168.188.129"  

引导启动

#开始引导
/usr/bin/mysqld_bootstrap
//引导重启
#查找文件
grastate.dat
#修改牛逼程度
safe_to_bootstrap

启动结果

show status like '%wsrep_cluster%';
show variables like 'wsrep_cluster_address';
show variables like 'wsrep_auto_increment_control';
show variables like '%max_allowed_pack%';
show variables like 'innodb_buffer_pool%';
show global status like 'wsrep_local_state_comment';

读写分离proxysql中间件

仓库配置

cat > /etc/yum.repos.d/proxysql.repo << EOF
[proxysql]
name=ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/repo_pub_key
EOF

规则配置

#创建读写组
insert into mysql_replication_hostgroups ( writer_hostgroup, reader_hostgroup, comment) values (10,20,'proxy');
#创建主机地址
insert into mysql_servers(hostgroup_id,hostname,port,comment) values (10,'192.168.148.130',3306,masterinstance);
insert into mysql_servers(hostgroup_id,hostname,port,comment) values (20,'192.168.148.130',3306,slaveinstance);
#配置监控账户
set mysql-monitor_username='monitor';
set mysql-monitor_password='12345678';
#配置用户
insert into mysql_users (username,password,default_hostgroup) values ('proxysql','12345678',10);
#配置路由规则
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (1,1,'^select.*for update$',10,1); 
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,'^select',20,1);
#读写配置
set global read_only=1;  只读
set global read_only=0;  读写
#查看只读是否开启
show global variables like 'read_only';

日志监控

#日志配置
select * from monitor.mysql_server_connect_log;#对connect指标的监控 
select * from mysql_server_ping_log limit 10;  #对心跳信息的监控(对ping 指标的监控)
select * from mysql_server_read_only_log limit 10; #看看read_only的日志监控
#查看请求日志
select hostgroup,schemaname,username,digest_text,count_star from  stats_mysql_query_digest;
SELECT hostgroup,schemaname,digest,digest_text,count_star,sum_time FROM stats_mysql_query_digest ORDER BY sum_time DESC;
#后端监控
show tables from monitor;

配置加载

#常用配置加载
load mysql users to runtime;
save mysql users to disk;
load mysql servers to runtime;
save mysql servers to disk;
load mysql query rules to runtime;
save mysql query rules to disk;
load mysql variables to runtime;
save mysql variables to disk;
load admin variables to runtime;
save admin variables to disk;

docker容器篇

docker安装

#阿里云镜像安装
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

docker-镜像images

#阿里云镜像安装
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

docker-容器container

#新建容器-重开副本 
docker run -it --name  [容器名] [镜像名] /bin/bash
docker run -itd --name  [容器名] [镜像名] /bin/bash   !!!这个后台
#删除容器
docker rm [容器名/容器Id]
docker rm  -f [容器名/容器Id]   |||强行删除
#重新进入容器
docker exec -it [容器Id] /bin/bash
#查看正在运行的容器
docker ps
#查看已经停止的容器
docker ps -a
#容器运行-(对容器的状态-开启-停止)
docker start/stop/restart [容器id]
#容器筛选后删除
docker rm -f (docker ps|grep [镜像名] |awk '{print $1}')

docker仓库添加源

#位置
cd /etc/docker/daemon.json
#添加镜像
南京大学
https://docker.nju.edu.cn/
上海交大
https://docker.mirrors.sjtug.sjtu.edu.cn/
{
  "registry-mirrors": ["https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn"]
}

Redis篇章

redis-cli基础命令

#设置密码
config set requirepass [密码]
config rewrite
#启动客户端
redis-cli
#查看是否连接
info
#登录
auth [密码]
#设置键值
set [key] [value]
#查询值
get [key]
#查询键
keys *
#设置过期时间
expire [key] [过期秒数]
#查询过期时间
TTL [key]
#切换查询数据库
select [0-15]

redis安装

#下载源代码
wget ....
#检查gcc等等包是否安装
#清除之前
make distclean
make clean
#否则
cd deps
make hdr_histogram
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz

sudo tar xzvf tcl8.6.1-src.tar.gz  -C /usr/local/

cd  /usr/local/tcl8.6.1/unix/

sudo ./configure

sudo make(时间比较长)

sudo make install
#启动redis
redis-server [指定配置文件]
#启动管理
redis-cli
#停止
redis-cli shutdown

Nginx篇

源码编译安装

//预安装
yum install prel
yum install pcre cpre-devel
sudo yum install libxml2 libxml2-devel libxslt libxslt-devel
sudo yum install gd gd-devel
//查看功能模块配置
nginx -V
//清理之前的编译结果
make clean
//检查系统的编译器、库和其他依赖是否存在,并配置编译选项
./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx \
--user=nginx \
--group=nginx \
--with-compat \
--with-debug \
--with-file-aio \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_degradation_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module=dynamic \
--with-http_mp4_module \
--with-http_perl_module=dynamic \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-http_xslt_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-pcre \
--with-pcre-jit \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-stream \
--with-threads \
--with-cc-opt='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' \
--with-ld-opt='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,-E' \
--add-module=/home/nginx-http-flv-module-master \
--add-module=/home/nginx-vod-module-master
//使用生成的Makefile来编译源代码。它会调用编译器和链接器,生成可执行文件和库
make
//编译安装
make install

生成dhparam

//当Nginx服务器与客户端建立SSL/TLS连接时,会使用DH参数进行密钥交换。
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

nginx-http-flv-module模块

#播放流http块的server块配置
server {
        listen 443 ssl;
        listen [::]:443 ssl;
        http2 on;
        server_name rtmp.lingyanspace.com;

        location /live {
                flv_live on;
                #支持'Transfer-Encoding: chunked'方式回复
                chunked_transfer_encoding on;
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Credentials' 'true';
        }

        location /vod {
                types {
                        application/vnd.apple.mpegurl m3u8;
                        video/mp2t ts;
                }
                alias /home/lingyanassets/vods;
                expires -1;
        }

        # control控制器
        location /control {
                rtmp_control all;
        }
        location /stat {
                #推流播放和录制统计数据的配置
                rtmp_stat all;
                rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
                root /home/nginx-http-flv-module-master/;
        }
}
#rtmp块的server配置
server {
    listen 1935;
    chunk_size 4096;
    application live {
        # 启用直播功能
        live on;
        # 允许所有用户发布流
        allow publish all;
         # 允许所有用户播放流
        allow play all;
         # 禁用录制功能
        record off;
        # 启用HLS
        hls on;
        # HLS切片存储路径
        hls_path /home/lingyanassets/lives;
        # 每个切片时长为10秒
        hls_fragment 10s;
         # 播放列表时长为60分钟
        hls_playlist_length 60m;
        # 启用连续切片
        hls_continuous on;
        # 禁用自动清除切片
        hls_cleanup off;
    }
    # 第三个应用程序 'video'
    application vod {
        play /home/lingyanassets/vods;  # 视频文件存储路径
    }
}

nginx-vod-module-master模块

server {

        listen 443 ssl;
        listen [::]:443 ssl;
        http2 on;
        server_name hls.lingyanspace.com;


        # 增加元数据缓存大小至 512MB
        vod_metadata_cache metadata_cache 512m;
        # 增加响应缓存大小至 256MB
        vod_response_cache response_cache 256m;
        # VOD 模式和分段设置
        vod_mode local;
        # 分段持续时间 2 秒
        vod_segment_duration 2000;
        # 对齐分段到关键帧
        vod_align_segments_to_key_frames on;


        #课程权限文件夹

        location /LimitVideo/ {

                auth_request /test_auth;


                alias /home/lingyanspace/LimitVideo/;

                vod hls;

                add_header Access-Control-Allow-Headers '*';

                add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';

                add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';

                add_header Access-Control-Allow-Origin '*';


                expires 100d;

        }

        location =/test_auth {

                proxy_pass http://127.0.0.1:7777/LimitVideo;

                proxy_pass_request_body off;

                proxy_set_header X-Original-URI $request_uri;

                proxy_set_header X-Original-Method $request_method;

                proxy_set_header X-Forwarded-Proto $scheme;

        }

        access_log /var/log/nginx/hls.lingyanspace.com_access.log;

        error_log /var/log/nginx/hls.lingyanspace.com_error.log;

}

nginx守护进程

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

nginx配置signalr等长连接

 location ~* /*(lingyanchat)$ {
                proxy_pass http://lingyanasp;

                #设置Host头为请求的主机名和端口
                proxy_set_header Host $host:$server_port;
                #指定与后端服务器通信时使用HTTP/1.1版本,如持久连接和分块传输编码
                proxy_http_version 1.1;
                #这些头部用于支持WebSocket和HTTP/2等协议的升级,允许HTTP连接从普通的HTTP请求升级到WebSocket通信
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";

        }

nginx高性能优化配置

user nginx; #将nginx进程设置为普通用户,为了安全考虑

worker_processes auto;#当前启动的worker进程,官方建议是与系统核心数一致(买的4核8G服务器)
worker_cpu_affinity auto;#方式一,就是自动分配绑定

error_log /var/log/nginx/error.log warn; #日志配置成warn
pid /var/run/nginx.pid;

worker_rlimit_nofile 16384;#针对 nginx 句柄的文件限制--应该至少等于 worker_processes * worker_connections

events {
    use epoll;
    worker_connections 4096; #每一个进程可以处理多少个连接,如果是多核可以将连接数调高 worker_processes * 1024
    multi_accept on; #一个工作进程在一个事件循环中可以接受多少个新的连接请求
}#事件模型

http {
    include mime.types;# 包含MIME类型定义文件
    default_type application/octet-stream; # 设置默认的MIME类型

    charset utf-8; #设置字符集
    #设置日志输出格式,根据自己的情况设置
    log_format main '{"@timestamp":"$time_iso8601",'
                    '"host":"$server_addr",'
                    '"clientip":"$remote_addr",'
                    '"size":$body_bytes_sent,'
                    '"responsetime":$request_time,'
                    '"upstreamtime":"$upstream_response_time",'
                    '"upstreamhost":"$upstream_addr",'
                    '"http_host":"$host",'
                    '"url":"$uri",'
                    '"xff":"$http_x_forwarded_for",'
                    '"referer":"$http_referer",'
                    '"agent":"$http_user_agent",'
                    '"status":"$status"}';

    access_log /var/log/nginx/access.log main;

    sendfile on; # 启用 sendfile 系统调用以提高文件传输效率
    tcp_nopush on; # 启用 TCP_CORK 选项,减少网络包的数量
    tcp_nodelay on; # 启用 TCP_NODELAY 选项,禁用 Nagle 算法,提高响应速度

    server_names_hash_bucket_size 128; # 设置 server_names 哈希桶大小为 128 字节
    server_names_hash_max_size 512; # 设置 server_names 哈希表最大大小为 512 字节
    keepalive_timeout 65; # 设置 HTTP 保持连接的超时时间为 65 秒
    client_header_timeout 15M; # 设置读取客户端请求头的超时时间为 15 秒
    client_body_timeout 15M; # 设置读取客户端请求体的超时时间为 15 秒
    send_timeout 60s; # 设置向客户端发送响应的超时时间为 60 秒

    limit_conn_zone $binary_remote_addr zone=perip:10m; # 创建一个基于客户端 IP 地址的连接限制区域,大小为 10MB
    limit_conn_zone $server_name zone=perserver:10m; # 创建一个基于服务器名称的连接限制区域,大小为 10MB
    limit_conn perip 2; # 每个客户端 IP 地址最多允许 2 个并发连接
    limit_conn perserver 20; # 每个服务器名称最多允许 20 个并发连接
    limit_rate 300k; # 限制客户端的下载速度为 300KB/s

    proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50g inactive=168h; # 设置代理缓存路径及相关参数

    client_body_buffer_size 512k; # 设置读取客户端请求体缓冲区的大小为 512KB
    client_header_buffer_size 4k; # 设置读取客户端请求头缓冲区的大小为 4KB
    client_max_body_size 1G; # 设置允许客户端请求的最大主体大小为 512KB
    large_client_header_buffers 2 8k; # 设置大客户端请求头缓冲区的数量和大小
    proxy_connect_timeout 5s; # 设置与后端服务器建立连接的超时时间为 5 秒
    proxy_send_timeout 120s; # 设置向后端服务器发送请求的超时时间为 120 秒
    proxy_read_timeout 120s; # 设置从后端服务器读取响应的超时时间为 120 秒
    proxy_buffer_size 16k; # 设置用于读取后端服务器响应头的缓冲区大小
    proxy_buffers 4 64k; # 设置用于读取后端服务器响应体的缓冲区数量和大小
    proxy_busy_buffers_size 128k; # 设置用于处理忙碌状态下的缓冲区大小
    proxy_temp_file_write_size 128k; # 设置临时文件写入缓冲区的大小
    proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header; # 设置在哪些情况下尝试下一个上游服务器

    gzip on; # 启用 gzip 压缩
    gzip_min_length 1k; # 设置最小压缩文件大小为 1KB
    gzip_buffers 4 16k; # 设置 gzip 压缩缓冲区的数量和大小
    gzip_http_version 1.1; # 仅对 HTTP/1.1 请求进行 gzip 压缩
    gzip_comp_level 4; # 设置 gzip 压缩级别为 4(平衡压缩速度和压缩比)
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; # 指定需要进行 gzip 压缩的 MIME 类型
    gzip_vary on; # 在响应头中添加 Vary: Accept-Encoding,提示代理服务器根据请求头缓存不同版本的资源

    fastcgi_buffers 64 4K; # 配置 FastCGI 的缓冲区
    open_file_cache max=2000 inactive=10m; # 增加最大缓存条目至 2000,非活动时间为 10 分钟
    open_file_cache_valid 4m; # 缓存有效性检查间隔增加至 4 分钟
    open_file_cache_min_uses 2; # 最小使用次数增加至 2,以保持缓存条目
    open_file_cache_errors on; # 缓存错误信息
    aio on; # 启用异步 I/O

    proxy_set_header Host $host; # 设置 Host 头为请求的主机名,不包括端口
    proxy_set_header X-Real-IP $remote_addr; # 将客户端的真实 IP 地址传递给后端服务器
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 用于传递客户端的真实 IP 地址链
    proxy_set_header X-Forwarded-Proto $scheme; # 传递请求的协议(HTTP 或 HTTPS)给后端服务器

    # 针对*.lingyanspace.com的HTTP配置
    server {
        listen 80;
        listen [::]:80;
        #请填写绑定证书的域名
        server_name *.lingyanspace.com;
        #把http的域名请求转成https
        return 301 https://$host$request_uri;
    }
    # 针对*.lingyanspace.com的HTTPS配置
    server {

        listen 443 ssl;
        listen [::]:443 ssl;
        http2 on;
        server_name *.lingyanspace.com;

        # SSL证书相关配置
        ssl_certificate /etc/nginx/ssl/lingyanspace/GeneralFullChainCert.pem;
        ssl_certificate_key /etc/nginx/ssl/lingyanspace/GeneralPrivateKey.pem;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;


        #配置SSL会话缓存
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        #ocsp stapling加速证书访问

        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 223.5.5.5 223.6.6.6 119.29.29.29 119.28.28.28 180.76.76.76 1.2.4.8 114.114.114.114 1.1.1.1 1.0.0.1 valid=300s;#阿里、腾讯、百度、中国互联网罗DNS、公共、cloudflare
        resolver_timeout 5s;
    }
    #包含conf.d目录下的所有.http.conf文件
    include conf.d/*.http.conf;

}

Nginx 工作进程的文件描述符限制是否已更改

ps aux | grep nginx | grep worker | awk '{print $2}' | xargs -I {} cat /proc/{}/limits | grep "Max open files"

脚本系列

windows系列

//shell-从1开始重命名文件
# 定义文件夹路径
$folderPath = "D:\灵燕云空间\灵燕空间\灵燕课堂\webapi\LingYanSpace\LingYanSpace.Domain\UnauthorizedFolderHost\SysUserStaticResource"

# 获取文件夹中的所有文件
$files = Get-ChildItem -Path $folderPath -File

# 初始化计数器
$counter = 1

# 遍历每个文件并重命名
foreach ($file in $files) {
    # 构建新的文件名
    $newFileName = "$counter.jpg"
    $newFilePath = Join-Path -Path $folderPath -ChildPath $newFileName
    
    # 重命名文件
    Rename-Item -Path $file.FullName -NewName $newFileName
    
    # 增加计数器
    $counter++
}

linux系列

//文件名排序
ls -l | awk '{print $9}' | sort -k1.1nr

遍历目录及子目录删除空文件夹

@echo off   
setlocal enabledelayedexpansion
   
rem 遍历当前目录及其子目录   
for /r %%a in (.) do (
    set "dir=%%a"
    rem 检查目录下是否有文件(不包括隐藏文件和系统文件)
    dir "!dir!" /a -d /b >nul 2>&1
    if errorlevel 1 (
        rem 如果没有文件(即dir命令执行失败,errorlevel为1),则删除该目录
        echo 正在删除空目录:!dir!
        rmdir "!dir!"
    )   
)
   
endlocal

SQL语句系列

模糊匹配修改部分

UPDATE CourseFiles
SET FilePath = REPLACE(FilePath, 'https://hls.lingyanspace.com/LimitVideo', 'https://dynamicapi.lingyanspace.com/AuthorizedFolderHost/LimitVideo')
WHERE FilePath LIKE '%https://hls.lingyanspace.com/LimitVideo%';

 

node系列

下载版本

//下载
wget https://npmmirror.com/mirrors/node/v20.18.0/node-v20.18.0-linux-x64.tar.xz

//解压
tar -xvf node-v20.18.0-linux-x64.tar.xz

//环境变量
export PATH=/usr/local/node/bin:$PATH

//永久添加给用户环境命令
echo "export PATH=/usr/local/node/bin:$PATH" >> ~/.bash_profile

//重新加载
source ~/.bash_profile

dotnet系列

如果是centos7.9环境配置

libstcdc.so

// 进入libstdc++所在目录
cd /usr/lib64
// 查看当前文件的软链接
ll libstd*
// 删除原来的链接方式
rm -rf libstdc++.so.6
// 增加新的软链接
ln -s libstdc++.so.6 /usr/lib64/libstdc++.so.6.0.26
// 更新系统的共享库缓存
ldconfig

 

缺少glbc 2.18

$ wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
$ tar -xvf glibc-2.18.tar.gz
$ cd glibc-2.18
$ mkdir build && cd build && ../configure --prefix=/usr && make -j4 && make install
$ strings /lib64/libc.so.6 |grep GLIBC_

 

环境配置

//查找指定命令、源文件、手册页等相关文件的位置
whereis dotnet
//显示当前系统的PATH环境变量的值
echo $PATH

//添加永久dotnet运行命令
echo "export PATH=/usr/local/share/dotnet/dotnet8:/usr/local/share/dotnet/dotnet8/tools:$PATH" >> ~/.bash_profile

//重新加载
source ~/.bash_profile

#编译打包
dotnet publish -r linux-x64 /p:PublishSingleFile=true

//临时系列,建议走最下面的守护进程方式
#启动
./[程序名] --urls http://0.0.0.0:[端口号]
#nohup
nohup ./[程序名] --urls http://0.0.0.0:[端口号] &
#查看
tail -f nohup.out

consul

//集群模式
consul agent -server -ui \
-bootstrap-expect=3 \
-data-dir=/tmp/consul \
-node=consul-1 \
-client=0.0.0.0 \
-bind=192.168.80.100 \
-datacenter=dc1

consul agent -server -ui \
-bootstrap-expect=3 \
-data-dir=/tmp/consul \
-node=consul-2 \
-client=0.0.0.0 \
-bind=192.168.80.101 \
-datacenter=dc1 \
-join 192.168.80.100


//单机开发模式
consul agent -dev -ui -datacenter=dc1

//单机server 模式
consul agent -server -ui \
-bootstrap \
-data-dir=/usr/local/consul/data \
-node=consul-server \
-client=0.0.0.0 \
-bind=127.0.0.1 \
-datacenter=dc1

//client模式
# 生产级配置示例(consul-client.hcl)
server = false
datacenter = "dc1"
node_name = "client-prod-01"
bind_addr = "192.168.148.131"  # 指定内网 IP
client_addr = "127.0.0.1"    # 限制本地访问
data_dir = "/usr/local/consul/clientdata"  # 持久化数据目录

retry_join = [
  "192.168.148.131",
  "192.168.148.130"
]

# 健康检查配置
check {
  id = "health-check"
  name = "Client Health Status"
  interval = "10s"
  timeout = "1s"
  http = "http://localhost:8500/v1/agent/self"
}




//查看成员
consul members

//检查 Raft 集群状态
consul operator raft list-peers

# 查看节点健康状态
consul catalog nodes -detailed

# 检查是否有警告或错误
consul monitor

参数详解

参数
作用
agent
启动 Consul 代理(核心进程)
-server
服务器模式运行(参与 Raft 协议,存储集群状态)
-ui
启用Web 管理界面(默认端口 8500)
-bootstrap-expect=3
期望集群中有3 个服务器节点,自动完成集群初始化(需至少 3 节点)
-data-dir=/tmp/consul
指定数据存储目录(注意/tmp数据会随重启丢失,生产环境需持久化)
-node=consul-1
当前节点名称(需唯一,如consul-1
-client=0.0.0.0
客户端 API 和 UI 监听地址(0.0.0.0表示允许所有外部访问)
-bind=192.168.80.100
节点间通信绑定的 IP 地址(局域网内可达地址)
-datacenter=dc1
定义数据中心名称(多数据中心部署时需统一)