首页
关于
友链
Search
1
ESXI 一些功能调整
560 阅读
2
天翼云网关3.0/4.0超管密码
514 阅读
3
SoftEther 客户端篇
483 阅读
4
SoftEther 服务端篇
388 阅读
5
Centos安装个人网盘Alist v3教程
347 阅读
默认分类
代码相关
vue
html
python
系统
数据库
docker
安卓
软件分享
杂七杂八的工具
游戏分享
游戏相关
我的家庭影院
Ai
登录
Search
标签搜索
python
esxi
git
SoftEther
linux
apscheduler
在线
rclone
飞牛
list
列表
idm
激活码
Charles
pdf
免安装
鲁大师
图片查看器
蜂蜜浏览器
honeyview
哥特式
累计撰写
106
篇文章
累计收到
15
条评论
首页
栏目
默认分类
代码相关
vue
html
python
系统
数据库
docker
安卓
软件分享
杂七杂八的工具
游戏分享
游戏相关
我的家庭影院
Ai
页面
关于
友链
搜索到
106
篇与
的结果
2024-12-05
FileCodeBox配置
docker运行name: filecodebox services: filecodebox: restart: always ports: - 123:12345 #左边的8080可以随意更改成服务器上没有用过的端口 volumes: - ./data:/app/data container_name: filecodebox image: lanol/filecodebox:beta networks: default: external: true name: web s3配置文件
2024年12月05日
29 阅读
0 评论
0 点赞
2024-11-29
阿里云CDN使用
1. 阿里云配置一个cdn,一切默认就行新建一个cdn,域名就是,泛域名类型的.cdn.example.com源站,因为家里的80和443是没了的,所以使用的是65000,例如:test.example.com:650001.1 基本设置-->ipv6开关可以根据自己的需求设置是否打开1.2 回源配置-->IPv6回源优先使用IPv6-->已开启回源跟随-->未开启回源IPv4/IPv6轮询-->已开启1.3 性能优化-->忽略参数这里需要修改一下,要不然某些参数会被忽略忽略参数-->否2. 新建一个网站默认就行,监听的端口是65000,不是默认的80,配置一个反向代理反代到frps的端口号,比如650803. 对应的服务器上配置frp3.1 frps的配置bindAddr = "0.0.0.0" # 服务端监听端口 bindPort = 52101 # 服务端监听 KCP 协议端口,用于接收配置了使用 KCP 协议的 frpc 连接。 kcpBindPort = 52101 # 在 method 为 token 时生效,客户端需要设置一样的值才能鉴权通过。 auth.token = "token.example" # http端口,不要设置80,否则和宝塔面板的端口号冲突 vhostHTTPPort = 65080 # https端口,不要设置443 vhostHTTPSPort = 65443 # 二级域名后缀 subDomainHost = "cdn.example.com" # 开启frps仪表盘可以检查frp的状态和代理的统计信息。 webServer.addr = "0.0.0.0" webServer.port = 65002 webServer.user = "example" webServer.password = "example" enablePrometheus = true # 日志配置文件 # 日志文件,不指定日志信息默认输出到控制台 log.to = "./logs/cdn-example.log" # 日志等级,可用等级“trace,debug,info,warn,error” log.level = "info" # 日志保存最大时间 log.maxDays = 3 log.disablePrintColor = false # 自定义默认的404页面 custom404Page = "./frp/404.html"3.2 frpc的配置# 用户名,设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突。 user = "daimaji" serverAddr = "127.0.0.1" serverPort = 52101 # 登录失败就退出 loginFailExit = true # 控制台日志文件 log.to = "./cdn-example.log" # trace, debug, info, warn, error log.level = "info" log.maxDays = 3 # 当log.to是控制台时禁用日志颜色,默认值为false log.disablePrintColor = false # 认证方式 auth.method = "token" # 令牌 auth.token = "token.example" # 控制面板设置 webServer.addr = "0.0.0.0" webServer.port = 65002 webServer.user = "example" webServer.password = "example" # 将提前建立连接,默认值为零 transport.poolCount = 5 #用于连接到服务器的通信协议 #现在支持tcp、kcp、quic、websocket和wss,默认为tcp transport.protocol = "tcp" #连接服务器时设置客户端绑定ip,默认为空。 #只有当protocol=tcp或websocket时,才会使用该值。 transport.connectServerLocalIP = "0.0.0.0" [[proxies]] name = "测试" type = "http" localIP = "127.0.0.1" localPort = 65003 subdomain = "test"4. 访问测试
2024年11月29日
34 阅读
0 评论
0 点赞
2024-11-28
Idea安装codeium排坑(faild download language server)
1. 插件市场搜索安装codeium2. 重启后右下角有这个图标3. 重启IDEA之后,提示faild download language server4. 前往 github.com 下载对应版本的exe程序,版本与插件版本对应,比如上图中我插件的版本是 1.28.1 我就下载1.28.1的exe。5. 把下载好的 language_server_windows_x64.exe 放到插件目录下的一个很长字符串的目录下。这里有一个小技巧,如果你的插件目录不在这里,你可以用Everything软件全盘搜codeium 。最后一串英文,每个人的可能不一样C:\Users\用户名\AppData\Roaming\JetBrains\PyCharm2024.3\plugins\codeium\f740e5605570f4cf2ef1fdda47389168e7319c796. 重启IDEA后提示登录,登录之后便可使用
2024年11月28日
261 阅读
0 评论
0 点赞
2024-11-12
远程桌面rustdesk使用说明
项目地址:https://github.com/rustdesk/rustdesk/1. 公网服务器上跑docker项目docker-compose.yml文件:networks: rustdesk-net: external: false services: hbbs: container_name: hbbs ports: - 21115:21115 - 21116:21116 - 21116:21116/udp - 21118:21118 image: rustdesk/rustdesk-server:latest command: hbbs -r 你的域名:21117 -k {key值,自己设定} volumes: - ./data:/root networks: - rustdesk-net depends_on: - hbbr restart: unless-stopped hbbr: container_name: hbbr ports: - 21117:21117 - 21119:21119 image: rustdesk/rustdesk-server:latest command: hbbr volumes: - ./data:/root networks: - rustdesk-net restart: unless-stopped默认配置就行2. 配置客户端2.1 直接配置客户端电脑上:手机上:2.2. GitHub配置,自动编译版本{callout color="#80b8f5"}访问rustdesk的项目地址。点击Fork创建分支。(就是把别人的项目拉一份到你的项目库中){/callout}{callout color="#80b8f5"}默认配置就行{/callout}{callout color="#80b8f5"}配置环境变量{/callout}这里,分别创建两个变量RENDEZVOUS_SERVER 服务器IP或域名RS_PUB_KEY key值{callout color="#80b8f5"}点击Actions-General 勾选Allow all actions and reusable workflows后保存。{/callout}在没有变动情况下,默认都是勾选的。{callout color="#80b8f5"}接下来,选择Actions启用工作流。{/callout}刷新页面,便可以看到当前的任务。{callout color="#f0ad4e"}这里的任务需要很久,大概40-50分钟左右{/callout}创建完成后,在Releases中便可以看到对应的包了。{callout color="#80b8f5"}使用{/callout}这里以Windows为例。运行后在网络配置中,无需填写相关服务器信息。在无P2P直连环境,便可以直连了。删除下面代码 位置\rustdesk-master\src\ui\index.tis完成后,重新打包。界面就好看多了
2024年11月12日
340 阅读
1 评论
0 点赞
2024-11-12
pycharm激活说明
2025年3月27日,评论区提到了另外的方法,在语言和区域设置中,把区域改为未指定就好了{dotted startColor="#ff6c6c" endColor="#1989fa"/}现在的激活会验证网址,暂时只想到代理的方式解决设置-->外观与行为-->系统设置-->HTTPdaili选择手动代理-->HTTP主机号:随便一个不存在的都行,127.0.0.1端口号:81(不存在就行)-不为以下项使用代理:downloads.marketplace.jetbrains.com, resources.jetbrains.com, hub.jetbrains.com, plugins.jetbrains.com, *.github.com, *.google.com, *.bing.com, registry.geoway.com, 172.16.*, 10.*, localhost, api.cognitive.microsofttranslator.com, *.microsoft.com
2024年11月12日
182 阅读
2 评论
0 点赞
2024-11-07
misskey的一些使用教程
1. 其他应用使用misskey登录原文api使用地址 要为使用应用程序的用户(以下简称“用户”)获取访问令牌,请按照以下步骤请求颁发。提示下面描述的方法称为 MiAuth,它无需创建应用程序即可立即颁发访问令牌。步骤 1生成 UUID。从现在开始,这将被称为会话 ID。 警告 请每次生成此会话ID,并且不要重复使用。 第 2 步在用户的浏览器中显示应用程序身份验证表单。可以使用以下格式的 URL 打开身份验证表单:https://{host}/miauth/{session}{host}替换为您服务器的主机。主机通常由用户输入。{session}替换为您的会话 ID。您还可以在 URL 中设置一些选项作为查询参数:姓名解释name应用程序名称。icon应用程序图标图像 URL。callback身份验证后重定向到的 URL。 重定向时,session会话 ID 将作为查询参数添加。permission应用程序请求的权限。列出 所请求的权限,以 分隔。您可以在此处,检查权限列表。[](https://misskey-hub.net/cn/docs/for-developers/api/permission/)例子https://misskey.example/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f?name=MyApp&callback=https%3A%2F%2Fmyapp.example.com%2Fcallback&permission=write:notes,write:following,read:drive通过之后,携带的参数就是https://myapp.example.com/callback?session=c1f6d42b-468b-4fd2-8274-e58abdedef6f步骤3用户授予应用程序访问权限后,对以下格式的 URL 的 POST 请求将返回包含访问令牌的 JSON 响应。https://{host}/api/miauth/{session}/check{host} 替换为您服务器的主机。{session} 替换为您的会话 ID。响应中包含的属性有:姓名解释token用户的访问令牌。user用户信息。
2024年11月07日
148 阅读
0 评论
0 点赞
2024-07-31
acme更新ssl证书
acme实用技巧:稳妥的自动更新证书之宝塔面板_acme证书-CSDN博客acme实用技巧:稳妥的自动更新证书之宝塔面板1. 安装 acme.sh安装很简单, 一个命令:curl https://get.acme.sh | sh -s email=my@example.com把 my@example.com 改成自己的邮箱安装成功后,会为你自动创建定时任务, 如果快过期了, 需要更新, 则会自动更新证书。默认情况下,证书将每60天更新一次。切换默认证书目前 acme.sh 支持 Let’s Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL,如果需要更换可以使用下面命令:#切换 Let's Encrypt acme.sh --set-default-ca --server letsencrypt #切换 Buypass acme.sh --set-default-ca --server buypass #切换 ZeroSSL acme.sh --set-default-ca --server zerossl #切换 SSL.com acme.sh --set-default-ca --server ssl.com #切换 Google Public CA acme.sh --set-default-ca --server google2. 设置DNS验证文档:https://github.com/acmesh-official/acme.sh/wiki/dnsapi以 CloudFlare为例:使用全局API密钥准备:全局API密钥在 我的个人资料–API令牌–Global API Key 获得设置CloudFlare DNS自动验证使用下面命令:export CF_Key="763eac4f1bcebd8b5c95e9fc50d010b4" #API密钥 export CF_Email="123456@qq.com" #登录邮箱3. 生成证书如果之前安装过证书,后面加 --force 参数,acme.sh --issue --dns dns_cf -d xxx.com -d *.xxx.com成功之后,会在 ~/.acme.sh/目录生成以域名为名称的文件夹,里面包含了证书和各种信息不要通配符,可以去掉:-d *.xxx.com ,如果有多个子域名,后面加 -d x.xxx.com--dns dns_cf 表示使用CloudFlare DNS 自动验证4. 安装证书(重点)假设:你网站使用的是nginx,使用以下命令acme.sh --install-cert -d xxx.com -d *.xxx.com \ --key-file /www/server/panel/vhost/cert/xxx.com/privkey.pem \ --fullchain-file /www/server/panel/vhost/cert/xxx.com/fullchain.pem \ --reloadcmd "service nginx force-reload"使用这条命令时先要生成证书(第三步)不要通配符,可以去掉:-d *.xxx.com ,如果有多个子域名,后面加 -d x.xxx.com命令解读--install-cert #安装证书--key-file #指定安装证书密钥路径--fullchain-file #指定安装证书路径--reloadcmd #重新加载nginx生效为什么要使用那么多参数因为acme证书虽然60天更新一次,但是更新的证书路径是:~/.acme.sh/xxx.com你的域名指向的证书路径并不是在 ~/.acme.sh/不能使用~/.acme.sh/文件夹中的证书文件,它们仅供内部使用,文件夹结构将来可能会更改这些参数会被acme保存起来,下次自动更新时就会自动把证书安装到指定的路径,然后帮你重新加载nginx生效宝塔面板安装证书你要先知道你的域名证书指向的路径在哪,以宝塔面板为例:/www/server/panel/vhost/cert/xxx.com/fullchain.pem /www/server/panel/vhost/cert/xxx.com/privkey.pem可以看到宝塔的证书路径是:/www/server/panel/vhost/cert/如果还没有安装过证书,那么此路径是没有域名证书文件夹的,宝塔面板默认的证书路径格式是:/www/server/panel/vhost/cert/{域名}所以,生成证书后,到~/.acme.sh/目录下找到域名文件夹,复制证书fullchain.cer #证书 xx.com.key #密钥复制到配置ssl证书的地方, 再查看证书路径:最后再执行以下命令,记得修改为你的证书路径acme.sh --install-cert -d xxx.com -d *.xxx.com \ --key-file /www/server/panel/vhost/cert/xxx.com/privkey.pem \ --fullchain-file /www/server/panel/vhost/cert/xxx.com/fullchain.pem \ --reloadcmd "service nginx force-reload"不是复制了证书生效了吗,为什么还要执行上面的命令?因为这些参数会被保存起来,之后的自动更新才有效!5. 签发ECC证书使用以下命令 (以nginx为例)acme.sh --install-cert -d xxx.com -d *.xxx.com --keylength ec-256 \ --key-file /www/server/panel/vhost/cert/xxx.com/privkey.pem \ --fullchain-file /www/server/panel/vhost/cert/xxx.com/fullchain.pem \ --reloadcmd "service nginx force-reload"多了 --keylength ec-256 参数6.强制更新证书所有证书将每60天自动更新一次,但你要强制更新的话acme.sh --renew -d xxx.com --force或者,对于ECC证书:acme.sh --renew -d xxx.com --force --ecc如何停止证书续订要停止证书的续订,您可以执行以下操作以从续订列表中删除证书:acme.sh --remove -d xxx.com [--ecc]不会从磁盘中删除证书/密钥文件。您可以自己删除相应的目录 (例如 ~/.acme.sh/xxx.com )。如何升级 acme.sh您可以将acme.sh更新为最新代码:acme.sh --upgrade您还可以启用自动升级:acme.sh --upgrade --auto-upgrade然后acme.sh将自动保持最新。禁用自动升级:acme.sh --upgrade --auto-upgrade 0
2024年07月31日
65 阅读
1 评论
1 点赞
2024-07-03
实现 MySQL8 查询 JSON 字段
步骤 1: 创建表首先,我们需要创建一个包含 JSON 数据类型字段的表。假设我们要创建一个名为 users 的表,其中包含一个名为 info 的 JSON 字段。CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, info JSON );以上代码创建了一个名为 users 的表,其中包含 id 和 info 两个字段。id 字段是主键,info 字段是 JSON 类型。步骤 2: 插入数据接下来,我们需要向表中插入一些包含 JSON 数据的示例数据。INSERT INTO users (info) VALUES ('{"name": "John", "age": 30, "city": "New York"}'), ('{"name": "Alice", "age": 25, "city": "London"}'), ('{"name": "Bob", "age": 35, "city": "Paris"}');以上代码向 users 表中插入了三条数据,每条数据都包含一个 JSON 对象。步骤 3: 查询 JSON 字段现在,我们可以开始查询包含 JSON 字段的数据了。以下是一些常用的查询操作。查询 JSON 字段的所有数据要查询 JSON 字段的所有数据,可以使用简单的 SELECT 语句。SELECT * FROM users;以上代码将返回 users 表中所有数据。查询 JSON 字段的特定属性要查询 JSON 字段的特定属性,可以使用 -> 或 ->> 运算符。SELECT info->'$.name' AS name, info->'$.age' AS age FROM users;以上代码将返回 users 表中每行数据的 name 和 age 属性。查询 JSON 字段的条件要查询满足特定条件的 JSON 字段数据,可以使用 WHERE 子句。SELECT * FROM users WHERE info->'$.age' > 30;以上代码将返回 users 表中 age 大于 30 的数据。查询 JSON 数组中的值如果 JSON 字段是一个数组,可以使用 ->> 运算符和 JSON_TABLE 函数来查询数组中的值。SELECT jt.value FROM users, JSON_TABLE(info, '$.hobbies[*]' COLUMNS (value VARCHAR(255) PATH '$')) AS jt;
2024年07月03日
31 阅读
0 评论
0 点赞
2024-07-02
小米14 pro设置
1. 关闭5G网络进入拨号界面,输入*#*#54638#*#*回到设置-->移动网络-->5G网络点进去关闭就好
2024年07月02日
294 阅读
0 评论
0 点赞
2024-07-02
【Django】执行查询——查询JSONField
JSONField本篇的例子以下面这个模型为基础:from django.db import models class Dog(models.Model): name = models.CharField(max_length=200) data = models.JSONField(null=True) def __str__(self): return self.name 保存和查询None值在使用JSONField时,要注意空值的处理,注意区分SQL NULL和JSON null保存None值我们首先创建两个Dog实例from django.db.models import Value, JSONField Dog.objects.create(name="Max", data=None) # SQL NULL. # <Dog: Max> Dog.objects.create(name="Archie", data=Value(None, JSONField())) # JSON null. # <Dog: Archie>观察两个实例在数据库中的表现,可以发现SQL NULL和JSON null是不一样的。查询None值查询时,None值将被解释为JSON null,要查询SQL NULL,需要使用isnull:Dog.objects.filter(data=None) # <QuerySet [<Dog: Archie>]> Dog.objects.filter(data=Value(None, JSONField())) # <QuerySet [<Dog: Archie>]> Dog.objects.filter(data__isnull=True) # <QuerySet [<Dog: Max>]> Dog.objects.filter(data__isnull=False) # <QuerySet [<Dog: Archie>]> 对比可以发现,data=None在保存时存储为SQL NULL,查询时解释为JSON null根据键值查找根据json数据的键进行查找,用__连接,可以多个键连接一起,如果某个值是一个列表,要进行索引,就用整数代表该列表的索引。例子:Dog.objects.create( ... name="Rufus", ... data={ ... "breed": "labrador", ... "owner": { ... "name": "Bob", ... "other_pets": [ ... { ... "name": "Fishy", ... } ... ], ... }, ... }, ... ) # <Dog: Rufus> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": None}) # <Dog: Meg> # __连接键进行查找 Dog.objects.filter(data__breed="collie") # <QuerySet [<Dog: Meg>]> # 多个键连接进行查找 Dog.objects.filter(data__owner__name="Bob") # <QuerySet [<Dog: Rufus>]> # 某个值是一个列表,要进行索引,就用整数代表该列表的索引 Dog.objects.filter(data__owner__other_pets__0__name="Fishy") # <QuerySet [<Dog: Rufus>]> # 查询缺少的键,使用isnull查找 Dog.objects.create(name="Shep", data={"breed": "collie"}) # <Dog: Shep> Dog.objects.filter(data__owner__isnull=True) # <QuerySet [<Dog: Shep>]> 包含与键查找containscontains 查询返回的对象是那些包含给定键值对的顶层字段的对象。Dog.objects.create(name="Rufus", data={"breed": "labrador", "owner": "Bob"}) # <Dog: Rufus> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"}) # <Dog: Meg> Dog.objects.create(name="Fred", data={}) # <Dog: Fred> Dog.objects.filter(data__contains={"owner": "Bob"}) # <QuerySet [<Dog: Rufus>, <Dog: Meg>]> Dog.objects.filter(data__contains={"breed": "collie"}) # <QuerySet [<Dog: Meg>]> contained_by这个可以理解为 contains 查询的反向。 要查询的对象满足这样的条件:其该字段对应的数据是传递的值的子集。Dog.objects.create(name="Rufus", data={"breed": "labrador", "owner": "Bob"}) # <Dog: Rufus> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"}) # <Dog: Meg> Dog.objects.create(name="Fred", data={}) # <Dog: Fred> Dog.objects.filter(data__contained_by={"breed": "collie", "owner": "Bob"}) # <QuerySet [<Dog: Meg>, <Dog: Fred>]> Dog.objects.filter(data__contained_by={"breed": "collie"}) # <QuerySet [<Dog: Fred>]> has_key返回数据顶层的键中有给定值的对象。Dog.objects.create(name="Rufus", data={"breed": "labrador"}) # <Dog: Rufus> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"}) # <Dog: Meg> Dog.objects.filter(data__has_key="owner") # <QuerySet [<Dog: Meg>]> has_keys返回数据顶层的键都包含在给定列表中的对象。Dog.objects.create(name="Rufus", data={"breed": "labrador"}) # <Dog: Rufus> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"}) # <Dog: Meg> Dog.objects.filter(data__has_keys=["breed", "owner"]) # <QuerySet [<Dog: Meg>]> has_any_keys返回数据顶层的键中有至少1个在给定列表中的对象,比has_keys条件更宽松。Dog.objects.create(name="Rufus", data={"breed": "labrador"}) # <Dog: Rufus> Dog.objects.create(name="Meg", data={"owner": "Bob"}) # <Dog: Meg> Dog.objects.filter(data__has_any_keys=["owner", "breed"]) # <QuerySet [<Dog: Rufus>, <Dog: Meg>]>
2024年07月02日
29 阅读
0 评论
0 点赞
2024-06-28
python关键字
在Python中,assert是一个关键字,用于编写断言(assertion)。断言是一种用于检查程序中的条件是否为真的方法,通常用于调试和测试目的。当使用assert时,程序会在断言条件为假的情况下引发AssertionError异常。assert的语法如下:assert condition, message其中,condition是要检查的条件,如果条件为假,将会引发AssertionError异常。message是可选的,用于在断言失败时指定错误消息。以下是一个简单的示例:def divide(x, y): assert y != 0, "除数不能为零" return x / y result = divide(6, 3) # 不会触发断言异常 print(result) result = divide(6, 0) # 会触发断言异常,抛出AssertionError: 除数不能为零在上面的示例中,assert y != 0, "除数不能为零"用于检查除数是否为零,如果为零则触发AssertionError异常,并且指定了错误消息"除数不能为零"。这有助于在程序中快速识别和调试问题,并提供有用的错误信息。需要注意的是,一般情况下,assert语句在生产环境中通常会被禁用,因为它们可能会暴露敏感信息或导致安全问题。然而,在开发和测试阶段,assert语句是一个非常有用的工具,可以帮助程序员快速发现和修复问题。
2024年06月28日
18 阅读
0 评论
0 点赞
2024-05-31
Django查询技巧
查询每个供货商的商品库存如果supplier_supplier.id是每个供应商的ID,并且在extra()方法中使用原始SQL查询来计算每个供应商的库存总和,可以按如下方式操作:from django.db.models import Sum # 假设您有名为Supplier的模型,它有一个名为supplier的外键字段指向supplier_supplier模型 # 获取每个供应商的库存总和 supplier_stock_sums = Supplier.objects.extra( select={'stock_sum': 'SELECT IFNULL(SUM(main_product.stock), 0) FROM main_product WHERE main_product.supplier_id = supplier_supplier.id AND main_product.status = 10'} ) # 打印每个供应商的库存总和 for supplier in supplier_stock_sums: print(f"供应商 {supplier.id} 的库存总和为 {supplier.stock_sum}")在上面的示例中,在extra()方法的select参数中使用了原始SQL查询,并在查询中引用了supplier_supplier.id来表示每个供应商的ID。这样就可以计算每个供应商的库存总和。
2024年05月31日
33 阅读
0 评论
0 点赞
2024-05-26
可道云配置
修改的东西app/function/web.function.php// 增加最后的判断: || $_SERVER['HTTP_CF_VISITOR'] function http_type(){ if( (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || $_SERVER['SERVER_PORT'] === 443 || $_SERVER['HTTP_CF_VISITOR'] ){ return 'https'; } return 'http'; } function get_host() { $httpType = http_type(); // 增加这里 $port = $_SERVER['SERVER_PORT']=='80' ? '' : ':'.$_SERVER['SERVER_PORT']; $host = $_SERVER['SERVER_NAME'].$port; $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'].$port : $host; // 修改的内容结束 if(isset($_SERVER['HTTP_X_FORWARDED_HOST'])){//proxy $hosts = explode(',', $_SERVER['HTTP_X_FORWARDED_HOST']); $host = trim($hosts[0]); }else if(isset($_SERVER['HTTP_X_FORWARDED_SERVER'])){ $host = $_SERVER['HTTP_X_FORWARDED_SERVER']; } // 如果域名相同 则根据referer自适应https; if(isset($_SERVER['HTTP_REFERER'])){ $urlInfo = parse_url($_SERVER['HTTP_REFERER']); if($urlInfo['host'] == trim($host,'/')){ if($httpType == 'http' && $urlInfo['scheme'] == 'https'){$httpType = 'https';} } } return $httpType.'://'.trim($host,'/').'/'; }最新的安装包反代的时候有问题,下载以前的https://static.kodcloud.com/update/download/kodbox.1.40.zip
2024年05月26日
71 阅读
0 评论
0 点赞
2024-05-26
Minio集群配置
docker-compose搭建多主机分布式miniominio介绍Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。官网地址:MinIO | High Performance, Kubernetes Native Object Storage何为对象存储?我们来看下阿里云 OSS (Object Storage Service)的介绍:对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。对于中小型企业,如果不选择存储上云,那么 Minio 是个不错的选择,麻雀虽小,五脏俱全。当然 Minio 除了直接作为对象存储使用,还可以作为云上对象存储服务的网关层,无缝对接到 Amazon S3、MicroSoft Azure。1.配置时间同步、关闭防火墙和selinux2.确保主机都安装了docker 以及docker composedocker-compose.yml # Settings and configurations that are common for all containers # minio节点之间默认使用9000来连通,所以容器把9000暴露出来,9001是console端口,每个节点设置两块磁盘 x-minio-common: &minio-common image: minio/minio:latest command: server --console-address ":9001" http://minio{1...2}/data{1...2} expose: - "9000" - "9001" # 增加host映射,以便两个节点之间通过域名连通 extra_hosts: minio1: 192.168.188.40 minio2: 192.168.188.41 environment: MINIO_ROOT_USER: 用户名 MINIO_ROOT_PASSWORD: 密码 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 5 # starts 3 docker containers running minio server instances. # using nginx reverse proxy, load balancing, you can access # it through port 9000. # 数据盘挂载目录,按需修改 services: minio1: <<: *minio-common container_name: minio1 hostname: minio1 volumes: - ./data1-1:/data1 - ./data1-2:/data2 ports: - "9000:9000" - "9001:9001" minio2: <<: *minio-common container_name: minio2 hostname: minio2 volumes: - ./data2-1:/data1 - ./data2-2:/data2 ports: - "9000:9000" - "9001:9001"3.将以上文件放在每台机器的同一目录下,去分别启动# 拉镜像 ./docker compose pull # 后台启动容器,三台机器分别对应各自节点 mini01 /minio2 (切勿单台启动多个) # 在188-40上执行 ./docker compose up -d minio1 # 在188-41上执行 ./docker compose up -d minio2 4. 配置负载均衡服务器上安装nginx创建网站修改配置文件,上面增加upstream console { ip_hash; server 192.168.188.40:9001 weight=100; server 192.168.188.41:9001 weight=10; }weight=number:用来设置服务器的权重,默认为1,权重数字越大,被分配到请求的几率越大。该权重值主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所以此策略比较适合服务器的硬件配置差别比较大的情况。nginx 的 upstream目前支持 4 种方式的分配1)、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。2)、weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。3)、ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。4)、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。5)、url_hash(第三方)反向代理的配置:配置文件#PROXY-START/ location ^~ / { proxy_pass http://console; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; # proxy_hide_header Upgrade; add_header X-Cache $upstream_cache_status; #Set Nginx Cache set $static_fileZhvl5TVI 0; if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) { set $static_fileZhvl5TVI 1; expires 1m; } if ( $static_fileZhvl5TVI = 0 ) { add_header Cache-Control no-cache; } # 缩略图配置 set $width -; set $height -; if ($arg_w != '') { set $width $arg_w; } if ($arg_h != '') { set $height $arg_h; } image_filter resize $width $height; image_filter_jpeg_quality 75; image_filter_buffer 100M; # 缩略图配置结束 } #PROXY-END/5.验证 ,登录 http://192.168.188.40:19001 账号密码 minio / minio1236.迁移登录到容器里面:mc alias set minio_old http://ip:port admin admin@old # minio_old -> 起别名 minio的服务地址:9000(也可以是 https://www.minio.com) 管理员账号 管理员密码 # mc alias set minio_new http://ip_new:port_new admin admin@new mc alias set minio_new http://ip:port admin admin@new mc mirror minio_old minio_new
2024年05月26日
50 阅读
0 评论
0 点赞
2024-05-25
Linux命令记录
1. 互传文件scp -r /www/wwwroot root@ip:/www/wwwroot
2024年05月25日
31 阅读
0 评论
0 点赞
1
2
3
...
8