Mac
发表于|更新于|操作系统
|总字数:651|阅读时长:2分钟|浏览量:
快捷键
| 描述 | 命令 |
|---|---|
| 一个应用多个窗口 切换 | command+` |
| 录屏幕 | shift+command+5 |
| 截图 | shift+command+4 |
| 重装系统 | 先一直按住不要松手:Common+R, 再按开机键;非苹果键盘,按住微软键+R |
| 上一级目录 | command+↑ |
网站链接
iphone强制重启

浏览器返回手势

放歌有噪音
通过【活动监视器】程序终止【coreaudiod】进程:
- 聚焦搜索】中输入【activity monitor】
- 在窗口右上角的搜索栏里输入【coreaudiod】
- 选择【coreaudiod】进程后,点击窗口上方工具栏中的【停止按钮】(按钮图标为X)
只有mac不能访问github
打开
https://github.com.ipaddress.com/打开
https://fastly.net.ipaddress.com/github.global.ssl.fastly.net#ipinfosudo vim /etc/hosts
1
2
3
4# 这个ip从第一步获取到的
140.82.112.4 github.com
# 这个ip从第二步获取到的
199.232.69.194 github.global.ssl.fastly.net刷新:
sudo killall -HUP mDNSResponder;say DNS cache has been flushed
启动台有问号的图标,点击没反应
1 | # 执行了之后,自己新建的文件夹会重置 |
Mac OS X 访问 Windows共享文件夹

在Mac中,点击 Finder菜单的“前往” > “前往服务器”。在弹出的连接服务器对话框中输入「smb://Windows主机的IP地址」,点击“连接”。

一般需要输入Windows对应用户的名称和密码,然后弹出如下窗口,选择对应的文件夹,点击“好”即可进行远程访问

只使用搜狗输入法
系统偏好设置 >> 键盘 >> 快捷键 >> 反选切换输入法的快捷键

网络踪迹
1 | traceroute ap-southeast-1.signin.aws.amazon.com |
安装mysql客户端
1 | brew install mysql-client |
Iterm2
Iterm2多窗口同时输入命令
只需要输入快捷键 ⌘(command) + ⇧(shift) + i
调出复制过的文本历史
快捷键:“shift+cmd+h”
按键回放
回放一段时间内的你敲过的所有字符。
快捷键:“cmd+alt+b”,如图会弹出一个进度条,按左右键就可以实现按键回放了。
CheatSheet
1 | brew install cheatsheet |
Navicat破解
mac安装 protobuf
1 | brew install protobuf |
视频格式转换
1 | brew install ffmpeg |
相关推荐
2026-05-26
macOS IDEA部署Docker到本机Docker Desktop
说明在macOS上使用IDEA开发项目时,可以直接通过IDEA的Run配置,把项目打包成Docker镜像,然后部署到本机的Docker Desktop里运行. 这个方式适合本地调试Docker环境,不用每次手动执行docker build和docker run. 前提条件 macOS已经安装并启动Docker Desktop IDEA已经安装Docker插件 项目里有可用的Dockerfile Java项目已经可以正常打包,比如Maven或Gradle打包成功 整体流程IDEA部署服务到本机Docker Desktop,本质上就是把手动命令配置到IDEA的Run里. 手动执行时一般是这样: 123mvn clean package -DskipTestsdocker build -t my-app:latest .docker run --name my-app -p 8080:8080 my-app:latest 配置到IDEA之后,点击Run就可以自动完成打包,构建镜像,启动容器. 配置Docker连接打开IDEA设置: Settings | Build, Execution, Deployment | Docker 点击+,选择Docker for Mac. 然后点击Test Connection,看到连接成功就说明IDEA已经能连接到本机Docker Desktop. 准备DockerfileSpring Boot项目可以在项目根目录准备一个简单的Dockerfile. 123456789FROM eclipse-temurin:17-jreWORKDIR /appCOPY target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"] 如果项目端口不是8080,这里的EXPOSE和后面的端口映射都要换成实际端口. 配置Run打开: Run | Edit Configurations 点击+,这里常用有两个选择: Docker | Dockerfile适合项目里有Dockerfile,需要IDEA先构建镜像,再运行容器的场景. 它会执行类似下面的流程: 12docker build -t my-app:latest .docker run --name my-app -p 8080:8080 my-app:latest 也就是说,代码改了以后,可以让IDEA重新build镜像,再启动容器. Spring Boot项目,前端项目,或者自己写了Dockerfile的项目,一般选这个. Docker | Docker Image适合镜像已经存在,只需要运行这个镜像的场景. 它会执行类似下面的流程: 1docker run --name mysql-test -p 3306:3306 mysql:8 比如运行mysql,redis,nginx,nacos这类现成镜像,或者已经手动build好了镜像,只想让IDEA帮忙启动容器,就选这个. 简单记: 12有Dockerfile,需要构建镜像 -> Docker | Dockerfile已有镜像,只想运行容器 -> Docker | Docker Image Dockerfile配置项如果选择Docker | Dockerfile,关键配置如下: 配置项 说明 Server 选择前面配置好的Docker for Mac Dockerfile 选择项目里的Dockerfile Context folder 一般选择项目根目录 Image tag 镜像名称,比如my-app:latest Container name 容器名称,比如my-app Run built image 勾选,表示构建完成后直接运行镜像 Bind ports 端口映射,比如本机8080映射容器8080 Environment variables 按需配置环境变量 常用配置可以这样填: 123456Server: Docker for MacDockerfile: ./DockerfileContext folder: 项目根目录Image tag: my-app:latestContainer name: my-appBind ports: 8080:8080 Before launch如果是Spring Boot项目,建议在Before launch里加打包任务. Maven项目可以配置: 1clean package -DskipTests Gradle项目可以配置: 1bootJar 这样点击Run时,IDEA会先打包项目,再根据Dockerfile构建镜像并启动容器. 启动后验证启动成功后,可以在Docker Desktop里看到容器. 也可以在终端检查: 1docker ps 如果服务端口是8080,可以访问: 1http://localhost:8080 如果需要看日志,可以在IDEA的Run窗口查看,也可以执行: 1docker logs -f my-app 常见问题端口被占用修改Bind ports里的本机端口. 比如容器内部还是8080,本机可以改成18080. 118080 -> 8080 容器需要访问宿主机服务macOS的Docker Desktop里,容器访问宿主机可以使用: 1host.docker.internal 比如容器里的程序要连接本机MySQL,可以把数据库地址配置成: 1host.docker.internal:3306 挂载本机目录失败检查Docker Desktop是否允许访问这个目录. 可以在Docker Desktop里查看: Settings | Resources | File Sharing 总结本地项目通过IDEA部署到macOS的Docker Desktop,核心就是两步: 在IDEA里配置Docker for Mac 在Run配置里选择Docker | Dockerfile 如果只是运行已有镜像,才选择Docker | Docker Image.

2022-11-19
Element-UI
表单验证简单版123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899<template> <div class="login"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>通用后台管理系统</span> </div> <el-form label-width="80px" :model="form" ref="form"> <el-form-item label="用户名" prop="username" :rules="[ {required:true,message:'请输入用户名',trigger:'blur'}, {min:6,max:12,message:'长度在6-12位字符',trigger:'blur'}, ]"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password" :rules="[ {required:true,message:'请输入密码',trigger:'blur'}, {min:6,max:12,message:'长度在6-12位字符',trigger:'blur'}, ]"> <el-input type="password" v-model="form.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="login('form')">登录</el-button> </el-form-item> </el-form> </el-card> </div></template><script>export default { data() { return { form: { username: "", password: "" } } }, methods:{ login(form){ this.$refs[form].validate((valid)=>{ if(valid){ console.log("验证通过") this.axios.post("http://localhost",this.form).then( res=>{ console.log(res) if(res.data.status === 200){ localStorage.setItem("username",res.data.username) this.$message({ message:res.data.message, type:'success' }) this.$router.push('/home') } } ) .catch(err=>{ console.error(err) }) }else { console.error("验证不通过") } }) } }}</script><style scoped lang="scss">.login { width: 100%; height: 100%; position: absolute; background: cadetblue; .box-card { width: 450px; margin: 200px auto; .el-button { width: 100%; } }}</style> 自定义校验123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119<template> <div class="login"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>通用后台管理系统</span> </div> <el-form label-width="80px" :model="form" :rules="rules" ref="form"> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="form.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="login('form')">登录</el-button> </el-form-item> </el-form> </el-card> </div></template><script>export default { data() { // 验证用户名 const validateName = (rule, value, callback) => { if (value === '') { callback(new Error("请输入用户名")) } else if (value === '123456') { console.log("11111111111") callback(new Error('换个用户名,猜到啦')) } else { callback() } } const validatePassword = (rule, value, callback) => { if (value === '') { callback(new Error("请输入密码")) } else if (!value === '123456') { callback(new Error('换个密码,猜到啦')) } else { callback() } } return { form: { username: "", password: "" }, rules: { username: [{validator: validateName, trigger: 'blur'}], password: [{validator: validatePassword, trigger: 'blur'}], } } }, methods: { login(form) { this.$refs[form].validate((valid) => { if (valid) { console.log("验证通过") // this.axios.post("http://localhost", this.form).then( // res => { // console.log(res) // if (res.data.status === 200) { // localStorage.setItem("username", res.data.username) // this.$message({ // message: res.data.message, // type: 'success' // }) // this.$router.push('/home') // } // } // ) // .catch(err => { // console.error(err) // }) } else { console.error("验证不通过") } }) } }}</script><style scoped lang="scss">.login { width: 100%; height: 100%; position: absolute; background: cadetblue; .box-card { width: 450px; margin: 200px auto; .el-button { width: 100%; } }}</style> 自定义校验封装新建一个vaildate.js 123456789101112131415161718192021// 用户名匹配export function nameRule(rule,value,callback){ if (value === '') { callback(new Error("请输入用户名")) } else if (value === '123456') { console.log("11111111111") callback(new Error('换个用户名,猜到啦')) } else { callback() }}export function passwordRule(rule,value,callback){ if (value === '') { callback(new Error("请输入密码")) } else if (value === '123456') { callback(new Error('换个密码,猜到啦')) } else { callback() }} 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697<template> <div class="login"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>通用后台管理系统</span> </div> <el-form label-width="80px" :model="form" :rules="rules" ref="form"> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="form.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="login('form')">登录</el-button> </el-form-item> </el-form> </el-card> </div></template><script>import {nameRule,passwordRule} from "@/utils/vaildate";export default { data() { return { form: { username: "", password: "" }, rules: { username: [{validator: nameRule, trigger: 'blur'}], password: [{validator: passwordRule, trigger: 'blur'}], } } }, methods: { login(form) { this.$refs[form].validate((valid) => { if (valid) { console.log("验证通过") // this.axios.post("http://localhost", this.form).then( // res => { // console.log(res) // if (res.data.status === 200) { // localStorage.setItem("username", res.data.username) // this.$message({ // message: res.data.message, // type: 'success' // }) // this.$router.push('/home') // } // } // ) // .catch(err => { // console.error(err) // }) } else { console.error("验证不通过") } }) } }}</script><style scoped lang="scss">.login { width: 100%; height: 100%; position: absolute; background: cadetblue; .box-card { width: 450px; margin: 200px auto; .el-button { width: 100%; } }}</style> 遍历路由渲染菜单栏src>common>menu.vue 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869<template> <div class="menu"> <el-aside width="200px"> <el-menu router default-active="2" class="el-menu-vertical-demo" background-color="cornflowerblue" text-color="#fff" active-text-color="#ffd04b"> <template v-for="(item,index) in menus"> <div> <el-submenu :index="index + '' " :key="index" v-if="!item.hidden"> <template slot="title"> <i :class="item.iconClass"></i> <span>{{ item.name }}</span> </template> <el-menu-item-group v-for="(child,index) in item.children" :key="index"> <el-menu-item :index="child.path"> <i :class="child.iconClass"></i> {{ child.name }} </el-menu-item> </el-menu-item-group> </el-submenu> </div> </template> </el-menu> </el-aside> </div></template><script>export default { data(){ return{ menus:[] } }, created() { console.log(this.$router.options.routes) this.menus=this.$router.options.routes }, methods: { }}</script><style scoped lang="scss">.menu{ .el-aside{ height: 100%; .el-menu{ height: 100%; .fa{ margin-right: 10px; } } .el-submenu .el-menu-item{ min-width: 0; } }}</style> route.js 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136import Vue from 'vue'import Router from 'vue-router'// import Home from '../components/Home.vue'Vue.use(Router)export default new Router({ routes:[ { path:'/', // 重定向 redirect:'/login', // 路由懒加载 hidden:true, component:()=>import('@/components/Login.vue') // 异步组件 }, { path:'/login', name:'Login', hidden:true, // 路由懒加载 component:()=>import('@/components/Login.vue') // 异步组件 }, { path:'/home', // component:Home hidden:true, // 路由懒加载 component:()=>import('@/components/Home.vue') // 异步组件 }, { path:'/home2', // component:Home hidden:true, // 路由懒加载 component:resolve =>require(['@/components/Home.vue'],resolve) // 异步组件 }, { path:'*', hidden:true, // 路由懒加载 component:()=>import('@/components/404.vue') }, { path:"/home", name:"学生管理", iconClass:'fa fa-user', // 默认重定向 redirect:'/home/student', component:()=>import('@/components/Home.vue'), children:[ { path:'/home/student', name:'学生列表', iconClass:"fa fa-list", component:()=>import("@/components/students/StudentList.vue") }, { path:'/home/info', name:'信息列表', iconClass:"fa fa-list", component:()=>import("@/components/students/InfoList.vue") }, { path:'/home/infos', name:'信息管理', iconClass:"fa fa-list-alt", component:()=>import("@/components/students/InfoLists.vue") }, { path:'/home/work', name:'作业列表', iconClass:"fa fa-list-ul", component:()=>import("@/components/students/WorkList.vue") }, { path:'/home/workd', name:'作业管理', iconClass:"fa fa-th-list", component:()=>import("@/components/students/WorkMent.vue") } ] }, { path:"/home", name:"数据分析", iconClass:'fa fa-bar-chart', component:()=>import('@/components/Home.vue'), children:[ { path:'/home/dataview', name:'数据概览', iconClass:"fa fa-list-alt", component:()=>import("@/components/dataAnalysis/DataView.vue") }, { path:'/home/mapview', name:'地图概览', iconClass:"fa fa-list-alt", component:()=>import("@/components/dataAnalysis/MapView.vue") }, { path:'/home/travel', name:'信息管理', iconClass:"fa fa-list-alt", component:()=>import("@/components/dataAnalysis/TraveMap.vue") }, { path:'/home/score', name:'分数地图', iconClass:"fa fa-list-alt", component:()=>import("@/components/dataAnalysis/ScoreMap.vue") } ] }, { path:"/users", name:"用户中心", iconClass:'fa fa-user', component:()=>import('@/components/Home.vue'), children:[ { path:'/users/user', name:'权限管理', iconClass:"fa fa-user", component:()=>import("@/components/users/User.vue") } ] }, ], mode:'history'}) 面包屑的使用不同的路由,面包屑显示的信息会自动变化bread.vue 12345678910111213141516171819202122<template> <div> <el-card> <el-breadcrumb separator="/"> <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item> <el-breadcrumb-item v-for="(item,index) in $route.matched" :key="index" >{{item.name}}</el-breadcrumb-item> </el-breadcrumb> </el-card> </div></template><script>export default {}</script><style scoped></style> home.vue 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859<template> <div class="home"> <Header></Header> <el-container class="content"> <Menu>menu</Menu> <el-container> <el-main> <Breadcrumb/> <div class="cont"> <router-view></router-view> </div> </el-main> <el-footer> <Footer></Footer> </el-footer> </el-container> </el-container> </div></template><script>import Header from "@/components/common/Header.vue";import Footer from "@/components/common/Footer.vue";import Menu from "@/components/common/Menu.vue";import Breadcrumb from '@/components/common/Breadcrumb.vue'export default { components: { Header, Footer, Breadcrumb, Menu, }, data() { return {} }}</script><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped lang="less">.home { width: 100%; height: 100%; .content{ position: absolute; width: 100%; top: 60px; bottom: 0; .cont{ margin: 20px 0; } }}</style> Card 卡片12345<!-- body-style的使用 --><el-card :body-style="{padding:'0px'}"> <div style="padding-top: 4px;display: flex"> </div</div></el-card> 级联选择器新版本props的使用级联选择器太高可以在全局样式里给.el-cascader-panel设置高度为200px:props=”{ expandTrigger: ‘hover’, value: ‘cat_id’, label: ‘cat_name’, children: ‘children’ }” 多选框 1234567891011121314151617<div> <el-checkbox-group v-model="checkboxGroup1"> <el-checkbox-button v-for="city in cities" :label="city" :key="city">{{city}}</el-checkbox-button> </el-checkbox-group></div>const cityOptions = ['上海', '北京', '广州', '深圳']; export default { data () { return { checkboxGroup1: ['上海'], checkboxGroup2: ['上海'], checkboxGroup3: ['上海'], checkboxGroup4: ['上海'], cities: cityOptions }; } Avatar 头像12<el-avatar shape="square" size="small" src="https://baidu.com/logo"></el-avatar> Table 表格el-table怎样隐藏某一列el-table-column上添加v-if="false" 1234567891011121314151617181920212223<el-table v-loading="loading" :data="bczglList" @selection-change="handleSelectionChange"> <el-table-column label="id" align="center" prop="id" v-if="false" /> <el-table-column label="班次组编号" align="center" prop="bczbh" /> <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['kqgl:bczgl:edit']" >修改</el-button> <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['kqgl:bczgl:remove']" >删除</el-button> </template> </el-table-column></el-table> 先记着Vue同一个dom元素绑定多个点击事件如何绑定 1<el-button @click="dialogVisible = false;clearTempData()">取 消</el-button> 模板获取值 123<template slot-scope="scope"> <el-tag type="warning" v-for="ids in scope.row.typeID.split(',')">{{getGameType(ids)}}</el-tag></template> Store 数据 1agentId: _this.$store.getters.name.agentId,

2022-11-19
Nginx
Docker安装 Nginx123456789101112131415# 简单的docker run --name nginx-test \ -p 8080:80 \ -d \ nginx# 正式的docker run -d \ -p 443:443 \ -p 80:80 \ --name nginx \ -v /home/nginx/www:/usr/share/nginx/html \ -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /home/nginx/logs:/var/log/nginx \ nginx Ubuntu安装Nginx1234567891011121314151617181920212223242526272829# Ubuntu安装依赖sudo apt-get install libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev# Ubuntu 如果还缺少依赖apt-get install build-essential# Centos安装依赖yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel# 进入到解压的文件cd ./nginx-1.16./configure --prefix=/url/local/nginx#或者./configure# 如果需要指定模块./configure --add-module=../nginx-rtmp-module#然后目录下就多了一个nginx文件make && make install#启动cd ../nginx/sbin./nginx# 配置文件目录所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下程序文件在/usr/sbin/nginx日志放在了/var/log/nginx中并已经在/etc/init.d/下创建了启动脚本nginx默认的虚拟主机的目录设置在了/var/www/nginx-default (有的版本 默认的虚拟主机的目录设置在了/var/www, 请参考/etc/nginx/sites-available里的配置) Nginx 常用命令12345678910111213141516171819202122# 启动nginxstart nginx# 或者nginx# 修改配置后重新加载生效nginx -s reload# 重新打开日志文件nginx -s reopen# 测试nginx配置文件是否正确nginx -t -c /path/to/nginx.conf# 快速停止nginxnginx -s stop# 完整有序的停止nginxnginx -s quit# 指定配置文件启动nginx -c /home/anthony/nginx.conf Nginx 配置模板123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133#user nobody;# 设置 <= cpu核数,一般设置成cpu*核数worker_processes 1;# 指定错误日志文件存放路径,错误日志级别可选项为【debug|info|notice|warn|error|crit】error_log logs/warn.log warn;# 指定pid存放路径 nginx启动后的进程IDpid logs/nginx.pid;# 工作模式及连接数上限#user nobody;# 设置 <= cpu核数worker_processes 1;# 指定错误日志文件存放路径,错误日志级别可选项为【debug|info|notice|warn|error|crit】# error_log logs/error.log error;# 指定pid存放路径 nginx启动后的进程ID# pid logs/nginx.pid;# 工作模式及连接数上限events { # 使用网络I/O模型,Linux系统推荐使用epoll模型,FreeBSD系统推荐使用kqueue;window下不指定 # user epoll; # 允许的最大连接数 worker_connections 1024;}# 设定http服务器,利用他的反向代理功能提供负载均衡支持http { # 设定mime类型 include mime.types; default_type application/octet-stream; # 设定日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; client_header_buffer_size 1k; large_client_header_buffers 4 4k; # access_log logs/info.log main; # # 设定access log send_timeout 3m; sendfile on; tcp_nopush on; tcp_nodelay on; # 这个参数表示http连接超时时间,默认是65s。要是上传文件比较大,在规定时间内没有上传完成,就会自动断开连接!所以适当调大这个时间。 keepalive_timeout 0; keepalive_timeout 5000; # 开启gzip模块 gzip on; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json; output_buffers 1 32k; postpone_output 1460; server_names_hash_bucket_size 128; client_header_timeout 3m; #调大点 client_body_timeout 3m; #调大点 client_max_body_size 200m; #主要是这个参数,限制了上传文件大大小 #client_body_buffer_size 1024; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; gzip_http_version 1.1; gzip_comp_level 2; gzip_vary on; #设定虚拟主机 server { listen 80; server_name ap.mmzcg.com; # 设置url编码格式,解决参数中文乱码问题 charset UTF-8; # 设定本虚拟主机的访问日志 # access_log logs/host.access.log main; # 对 "/" 启用负载均衡 location / { # 设定代理访问地址 proxy_pass http://127.0.0.1:30000/; # 配置SSL证书 # ssl_certificate /etc/nginx/conf.d/ssl/STAR.huihuang200.com.crt; # ssl_certificate_key /etc/nginx/conf.d/ssl/STAR.huihuang200.com.key; # ssl_session_timeout 5m; # ssl_session_cache shared:SSL:10m; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3; # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; # ssl_prefer_server_ciphers on; # ssl_verify_client off; # 解决ajax跨域问题 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; # 保留用户真实信息 proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 允许客户端请求的最大单个文件字节数 client_max_body_size 100m; # 缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户 client_body_buffer_size 1280k; # nginx跟后端服务器连接超时时间,发起握手等候响应超时时间(代理连接超时) proxy_connect_timeout 5; # 连接成功后 等待后端服务器响应时间 其实已进入后端的排队之中等候处理 proxy_read_timeout 60; # 代理请求缓存区 这个缓存区间会保存用户的头信息一共Nginx进行规则处理 一般只要能保存下头信息即可 proxy_send_timeout 30; # 同上 告诉Nginx保存单个用的几个Buffer最大用多大空间 proxy_buffer_size 256k; proxy_buffers 4 256k; # 如果系统很忙的时候可以申请国内各大的proxy_buffers 官方推荐 *2 proxy_busy_buffers_size 256k; # proxy 缓存临时文件的大小 proxy_temp_file_write_size 256k; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; proxy_max_temp_file_size 128m; } }} Nginx日志管理123456789101112131415161718#access_log logs/access.log main;# nginx的默认配置,如果在安装的nginx里没有看到这个,也没有关系#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';server { listen 80; location / { root my; index index.html } #配置日志, main 就是log_format 后面的名字 # 该server的访问日志的文件是logs/access.log,使用的是main格式 access_log logs/access.log main;} 推荐的配置 1234log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host ' '$status $request_length $body_bytes_sent "$http_referer" ' '"$http_user_agent" $request_time'; remote_addr : 客户端地址 remote_user : 客户端用户名 time_local : 服务器时间 request : 请求内容,包括方法名,地址,和http协议 http_host : 用户请求是使用的http地址 status : 返回的http 状态码 request_length : 请求大小 body_bytes_sent : 返回的大小 http_referer : 来源页 http_user_agent : 客户端名称 request_time : 整体请求延时 日志书写规则 一行要用单引号包起来,一行一个,换行也不需要什么连接的符号 location匹配= 精准匹配不写 一般匹配~ 正则匹配location proxy_pass 后面的url 加与不加/的区别 server_name匹配通配符匹配12345678910111213server { listen 80; server_name *.example.org; ...`}server { listen 80; server_name mail.*; ...} 通配符格式中的*号只能在域名的开头或结尾,并且*号两侧只能是.这些无效: www.*.example.org w*.example.org *号可以匹配多个域名部分,*.example.org可以匹配到: www.example.org www.sub.example.org .example.org是比较特殊的通配符格式, 可以同时匹配 example.org *.example.org。 正则匹配⁉️ 不适用我自己 精确匹配12345server { listen 80; server_name example.org www.example.org; ...} 特殊匹配格式 server_name ""; 匹配Host请求头不存在的情况。 server_name "-"; 无任何意义。 server_name "*"; 它被错误地解释为万能的名称。 它从不用作通用或通配符服务器名称。相反,它提供了server_name_in_redirect指令现在提供的功能。 现在不建议使用特殊名称“ *”,而应使用server_name_in_redirect指令。 匹配顺序 精确的名字 以*号开头的最长通配符名称,例如 *.example.org 以号结尾的最长通配符名称,例如 mail. 第一个匹配的正则表达式(在配置文件中出现的顺序) 优化 尽量使用精确匹配; 当定义大量server_name时或特别长的server_name时,需要在http级别调整server_names_hash_max_size和server_names_hash_bucket_size,否则nginx将无法启动。 Nginx报错1.服务器重启之后,执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错nginx: [error] invalid PID number "" in "/run/nginx.pid" 1234# 解决办法:nginx -c /etc/nginx/nginx.confnginx.conf文件的路径可以从nginx -t的返回中找到。nginx -s reload 2.a duplicate default server for 0.0.0.0:80nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/gitlab:10 123删除/etc/nginx/sites-available/default文件,重新启动服务即可nginx -t :检查配置文件是否出错 3.403123打开nginx.conf例子:vim /etc/nginx/nginx.conf把 user 用户名 改为 user root 或 其它有高权限的用户名称即可 Nginx应用Acme.sh的使用123456789101112131415161718192021222324252627282930313233343536# 下载软件curl https://get.acme.sh | sh# 设置别名 alias:alias acme.sh=~/.acme.sh/acme.sh # 切换 Let's Encrypt,默认使用 ZeroSSLacme.sh --set-default-ca --server letsencrypt# 执行,会打印配置域名的TXTacme.sh --issue -d baidu.me --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please# 配置好执行,再执行acme.sh --issue -d baidu.me --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --renew# --nginx 就是指定域名的配置文件Your cert is in: /root/.acme.sh/baidu.me_ecc/baidu.me.cerYour cert key is in: /root/.acme.sh/baidu.me_ecc/baidu.me.keyThe intermediate CA cert is in: /root/.acme.sh/baidu.me_ecc/ca.cerAnd the full chain certs is there: /root/.acme.sh/baidu.me_ecc/fullchain.cer# 查看申请的证书root@jenkins-jumpserver-nginx:~/.acme.sh# acme.sh --listMain_Domain KeyLength SAN_Domains CA Created Renewbaidu "ec-256" no LetsEncrypt.org 2023-09-17T11:52:22Z 2023-11-15T11:52:22Z# 续期证书# 证书默认是90天,如需强制更新证书,则执行以下命令acme.sh --renew -d abc.xyz --force# acme.sh会自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, # 如果快过期了, 需要更新, 则会自动更新证书,使用以下命令可查看定时任务crontab -l# 升级 acme.sh 到最新acme.sh --upgrade 12345# CFexport CF_Key="xxxxxxx" export CF_Email="CF账号的邮箱"acme.sh --issue -d "baidu.com" --dns dns_cf 建立软连接1sudo ln -s /etc/nginx/sites-available/domain-one.com /etc/nginx/sites-enabled/ 快速部署静态应用1234567891011121314# 首尾配置暂时忽略server { listen 8080; server_name localhost; location / { # 设置为个人项目的根目录路径 root /usr/local/var/www/my-project; index index.html index.htm; # vue项目404让前端路由处理 try_files $uri $uri/ /index.html; }}# 首尾配置暂时忽略 跨域1234567891011121314# 首尾配置暂时忽略server { listen 8080; server_name localhost; location / { # 跨域代理设置 proxy_pass http://www.proxy.com; # 要实现跨域的域名 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; }}# 首尾配置暂时忽略 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748# 第二种server { listen 80 default_server; server_name _ www.*; location / { index index.html; root /home/ubuntu/sabong-server-front; try_files $uri $uri/ /index.html; } location /api/ { if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' *; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,language,If-Modified-Since,Cache-Control,Content-Type'; add_header 'Access-Control-Allow-Credentials' true; add_header 'Access-Control-Max-Age' 86400; return 200; } add_header 'Access-Control-Allow-Origin' *; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,language,If-Modified-Since,Cache-Control,Content-Type'; add_header 'Access-Control-Allow-Credentials' true; add_header 'Access-Control-Max-Age' 86400; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Nginx-Proxy true; proxy_pass http://172.31.41.206:9001/; } location /ws { proxy_pass http://172.31.41.206:9006/ws; proxy_http_version 1.1; proxy_read_timeout 360s; proxy_redirect off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }} Gzip压缩1234567http { # 配置gzip压缩 gzip on; gzip_min_length 1000; # 设定压缩的临界点 gzip_comp_level 3; # 压缩级别 gzip_types text/plain application/xml; # 要压缩的文件类别} 转发Vue项目1234567891011121314151617181920server { listen 80 default_server; server_name _; location / { index index.html; root /home/ubuntu/sabong-server-front; # nginx 转发给前端判断是不是404 try_files $uri $uri/ /index.html; } location /api/ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Nginx-Proxy true; proxy_pass http://172.31.41.206:9001/; }} 转发Websocket123456789101112location /ws { proxy_pass http://172.31.41.206:9006/ws; proxy_http_version 1.1; proxy_read_timeout 360s; proxy_redirect off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;} 转发Redis只知道这么配置,不知道怎么给redis配置上域名 1234567891011121314151617181920212223242526272829303132user www-data;worker_processes auto;pid /run/nginx.pid;include /etc/nginx/modules-enabled/*.conf;events { worker_connections 768; # multi_accept on;}http{ # ...}# 要跟http统计,旧的版本没有steram模块,需要编译的时候加# 下载最新的版本肯定是有stream模块的stream { upstream redis { # myredis.godjfp.com 要被转发的Redis地址 # 6379:redis自己设置的端口是多少,就是多少 server myredis.godjfp.com:6379 max_fails=3 fail_timeout=30s; } server { # 公网访问的端口 listen 6379; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass redis; }} 图片上传post上传文件,出现413错误码 解决方案 1234#允许客户端请求的最大单文件字节数client_max_body_size 10m; #缓冲区代理缓冲用户端请求的最大字节数client_body_buffer_size 128k; HTTPS跳转1234567891011121314151617181920212223242526272829303132333435363738394041424344454647server { listen 80; listen 443 ssl; # 配置SSL证书 server_name abc.xyz; # 如果是http,就跳转https,注意nginx配置文件的不同,可能会出现重定向次数过多 if ($scheme = http) { return 301 https://$host$request_uri; } location / { proxy_pass http://192.168.0.2:8084/; }}# 比如配置强制跳转https,导致重定向次数过多server { listen 80; listen 443 ssl; # 配置SSL证书 server_name abc.xyz; # 如果是http,就跳转https,注意nginx配置文件的不同,可能会出现重定向次数过多 # 比如这个配置 return 301 https://$server_name$request_uri; # 比如这个配置 rewrite ^(.*)$ https://$host$1 permanent; location / { proxy_pass http://192.168.0.2:8084/; }}# 上面两种导致重定向的次数过多,需要修改配置文件,比如下面的配置文件就可以server { listen 80; server_name your_domain.com www.your_domain.com; return 301 https://$host$request_uri;}server { listen 443 ssl; server_name your_domain.com www.your_domain.com; ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private_key.key;} 代理JumpServer1234567891011121314151617181920212223server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location / { # 比如服务器里的JumpServer的端口已经设置成了8083 proxy_pass http://127.0.0.1:8083/; # 按照官方的配置,需要使用WebSocket,如果不配置的话,访问JumpServer网页会提示WebSocket报错 proxy_http_version 1.1; proxy_buffering off; proxy_request_buffering off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; }} 官方文档:使用Nginx代理JumpServer 代理Jenkins1234567891011121314151617181920212223242526272829303132333435363738server { listen 80 default_server; listen [::]:80 default_server; server_name _; location / { proxy_pass http://127.0.0.1:8083/; }}# 如果使用这样的配置,会有问题,比如配置的域名是baidu.com# 当访问baidu.com会正常访问,当登录之后,网页地址就变成http://127.0.0.1:8083/# 需要改成一下配置server { listen 80 default_server; listen [::]:80 default_server; server_name _; location / { proxy_pass http://127.0.0.1:8080/; # 下面这几个配置,访问Github会403 proxy_http_version 1.1; http2_push_preload on; # Enable http2 push proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Real-IP $remote_addr; # 这个配置又是正常的,要看看这个请求头是干嘛的了 proxy_set_header X-Rea $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Nginx-Proxy true; }} 12345678910111213141516171819202122232425262728293031server { listen 80; server_name _; location /api/ { client_max_body_size 100m; client_body_buffer_size 50m; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.31.2.105:8083/; } # 代理swagger稳定 openapi3的版本,springboot3的版本 location /v3/api-docs { client_max_body_size 100m; client_body_buffer_size 50m; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.31.2.105:8083/v3/api-docs; } location / { try_files $uri $uri/ /index.html; root /usr/share/nginx/html/manager/dist/; index index.html index.htm; } } SRSDocker方式运行1234docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:latest# 测试# 访问:[http://192.168.254.180:8080/](http://192.168.254.180:8080/) SRS安装参考https://cloud.tencent.com/developer/article/1693951 Mac改成只播放系统声音Mac obs推流直播无声音解决方法_OBS教程_OBS Open Broadcaster Software OBS权限监听浏览器

