云起工作室 15711107967
命令

宿主机安全性规则修改 chcon -Rt svirt_sandbox_file_t /home/nginx 镜像库地址 hub.docker.com docker pull 镜像:版本号 -> 下载镜像,如果没有版本号就是最新的版本 docker run 镜像 -> 创建容器 docker ps -> 查看启动的(docker run起来的)容器 docker stop 容器id -> 停止容器 并没有删除 docker ps -a -> 查看所有容器,包括运行的和停止的容器 docker ps -a -q -> 查看所有容器的id docker start 容器id -i -> 重新启动停止的容器,并打开交互 没有i 会没有之前的交互 docker rm 容器id -> 删除stop的容器, 不能删除正在运行的容器 docker rm $(docker ps -a -q) -> 删除所有stop的容器,不能删除正在运行的容器 docker rm -f 容器id -> 强制删除容器,无论是否运行 docker rmi 镜像id【或镜像名:标签名】 -> 删除镜像,无法删除生成容器的镜像,徐先删除对应的容器才能删除 docker run -it -> 交互 docker run -d -> 后台运行 docker run --rm -> 容器停止时删除容器 --name=name -> 指定名称 --restart=always 容器停止后自动重启 -e 环境的意思 -p 宿主机端口:容器端口 -> 将宿主机端口映射到容器端口 docker search word -> 搜索word docker exec -it 容器id 容器命令 -> 进入正在运行的容器 访问宿主机mysql docker run --net=host 容器 访问其他镜像 docker run --link=mysql_host:mysql -d your_docker_image mysql_host是宿主机上MySQL服务的Docker容器名称(如果你使用Docker运行MySQL),mysql是链接时容器内部的别名 实例: docker run -d --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.5 ---> MYSQL_ROOT_PASSWORD=123456 初始化mysql密码为123456 docker cp 源文件 地址文件 docker cp 容器id:/data/test.txt /data/test.txt 制作镜像 docker commit -m "提示信息" 容器id 镜像名称:版本号 docker commit -m "更新vim" de04ca917sfad my_ubuntu:1.0 使镜像程序访问宿主机在创建容器时 加上 --net=host 如: docker run -d --net=host --name=51forhome -p 8080:8080 51forhome:1.0 清空docker 缓存 docker system prune 推送到自己docker账号下 先登录 docker login 输入账号密码 推送 docker tag 本地镜像:标签 账号/镜像:标签 ->也就是创建的一个带账号信息的本地镜像 docker push 账号/镜像:标签 ->推送 查看docker详情 docker inspect 容器id docker port 容器 //查看容器端口 docker logs -f 容器id //查看容器日志 docker top 容器id //查看容器内进程信息将docker镜像打包到本地docker save project> project.tardocker load -i project.tar

微信开发-关注登录

