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
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
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 环境变量中的目录 |
包括标准路径 如 |
输出结果 | 只返回第一个匹配项 | 返回所有匹配项(包括不同类型的文件) |
符号链接处理 | 显示符号链接的目标 | 不特别处理符号链接 |
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相配置
自己想办法
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';
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容器篇
#阿里云镜像安装
# 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 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}')
#位置
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篇章
#设置密码
config set requirepass [密码]
config rewrite
#启动客户端
redis-cli
#查看是否连接
info
#登录
auth [密码]
#设置键值
set [key] [value]
#查询值
get [key]
#查询键
keys *
#设置过期时间
expire [key] [过期秒数]
#查询过期时间
TTL [key]
#切换查询数据库
select [0-15]
#下载源代码
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