2025-05-29
Dapp
HelloWorld合约Remix编辑器 12345678// SPDX-License-Identifier: MITpragma solidity ^0.8.13;contract helloworld{ function helloWorld() public pure returns (string memory) { return "Hello, World!"; }} 发行代币在闲鱼,淘宝上买些测试币,也可以通过水龙头获取(只是有点要求和门槛,不如直接买),这里我买了两笔 新建合约文件 1234567891011// SPDX-License-Identifier: MITpragma solidity ^0.8.13;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract MyError20Token is ERC20{ constructor(string memory _name,string memory _symbol) ERC20(_name,_symbol){ _mint(msg.sender,10000 * 10 ** 18); }}

2022-11-19
IDEA
教程IDEA查看方法被调用 修改光标所在行背景颜色 断点判断条件在断点上点右键,正常的写判断代码就行 插件Rabinbow Brackets作者:Zhihao Zhang 使用方法 Command+右键,高亮选中部分 Alt+右键,高亮选中部分,其余的代码变暗 CommitMessage作者:郭翰林 使用方法,提交的时候,点击✈️的图标 Codeium作者:Codeium 写代码的时候会有自动提示,按tab确定使用AI生成的代码 Key Promoter XTranslation作者:Yii.Guxing 选中要翻译的内容,右键选择翻译 IDEA 2025恢复旧版Commit弹窗从IntelliJ IDEA 2025版本开始,JetBrains默认启用了非模态提交界面(Non-modal Commit),提交操作会显示在Commit工具窗口里,不再是以前独立弹出的Commit窗口. 如果更习惯旧版弹窗式Commit窗口,可以通过官方插件恢复. 安装插件 打开Settings,macOS是Preferences 进入Plugins 搜索Modal Commit 安装JetBrains官方插件Modal Commit Interface 重启IDEA 开启旧版提交窗口 打开Settings 进入Advanced Settings 搜索commit 在Version Control区域勾选Use modal commit interface for Git and Mercurial 点击Apply或者OK保存 配置完成后,Git和Mercurial提交时会恢复成旧版独立弹窗式Commit对话框.

2023-07-08
Telegram Bot
机器人设置消息分类消息分两种: 普通文本消息(比如test) 命令消息(以'/'开头的文本,比如 /test ) 默认在群里只能收到命令消息,和机器人私聊可以接收到全部的消息,如果想让机器人在群里也能接收到全部的消息,操作如下访问BotFather,输入/setprivacy,选择自己的机器人,选择DISABLED,就可以了
评论
目录