1、二维码页面,请求接口获取 logincode 和二维码地址页面保存 logincode ,此logincode将会成为登录标识符2 、二维码接口 生成logincode,获取二维码地址返回给二维码页面3、微信扫描二维码,微信会向服务器以post方式发送消息 ,此接口通过微信公众平台启用服务器配置的接口 配置接口获取数据中有 FromUserName 这就是openid;EventKey 是带qrscene_前缀的loginCode通过loginCode := strings.TrimPrefix(msg.EventKey, "qrscene_") 获取loginCode通过openid,查询、创建用户,将loginCode以登录标识保存起来const ( token = "tianwanggaidihu" // 替换为自己在微信公众号设置的 Token,配置服务器时自定义填写的)type AccessTokenResponse struct { AccessToken string `json:"access_token"` ExpiresIn int `json:"expires_in"` ErrCode int `json:"errcode"` ErrMsg string `json:"errmsg"`}type QRCodeTicketResponse struct { Ticket string `json:"ticket"` ExpireSeconds int `json:"expire_seconds"` URL string `json:"url"` ErrCode int `json:"errcode"` ErrMsg string `json:"errmsg"`}// 添加消息结构体 推送的消息结构体type TextMessage struct { ToUser string `json:"touser"` MsgType string `json:"msgtype"` Text struct { Content string `json:"content"` } `json:"text"`}接口1、//get请求,用于配置时的验证,验证通过后就没用了func (ct *WeixinController) Fromweixinplat(ctx *gin.Context) { signature := ctx.Query("signature") timestamp := ctx.Query("timestamp") nonce := ctx.Query("nonce") echostr := ctx.Query("echostr") // 1. 将 token、timestamp、nonce 三个参数进行字典序排序 strs := sort.StringSlice{token, timestamp, nonce} sort.Strings(strs) // 2. 将三个参数字符串拼接成一个字符串进行 sha1 加密 str := strings.Join(strs, "") h := sha1.New() h.Write([]byte(str)) sha1Sum := fmt.Sprintf("%x", h.Sum(nil)) // 3. 将加密后的字符串与 signature 进行对比 return sha1Sum == signature if sha1Sum == signature { ctx.String(200, echostr) } else { ctx.String(403, "验证失败") } return}接口22.1、// 展现二维码的页面请求的接口:生成登录二维码 func (ct *WeixinController) GenerateLoginQRCode(ctx *gin.Context) { backData := Tools.BackData{} // 生成唯一登录码 loginCode := fmt.Sprintf("%d", time.Now().UnixNano()) // 获取access_token accessToken, err := ct.getAccessToken() if err != nil { ctx.JSON(500, gin.H{"error": "获取access_token失败"}) return } // 获取二维码ticket ticket, err := ct.getQRCodeTicket(accessToken, loginCode) if err != nil { ctx.JSON(500, gin.H{"error": "获取二维码ticket失败"}) return } rdb := Tools.GetRedis() // 存储登录码(设置5分钟过期) err = rdb.Set("login:"+loginCode, "pending", 5*time.Minute).Err() if err != nil { ctx.JSON(500, gin.H{"error": "生成登录码失败"}) return } // 返回登录码和二维码链接 // 注意:这里需要替换为你的公众号二维码链接 qrcodeURL := fmt.Sprintf("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s&scene=%s", ticket, loginCode) ctx.JSON(200, gin.H{ "code": loginCode, //页面存储的 "qrcode_url": qrcodeURL, //将qrcodeRRL 放到img src属性 }) }2.2、// 获取二维码ticketfunc (ct *WeixinController) getQRCodeTicket(accessToken, sceneStr string) (string, error) { url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s", accessToken) // 构造请求数据 data := map[string]interface{}{ "expire_seconds": 604800, // 7天有效期 "action_name": "QR_STR_SCENE", "action_info": map[string]interface{}{ "scene": map[string]string{ "scene_str": sceneStr, }, }, } jsonData, err := json.Marshal(data) if err != nil { return "", err } resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData)) if err != nil { return "", err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err } var ticketResp QRCodeTicketResponse if err := json.Unmarshal(body, &ticketResp); err != nil { return "", err } if ticketResp.ErrCode != 0 { return "", fmt.Errorf("获取二维码ticket失败:%s", ticketResp.ErrMsg) } return ticketResp.Ticket, nil}接口3 // post 处理微信消息接口 微信扫码后,服务器被微信调用的接口// 微信消息结构体 type WxMessage struct { XMLName xml.Name `xml:"xml"` ToUserName string `xml:"ToUserName"` FromUserName string `xml:"FromUserName"` //卧槽这个就是openid CreateTime int64 `xml:"CreateTime"` MsgType string `xml:"MsgType"` Event string `xml:"Event"` //值有subscribe SCAN 暂时不知道啥意思,不过不影响逻辑 EventKey string `xml:"EventKey"`}3.1、func (ct *WeixinController) HandleWxMessage(ctx *gin.Context) { body, err := ioutil.ReadAll(ctx.Request.Body) if err != nil { ctx.String(400, "读取消息失败") return } var msg WxMessage if err := xml.Unmarshal(body, &msg); err != nil { ctx.String(400, "解析消息失败") return } returnmsg := "登录失败" // 处理关注事件 if msg.MsgType == "event" && msg.FromUserName != "" { // 检查是否包含场景值(二维码参数) if msg.EventKey != "" { loginCode := strings.TrimPrefix(msg.EventKey, "qrscene_") openid := msg.FromUserName /** * 1、查询三方库里是否有该用户, 如果有,直接保存登录状态 如果没有,创建账号,保存三方库 ,再保存登录状态 将loginCode作为登录标识符保存起来,便于,前端页面通过保存的loginCode 获取登录信息 */ //给扫码用户发送信息 ct.sendMessage(openid, "登录成功") } } ctx.String(200, "success")}3.2、// 向用户推送消息func (ct *WeixinController) sendMessage(openID, content string) error { // 获取access_token accessToken, err := ct.getAccessToken() if err != nil { return err } message := TextMessage{ ToUser: openID, MsgType: "text", } message.Text.Content = content jsonData, err := json.Marshal(message) if err != nil { return err } url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s", accessToken) resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData)) if err != nil { return err } defer resp.Body.Close() return nil}3.3、// 获取访问令牌func (ct *WeixinController) getAccessToken() (string, error) { appID := "微信公众号appid" appSecret := "微信公众号app_secret" url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appID, appSecret) resp, err := http.Get(url) if err != nil { return "", err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err } var tokenResp AccessTokenResponse if err := json.Unmarshal(body, &tokenResp); err != nil { return "", err } if tokenResp.ErrCode != 0 { return "", fmt.Errorf("获取access_token失败:%s", tokenResp.ErrMsg) } return tokenResp.AccessToken, nil}


04_go-redis、session、cookie

一、redisgo get -u github.com/go-redis/redisvar redisdb *redis.Clientredisdb = redis.New(&redis.Options{ Addr:"127.0.0.1:6379", Password:"", DB:0,})redisdb.Set("test:name","value",time.Minute * 10) 十分钟失效 过期时间设置为0 是永不过期val,err:=redisdb.Get("key").Result()println(val) 二、sessiongo get github.com/gin-contrib/sessionsimport "github.com/gin-contrib/sessions"2.1、基于redis使用在main.go 中import( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/redis")engine:=gin.Default()strore,_:=redis.NewStore(10,"tpc","localhost:6379","",[]byte("secret"))engine.Use(sessions.Sessions("mysession",store))engine.GET("/path",func(context *gin.Context){ session:=sessions.Default(context) //保存 num:=16 session.Set("count",num) session.Save() //读取 num=session.Get("count")})json.Marshal(member) //将 member 对象序列化session.Set("user_id",json.Marshal(member))反序列化var member Membersess:=session.Get("user_id")json.Unmarshal(sess.([]byte),&member)三、上传图片file,err:=context.FormFile("file")filename:="./uploadPath/"+strcov.Format(time.Now().Unix(),10)+file.Filenameerr:=context.SaveUploadFile(file,filename)四、cookie //设置cookiecontext.SetCookie("cookie_key","val",10*60,"localhost",true,true)获取cookiecookie,err:=context.Request.Cookie("cookie_key")const CookieName="cookie_user"const CookieTiimeLen=10*60func CookieAuth(context *gin.Context) (*http.Cookie,error){ cookie,err:=context.Request.Cookie(CookieName) if err==nil{ context.SetCookie(cookie.Name,cookie.Value,cookie.MaxAge,cookie.Path,cookie.Domain,cookie.Secure,cookie.HttpOnly) return cookie,nil }else{ return nil,err }}

微信支付

1、注意事项1.1、jsapi 支付时加载的是"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"而不是"github.com/wechatpay-apiv3/wechatpay-go/services/partnerpayments/jsapi"1.2、支付回调问题在 ParseNotifyRequest 之前不可使用 Request.Body原文链接wechatpay-go/FAQ.md at v0.2.20 · wechatpay-apiv3/wechatpay-go (github.com)2、JSAPI 接口3、支付回调func (ct *OrderController) WxPayBack(ctx *gin.Context) { dir, err := os.Getwd() if err == nil { fmt.Println("当前目录:", dir) } mchID := "商户号" mchCertificateSerialNumber := "API证书序列号" mchAPIV3Key := "APIV3密钥" // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名 mchPrivateKey, mchPrivateKeyErr := utils.LoadPrivateKeyWithPath(dir + "/filepath/apiclient_key.pem") if mchPrivateKeyErr != nil { println( mchPrivateKeyErr.Error()) return } // 1. 使用 `RegisterDownloaderWithPrivateKey` 注册下载器 errA := downloader.MgrInstance().RegisterDownloaderWithPrivateKey(ctx, mchPrivateKey, mchCertificateSerialNumber, mchID, mchAPIV3Key) if errA != nil { println( errA.Error()) return } // 2. 获取商户号对应的微信支付平台证书访问器 certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchID) // 3. 使用证书访问器初始化 `notify.Handler` handler := notify.NewNotifyHandler(mchAPIV3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor)) transaction := new(payments.Transaction) request := ctx.Request _, handlErr := handler.ParseNotifyRequest(ctx, request, &transaction) // 如果验签未通过,或者解密失败 if handlErr != nil { fmt.Println( err) return } // 处理通知内容 /** transaction 结构 Transaction{ Amount:TransactionAmount{ Currency:CNY, PayerCurrency:CNY, PayerTotal:1, //单位是分 Total:1 }, Appid:wxb*****e399, Attach:, BankType:OTHERS, Mchid:商户号, OutTradeNo:2025A*****F012, Payer:TransactionPayer{ Openid:ohkRO********aSHxc }, PromotionDetail:[], SuccessTime:2025-02-16T15:25:58+08:00, TradeState:SUCCESS, TradeStateDesc:支付成功, TradeType:JSAPI, TransactionId:4200**********5263 } */ if *transaction.TradeState == "SUCCESS" { }}

阿里云安装docker

在安装最新版本的 Docker 之前,建议先卸载旧版本的 Docker 及其相关组件,以避免潜在的安装冲突和兼容性问题。执行以下命令来卸载旧版本的 Docker 和相关的软件包并删除 Docker 相关源:sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine安装 Docker 社区版 1、添加 Docker 软件包源 sudo wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.cloud.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's|https://mirrors.aliyun.com|http://mirrors.cloud.aliyuncs.com|g' /etc/yum.repos.d/docker-ce.repo 2、安装 Docker 社区版及相关组件 sudo yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 3、启动 Docker 并设置开机自启 sudo systemctl start docker sudo systemctl enable docker 4、验证 Docker 是否安装成功 通过查看 Docker 版本命令,验证 Docker 是否安装成功 sudo docker -v 如果显示 Docker 的版本信息,如 Docker version 20.10.12, build e91ed57,则表示 Docker 已安装成功。安装 Docker Compose 插件如果您需要使用 Docker Compose,可以通过以下命令安装 Compose 插件:sudo yum -y install docker-compose-plugin验证 Compose 插件是否安装成功:sudo docker compose version如果显示 Compose 的版本信息,如 Docker Compose version v2.3.3,则表示 Compose 插件已安装成功。配置镜像加速器为了提高 Docker 镜像的下载速度,可以配置镜像加速器。以下是 CentOS 7 的配置方法:1、复制默认配置文件sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service2、编辑配置文件将加速器地址添加到配置文件的启动命令中:sudo sed -i "s|ExecStart=/usr/bin/dockerd|ExecStart=/usr/bin/dockerd --registry-mirror=<your accelerate address>|g" /etc/systemd/system/docker.service3、重新加载 systemd 配置并重启 Dockersudo systemctl daemon-reloadsudo systemctl restart docker完成以上步骤后,Docker 将使用指定的镜像加速器,从而加快镜像的下载速度。注意:请将 <your accelerate address> 替换为您实际使用的镜像加速器地址。


docker

镜像 -> 容器 docker run -it ubuntu bash docker iamges 查看本地所有镜像 docker run 镜像名字 创建一个容器 本地没有容器,就去远端拉取 docker pull 镜像名字:版本号 下载一个镜像 docker pull 镜像名字 下载最新版本 docker ps 查看正在运行的容器 docker stop 容器id 停止容器运行 docker ps -a 查看所有的容器包括没有运行的 docker start 【-i】 容器id 打开容器 -i是有交互 -t是打开新终端 docker rm 容器id 移除容器 不能移除正在运行的容器 docker rm -f 容器id 强行移除容器 docker ps -a -q 列出所有容器id docker rm $(docker ps -a -q) 删除所有容器 docker rmi 镜像id 移除镜像 如果有生成的容器,不可删除 删除镜像 docker search 镜像名称 从官方库里搜素镜像 docker run --rm -p 8080:80 nginx --rm 是当容器停止时立刻删除容器 docker exec -it 容器id bash 进入执行已开启的容器并执行命令 镜像库 hub.docker.com 下载运行mysql 并初始化密码 docker run -d --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.5 -d 是后台运行的意思 -p 是端口映射 物理机端口:容器端口 -e 给容器设置环境变量 将参数传递给容器 制作镜像 docker cp source.list 容器id:/home 将本地source.list 文件复制到容器 home目录下 docker commit -m "备注说明" 容器id 镜像名称:标签 查看镜像 docker images 将镜像推送到仓库 hub.docker.com 注册用户 登录 docker login docker tag 本地镜像:标签 账号/镜像名称:标签 在本地复制成一份含账号的镜像 docker push 账号/镜像名称:标签 制作Dockerfile dockerfile1、编辑docker FROM nginx:1.0 # 根据nginx:1.0镜像 构建创建容器 COPY source.list /etc/apt/source.list # 将上下文路径中的source.list复制到容器指定地址 WORKDIR /home 指定默认目录 RUN echo '<h1>hello word</h1>'> /usr/share/nginx/html/index.html # RUN 命令1 && 命令2 如果命令1成功才再运行命令2 尽量少用RUN pip freeze > requirement.txt pip install -r requirement.txt -i http://加速地址 从加速地址里安装requirement.txt 里的包 Dockerfile2、 FROM 镜像:版本 ADD requirement.txt /home WORKDIR /home RUN pip3 install -r requirement.txt -i https://pypi.tuna.tsinghua.edu.cn/simple Dockerfile3、 FROM 镜像:版本 WORKDIR /home #指定工作目录 COPY main.py . 将本地的main.py 复制到工作目录 EXPOSE 8899 #暴露端口 CMD ["python3","main.py"] 默认执行的程序 python3 main.py 综合dockerfile 示例 FROM ubuntu:16.04 COPY source.list /etc/apt/source.list WORKDIR /home COPY requirements.txt . RUN apt-get update && apt-get install vim -y \ && apt-get install python3 -y \ && apt-get install python3-pip -y \ && pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ COPY main.py . EXPOSE 8080 CMD ["python3","main.py"] VOLUME 挂载 构建nginx Dockerfile FROM centos #维护者信息 MAINTAINER xxxx ENV PATH /usr/local/nginx/sbin:$PATH ADD nginx-1.8.0.tar.gz /usr/local/ ADD epel-release-latest-7.noarch.rpm /usr/local/ RUN rpm -ivh /usr/local/epel-release-lastest-7.0noarch.rpm RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all RUN useradd -s /sbin/nologin -M www WORKDIR /usr/local/nginx-1.8.0 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --width-pcre && make && make install RUN echo "daemon off;" >> /etc/nginx.conf EXPOSE 80 CMD ["nginx"] ADD 等同于COPY 构建新镜像在 dockerfile 所在的文件夹下执行以下命令,就会根据dockerfile构建镜像 docker build -t 新镜像名称:版本 上下文路径 -f Dockerfile_1.0 # -f是指定执行的dockerfile,如果没有-f 默认执行改目录下的Dockerfile 如 docker build -t my_nginx:1.0 . 查看镜像 docker images docker inspect 镜像名字:版本 检查镜像 nginx //将容器内的配置文件复制到宿主机 docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d docker cp nginx:/usr/share/nginx/html /home/nginx/ 启动并挂载 docker run -p 9002:80 --name mynginx \ -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /home/nginx/conf/conf.d:/etc/nginx/conf.d \ -v /home/nginx/thml:/usr/share/nginx/html \ -d nginx:latest

git

工作区、暂存区、本地仓库 工作区git add 到暂存区 gitcommit 本地仓库 1、配置用户名和邮箱 git config --global user.name "xxx" git config --global user.email xxx@163.com 存储 git config --global credential.helper store //查看配置 git config --global --list 新建版本库 git init //本地当前目录下创建仓库 git init wenjijia // 再wenjianjia下创建仓库 git clone https://xxx //从远端克隆一个仓库 git status 查看仓库状态 git log 查看提交记录 git log --oneline 只显示提交的id和提交提示信息 git ls-files 查看暂存区的内容 HEAD 指向最新版本的id HEAD~ 或HEAD^ 指向上一个版本 HEAD~2 表示head 之前的第二个版本 git reset --soft 工作区和暂存区的内容还存在 重新提交 直接commit就行 git reset --hard 工作区和暂存区的内容都会被清空 需要重新创建文件,再git add …… git reset --mixed 默认为mixed 重新提交需要 git add 再次添加 git reset --head HEAD^ 回滚到上一个版本 git reflog 查看历史操作记录版本号 git reset -head 版本号 就可以回退到指定版本了 git diff 查看差异 git diff 默认比较的是工作区和暂存区的差异 git diff HEAD 比较工作区和版本库之间的差异 git diff --cached 比较暂存区和版本库的差异 git diff 版本1id 版本2id 查看两个版本之间的内容 git diff HEAD~ HEAD 比较上一版本与当前版本的区别 git diff HEAD~ HEAD filename 只查看两个版本中 filename 内容 工作区删除文件 file1.txt后需要 git add file1.txt git commit -m "提交提示" git rm filename 删除文件后 不用再执行git add 但需要 commit 一下 git rm --cached filename 只删除暂存区的filename .gitignore git忽略文件 filename 忽略filename文件 *.log 或略所有 .log 结尾的文件 如果已有 xxx.log 则 忽略对xxx.log无效 temp/ 忽略temp 文件夹 !lib.log 不忽略 lib.log /fileme 之忽略 当前目录下 fileme文件 xxx/ 忽略任何目录下的xxx文件夹 doc/*.txt 忽略 doc/下的 .txt 文件 不忽略 doc/a/ 下的txt 文件 doc/*/*.pdf 忽略 doc下及多级递增下的所有 pdf文件 2、远程仓库github 在根目录下 cd .ssh ssh-keygen -t rsa -b 4096 第一次执行直接回车就行 会生成密钥文件 第二次执行为了不覆盖之前的 需要指定生成的密钥文件名 ssh-keygen -t rsa -b 4096 test.pub test.pub 是新密钥文件名 此时会生成两个文件 test 和test.pub,test是私钥文件,test.pub 是公钥文件 将test.pub 内容复制到github 如果指定的密钥文件名需要再创建 config 文件内容是 Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/test # test 是私钥名称 然后回到工作目录执行 把远程仓库克隆到本地 git clone git@github.com:.... 回车 输入 创建密钥时设置的密码 此时的 git commit -m '' 并不会影响远程仓库 2.2、gitee 生成密钥 ssh-keygen -t rsa -C 邮箱 将公钥复制到gitee 测试是否配置成功 ssh -T git@gitee.com git push 把本地仓推送给远程仓库 git remote add origin git@github.com.... 关联远程仓库 git remote -v 查看当前仓库对应的远程仓库的别名和地址 git branch -M main 指定分支的名称为main ,默认分支就是main 所以可以忽略 git push -u origin main 把本地的main分支和远程的orgin 仓库的main 分支关联起来等同于git push -u origin main:main git pull orgin main:main 【orgin main:main】可以省略 ,从远端拉取内容到本地仓库 gitlib 可以搭建私有托管平台 git remote add gitlab git@... 关联gitlib仓库 git push gitlib main 推送到gitlib 仓库 3、分支 git branch 查看当前仓库中 所有的分支 git branch 分支名 创建新分支 git checkout 分支名 切换到分支 有风向 git switch 分支名称 切换分支2.23 版本之后的命令 git merge dev 是将dev分支合并到当前分支中 git merge --abort 合并过程中可以终止合并 git log --graph --oneline 查看分支合并情况图 git branch -d dev 删除 已经被合并的 dev 分支,如果没有被合并,不能被删除 git branch -D dev 不管dev是否被合并都会被删除 git commit -a -m “” 一个命令完成添加暂存和提交两个动作 git checkout -b dev 提交的id 回复dev 分支 git log --online --graph --decorate --all 查看图形化提交记录 此命令太长,缩短如下 alias graph="git log --oneline --graph --decorate --all" graph 就可以查看图形化提交记录了 git switch dev git rebase main 将当前dev分支编辑到目标main 分支上 git 解决冲突一、 git --hard FETCH_HEAD git pull 上面的解决方法非常非常的霸道,是可以解决这个错误,但是它会回到初始的节点,假如我有修改本地代码但是没有提交,那么使用reset初始,可能会丢失这些修改的代码。 git 解决冲突二、 git add . git commit -m '提交本地代码并且获取最新代码' //注释:获取源dev分支最新代码 git pull origin dev 合并两个库时:fatal: refusing to merge unrelated histories git pull origin master --allow-unrelated-histories


源码安装lnmp

一、nginx安装查看yum源yum repolist all1、配置阿里云yum源 # 1. 配置Base源 能够下载CentOS自带的软件 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 2. 配置Epel源 :下载第三方工具 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum cean all yum makecache2、案原告依赖 yum install pcre pcre-devel openssl openssl-devel gcc -y3、下载nginx源代码包 nginx 官网查找版本 https://nginx/org/download3.1、#下载安装包 wget http://nginx.org/download/nginx-1.18.0.tar.gz #解压 tar -zxvf nginx-1.18.0.tar.gz cd nginx-1.18.0 3.2、编译 3.2.1、可以先创建nginx用户 也可以不创建 useradd nginx -u 1111【指定id】 -s /sbin/nologin -M 指定用户的编译 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --width=http_ssl_module make && make install 3.2.2、未指定用户编译 ./configure --prefix=/usr/local/nginx #配置时更换为实际希望安装路径即可 make && make install 3.3、#安装完后验证是否安装成功 cd /usr/local/nginx/sbin ./nginx -t #出现如下内容为安装成功 nginx: the configuration file /usr/local/nginx//conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx//conf/nginx.conf test is successful 4、配置nginx环境变量查看环境变量echo $PATH将nginx的bin目录配置到环境变量vim /etc/profile 在文件末尾添加PATH="/usr/local/nginx/sbin:$PATH"使生效source /etc/profile5、启动nginxnginx二、mysql安装1、安装方式有yum 安装,不利于拓展二进制安装 解压可直接使用,无需安装源代码编译安装安装过程复杂2、二进制安装解压后2.1、卸载mariaadb 相关依赖rpm -e --nodeps mariadb-libs2.2、查看msyql用户是否存在grep "mysql" /etc/passwd如果不存在添加mysql用户useradd -s /sbin/nologin mysql2.3、vim /etc/my.cnf [mysqld] basedir = /usr/local/mysql/ datadir = /usr/local/mysql/data socket = /tmp/mysql.sock server_id = 1 port = 3306 log_error=/usr/local/mysql/data/mysql_err.log [mysql] socket = /tmp/mysql.sock2.4、检查mysql所需的依赖环境yum install libaio-devel -y2.5、创建数据文件夹mkdir /usr/local/mysql/data/chown -R mysql.mysql /usr/local/mysql/2.6、初始化mysql 数据库/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/2.7、配置mysql客户端编写mysql启动脚本 vim /etc/systemd/system/mysqld.service 写入 [Unit] Description=MySQL Community Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFTLE=50002.8、启动mysql systemctl start mysqld2.9、登录mysql 如果安装过mysql 可以用 yum remove mysql -y 卸载,不影响二进制安装的mysql vim /etc/profile 尾部写入 $PATH="$PATH:/etc/local/mysql/bin" 登录: mysql -uroot -p 初始没有密码 修改密码: mysqladmin -u root password '密码'

nginx

一、配置yum 源 cat > /etc/yum.repos.d/nginx.repo << 'EOF' [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key EOF 二、 yum clean all yum install -y nginx 三、命令 nginx # 默认是直接运行启动,前提是当前机器没运行nginx nginx -t # 检测nginx.conf语法 nginx -s reload # 重新读取nginx.conf nginx -s stop # 停止nginx kill -15 nginx #启动nginx,查看nginx状态,reload重新加载nginx配置, restart重启nginx服务,查看进程id号,关闭nginx systemctl start nginx systemctl status nginx systemctl reload nginx # worker变化,master不变 systemctl restart nginx # 整个nginx进程变化 systemctl stop nginx 四、yum 安装 nginx 所有默认路径 [root@iz0jlfqv8fyt7iuxoec4clz ~]# rpm -ql nginx /etc/logrotate.d/nginx /etc/nginx /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /etc/nginx/fastcgi_params /etc/nginx/mime.types /etc/nginx/modules /etc/nginx/nginx.conf # nginx的配置文件路径 /etc/nginx/scgi_params /etc/nginx/uwsgi_params /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /usr/lib64/nginx /usr/lib64/nginx/modules /usr/libexec/initscripts/legacy-actions/nginx /usr/libexec/initscripts/legacy-actions/nginx/check-reload /usr/libexec/initscripts/legacy-actions/nginx/upgrade /usr/sbin/nginx /usr/sbin/nginx-debug /usr/share/doc/nginx-1.24.0 /usr/share/doc/nginx-1.24.0/COPYRIGHT /usr/share/man/man8/nginx.8.gz /usr/share/nginx /usr/share/nginx/html /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html /var/cache/nginx /var/log/nginx 403错误 1、由于启动用户和nginx工作用户不一致所致 查看命令:ps aux | grep "nginx: worker process" | awk '{print $1}' 将conf/nginx.conf 中的 user nginx 改为 user root 切记防火墙 2、SELinux设置为开启状态(enabled)的原因 查看当前selinux的状态。 /usr/sbin/sestatus vi /etc/selinux/config 修改 #SELINUX=enforcing SELINUX=disabled




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6