首页
关于我们
友链链接
壁纸下载
更多
统计中心
热点搜索
图床上传
Search
1
[Win DD包] wes7-x86-cn-精简,安装后仅占用1.55G存储空间
25,479 阅读
2
保姆级教程!甲骨文ARM DD成Debian10并升级内核成5.10
6,182 阅读
3
N1教程:Openwrt安装docker webui界面(基于flippy openwrt n1固件)
5,210 阅读
4
ZFAKA小店Docker版之 数据的备份和迁移
5,003 阅读
5
甲骨文oracle ARM 重装 Debian 10
4,683 阅读
Linux学堂
网站建设
网络资源
主题插件
固件工具
主机评测
登录
Search
标签搜索
vps
linux
typecho
bench
lnmp
nginx
ssl
empirecms
openwrt
cloudflare
centos
google
n1
301
mysql
qbittorrent
onedrive
rclone
storage
ssh
V+变量
累计撰写
236
篇文章
累计收到
186
条评论
首页
栏目
Linux学堂
网站建设
网络资源
主题插件
固件工具
主机评测
页面
关于我们
友链链接
壁纸下载
统计中心
热点搜索
图床上传
搜索到
88
篇与
的结果
2025-03-11
军哥lnmp生成SSL证书成功但证书不存在,目录有_ecc解决方法
一 前言军哥的lnmp一键化安装包是很多站长首选,极大方便了建站站长。默认情况下正常的SSL证书目录为 /usr/local/nginx/conf/ssl/域名/ 但是acme.sh最近升级将默认的证书生成RSA的SSL证书调整为ECC证书,所以生成的SSL证书目录里acme.sh给加带上了_ecc的字样。二 解决办法目前有3种解决方法:1、执行如下命令进行修复bash <(curl -s http://soft.vpser.net/lnmp/ext/fix_ssl_20230205.sh)建议使用该命令进行修复2、可以编辑一下 /bin/lnmp 查找 --issue ${letsdomain} -w ${vhostdir} 替换为 --issue ${letsdomain} -w ${vhostdir} -k 2048 注意,这个前后都有空格,所有匹配的都替换掉然后rm -rf /usr/local/nginx/conf/ssl/www.domain.com_ecc/ 并将 /usr/local/nginx/conf/vhost/www.domain.com.conf 中的ssl站点的整个server段删除,然后重新 lnmp ssl add 进行添加3、可以修改 /usr/local/acme.sh/acme.sh 查找DEFAULT_ACCOUNT_KEY_LENGTH=ec-256 DEFAULT_DOMAIN_KEY_LENGTH=ec-256将后面的ec-256都更改为2048 保存,然后再rm -rf /usr/local/nginx/conf/ssl/www.domain.com_ecc/ 并将 /usr/local/nginx/conf/vhost/www.domain.com.conf 中的ssl站点的整个server段删除,然后重新 lnmp ssl add 进行添加但是这样每次acme.sh升级了都需要再修改一下ec-256
2025年03月11日
4 阅读
0 评论
0 点赞
2025-03-11
acme.sh使用进阶:acme.sh 手动更新 SSL 证书的详细步骤
一 前言关于 TLS/SSL传输层安全协议(英语:Transport Layer Security,缩写:TLS),及其前身安全套接层(Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障为什么要部署 HTTPS说到底,就是 HTTPS 更安全。甚至为了安全,一个专业可靠的网站, HTTPS 是必须的。 Firefox 和 Chrome 都计划将没有配置 SSL 加密的 HTTP 网站标记为不安全(貌似 Firefox 50 已经这么干了),目前它们也正在联合其他相关的基金会与公司推动整个互联网 HTTPS 化,现在大家访问的一些主要的网站。如 Google 多年前就已经全部启用 HTTPS ,国内的淘宝、搜狗、知乎、百度等等也全面 HTTPS 了。甚至 Google 的搜索结果也正在给予 HTTPS 的网站更高的排名和优先收录权。怎么部署 HTTPS你只需要有一张被信任的 CA ( Certificate Authority )也就是证书授权中心颁发的 SSL 安全证书,并且将它部署到你的网站服务器上。一旦部署成功后,当用户访问你的网站时,浏览器会在显示的网址前加一把小绿锁,表明这个网站是安全的,当然同时你也会看到网址前的前缀变成了 HTTPS ,不再是 HTTP 了。怎么获得 SSL 安全证书理论上,我们自己也可以签发 SSL 安全证书,但是我们自己签发的安全证书不会被主流的浏览器信任,所以我们需要被信任的证书授权中心( CA )签发的安全证书。而一般的 SSL 安全证书签发服务都比较贵,比如 Godaddy 、 GlobalSign 等机构签发的证书一般都需要 20 美金一年甚至更贵,不过为了加快推广 HTTPS 的普及, EEF 电子前哨基金会、 Mozilla 基金会和美国密歇根大学成立了一个公益组织叫 ISRG ( Internet Security Research Group ),这个组织从 2015 年开始推出了 Let’s Encrypt 免费证书。这个免费证书不仅免费,而且还相当好用,所以我们就可以利用 Let’s Encrypt 提供的免费证书部署 HTTPS 了之前本站介绍过如何安装acme.sh,以及通过阿里云API自动签发证书:acme.sh免费SSL证书申请教程——安装acme.sh并使用阿里云域名API自动签发证书。本文介绍在个别情况下SSL自动更新失败的时候如何手动更新SSL。二 安装步骤1 查看证书到期时间在更新前,确认当前证书的到期时间:acme.sh --list或直接查看证书文件:openssl x509 -enddate -noout -in /path/to/cert.pem2. 手动触发证书续期使用 --renew 或 --renew-all 命令手动更新证书:# 更新单个域名 acme.sh --renew -d vvars.com # 更新所有证书 acme.sh --renew-all3. 指定验证方式(如需要)根据证书初次申请时使用的验证方式,可能需要额外参数:1)HTTP 验证确保 Web 服务器可访问 .well-known/acme-challenge/ 目录:acme.sh --renew -d vvars.com --webroot /var/www/html2)DNS 验证使用 DNS API 自动验证(如 Cloudflare、阿里云等):# 示例:Cloudflare export CF_Key="your_api_key" export CF_Email="
[email protected]
" acme.sh --renew -d example.com --dns dns_cf4. 强制更新(可选)若证书未到期但需强制更新,添加 --force 参数:acme.sh --renew -d vvars.com --force5. 检查续期日志若更新失败,使用 --debug 查看详细日志:acme.sh --renew -d vvars.com --debug6. 重启 Web 服务器更新后,重新加载配置使新证书生效:# Nginx sudo nginx -s reload # Apache sudo systemctl reload apache27. 确认自动续期配置确保 acme.sh 的自动任务已启用:crontab -l | grep acme.sh正常会显示类似:0 0 * "/home/user/.acme.sh"/acme.sh --cron三 常见问题1 权限问题确保 acme.sh 有权限写入证书目录。避免使用 sudo,建议以普通用户运行。2 DNS API 配置若使用 DNS 验证,确保环境变量(如 CF_Key)已正确设置。3 证书路径变更若需更改证书保存路径,使用 --cert-file 和 --key-file 参数指定位置。
2025年03月11日
5 阅读
1 评论
0 点赞
2025-03-10
acme.sh免费SSL证书申请教程——安装acme.sh并使用阿里云域名API自动签发证书
一 前言随着各大搜索引擎增加对SSL证书认证的网站的收录和权重,获取SSL证书也成为各网站的首选,但一般各大SSL证书商提供的证书较贵,而网上提供90天的免费证书提供商有很多,每隔3个月的续期给网站管理带来挑战。关于acme.sh手动更新SSL证书,可以参考:acme.sh使用进阶:acme.sh 手动更新 SSL 证书的详细步骤1 ACME主要特点ACME.sh是一款非常优秀的签发SSL证书并自动续期的脚本(官方仓库地址),其主要特点如下。纯粹用 Shell(Unix shell)语言编写的 ACME 协议客户端。 完整的 ACME 协议实现。 支持ECDSA证书 支持 SAN 和通配符证书 简单、强大、易用。只需 3 分钟即可学会。 兼容 Bash、dash 和 sh。 纯粹用 Shell 编写,不依赖于 python。 只需一个脚本即可自动颁发、更新和安装您的证书。 不需要root/sudoer访问权限。 Docker 就绪 IPv6 就绪 用于更新或错误等的 Cron 作业通知。 它可能是easiest & smartest自动颁发和更新免费证书的 shell 脚本。2 支持的CA证书支持的 CA ZeroSSL.com CA(默认) Letsencrypt.org CA BuyPass.com 加拿大 SSL.com 认证 Google.com 公共 CA Pebble 严格模式 任何其他符合RFC8555的 CA3 支持的模式Webroot 模式 独立模式 独立 tls-alpn 模式 阿帕奇模式 Nginx 模式 DNS 模式 DNS 别名模式 无状态模式二 ACME.sh的安装ACME.sh最新版本为V3,其安装较为简单。1 安装curl https://get.acme.sh | sh -s
[email protected]
或wget -O - https://get.acme.sh | sh -s
[email protected]
注:
[email protected]
为你的邮箱地址。2 安装完毕后可以使用 acme.sh --version 检查状态acme.sh --version一般会提示:https://github.com/acmesh-official/acme.shv3.0.13 升级 acme.sh# 升级到最新版 acme.sh --upgrade # 开启自动升级 acme.sh --upgrade --auto-upgrade # 关闭自动升级 acme.sh --upgrade --auto-upgrade 0三 使用阿里云api自动签发证书ACME.sh提供了多种认证方式,http认证方式经常会报错,笔者建议采用dns API认证。各大 dns 提供商的使用方式参考此处,这里以阿里云API认证为例。1 获取阿里云API Key和API Secret首先你需要登录你的阿里云账号获取API key。https ://ram.console.aliyun.com/users。2 在VPS SSH环境中定义前面获取的API Key和API Secretexport Ali_Key="<key>" export Ali_Secret="<secret>"3 颁发证书./acme.sh --issue --dns dns_ali -d vvars.com -d www.vvars.com4 查看和操作已安装证书# 查看已安装证书 acme.sh --list # 删除证书 acme.sh remove <SAN_domains> 5 更新证书如果需要手动续签,则执行#更新证书,未到期则不会更新 acme.sh --renew -d vvars.com #强制更新证书 acme.sh --renew -d vvars.com --force # 更新所有证书 acme.sh --renew-all
2025年03月10日
6 阅读
1 评论
0 点赞
2025-03-07
openwrt挂载网站,让你的移动硬盘作为uhttpd挂载服务器
一前言之前本站介绍过,如何更改openwrt路由器的端口号,来解决电信、联通和移动运营商封禁家庭宽带端口号的文章:解决电信运营商封禁80和443端口,修改openwrt路由器的web访问端口号。今天介绍下如何将本地挂载的移动硬盘作为网站服务根目录,实现多端口访问。本文介绍了如何管理和配置uhttpd服务,包括启动、停止、重启和重新加载配置文件。通过修改/uetc/config/uhttpd配置,可以监听多个端口,并允许通过http://ip:8080/访问到特定目录。此外,还提到了CGI脚本的配置,如cgi_prefix和lua_prefix,以及/home、/key和/crt选项的作用。提供了多个相关脚本和资源链接供进一步学习。二配置教程1 SSH链接到旁路由2 编辑/ect/config/uhttpd文件vim /ect/config/uhttpd在其中增加如下的代码config uhttpd 'xboy' list listen_http '0.0.0.0:8080' list listen_http '[::]:8080' option home '/mnt/sda1/xboy' option cgi_prefix '/cgi-bin' option ubus_prefix '/ubus'注:上面代码中各参数的含义0.0.0.0:8080:表示监控IPV4的8080端口号; [::]:8080:表示监控IPV6的8080端口号; /mnt/sda1/xboy:设定的网站访问目录,比如移动硬盘下的xboy文件夹; /cgi-bin:cgi程序目录,如果是静态html可以不配置,cgi_prefix 定义了CGI脚本的前缀,该前缀相对应home路径,如果该字段为空,则cgi功能失效; lua_prefix 将请求转发给内置的Lua解析器,如果为空,则Lua功能失效; ubus_prefix ubus接线目录,如果为空,则ubus功能失效。3 让uhttpd加载配置文件/etc/init.d/uhttpd reload4 重启uhttpd程序/etc/init.d/uhttpd restart5 正常的话就可以用 http://路由器ip:8080访问了三注意事项1 uhttpd相关命令/etc/init.d/uhttpd start //启动uhttpd服务 /etc/init.d/uhttpd stop //停止uhttpd服务 /etc/init.d/uhttpd restart //重启uhttpd服务 /etc/init.d/uhttpd reload //重新加载uhttpd配置文件 /etc/init.d/uhttpd enable //启用uhttpd自动运行 /etc/init.d/uhttpd disable //停用uhttpd自动运行2 uhttpd的主配置文件config uhttpd 'main' list listen_http '0.0.0.0:80' list listen_http '[::]:80' list listen_https '0.0.0.0:443' list listen_https '[::]:443' option redirect_https '0' option home '/www' option rfc1918_filter '1' option max_connections '100' option cert '/etc/uhttpd.crt' option key '/etc/uhttpd.key' option cgi_prefix '/cgi-bin' list lua_prefix '/cgi-bin/luci=/usr/lib/lua/luci/sgi/uhttpd.lua' option network_timeout '30' option http_keepalive '20' option tcp_keepalive '1' option ubus_prefix '/ubus' option script_timeout '3600' list index_page 'cgi-bin/luci' option max_requests '50'上述参数含义从字面容易理解,key为私钥,crt为公钥。3 其他参考资料http://news.netcraft.com/archives/2011/04/06/april-2011-web-server-survey.htmlhttps://forum.openwrt.org/search.php?search_id=1586996754http://wiki.openwrt.org/doc/uci/uhttpdhttp://wiki.openwrt.org/doc/howto/http.overviewhttp://en.wikipedia.org/wiki/Comparison_of_lightweight_web_servers 各种web服务器之比较
2025年03月07日
6 阅读
0 评论
0 点赞
2025-03-02
Typecho模板基础制作教程:常用调用代码
这篇日志非常全面地总结了 Typecho 模板中常用的调用代码,涵盖了站点标题、文章循环、分页、文章内容、作者信息、标签、分类、评论等各个方面。对于 Typecho 新手来说,这份代码清单无疑是非常有用的,可以帮助他们快速上手并搭建出美观实用的博客网站。1站点动态标题<?php $this->archiveTitle(array( 'category'=>_t('分类 %s 下的文章'), 'search'=>_t('包含关键字 %s 的文章'), 'tag' =>_t('标签 %s 下的文章'), 'author'=>_t('%s 的主页') ), '', ' - '); ?>2站点地址,名称与描述<?php $this->options->siteUrl(); ?>//站点地址 <?php $this->options->title(); ?>//名称 <?php $this->options->description() ?>//描述3index.php文章循环输出<?php if ($this->have()): ?>//判断文章存在与否 <?php while($this->next()): ?>//开始循环 <a href="<?php $this->permalink() ?>"><?php $this->title() ?></a>//文章标题和超链接 <a href="<?php $this->author->permalink(); ?>"><?php $this->author(); ?></a>//作者名称和超链接 <?php $this->date('F j, Y'); ?>//文章发布时间 <?php $this->category(','); ?>//文章分类 <?php $this->commentsNum('%d Comments'); ?>//评论数量 <?php $this->content('Continue Reading...'); ?>//阅读全文more语法截取缩略内容(可改为<?php $this->excerpt(140,'....'); ?>自动截取前140个字符,根据需要也可以改成 <?php $this->summary(); ?新版功能,自动输出内容中第一个块级元素中的内容>) <?php endwhile; ?>//循环结束 <?php else: ?>暂无与之相关文章<?php endif; ?>//判断结束4翻页代码<?php $this->pageNav('上一页', '下一页', '5', '……'); ?>//显示多个页码的 <?php $this->pageLink('下一页','next'); ?> <?php $this->pageLink('上一页'); ?>//只显示上一页下一页5页码显示当前页码:<?php if($this->_currentPage>1) echo $this->_currentPage; else echo 1;?> 总页码:<?php echo ceil($this->getTotal() / $this->parameter->pageSize); ?>6文章全文显示<?php $this->content(); ?>7登陆判断<?php if($this->user->hasLogin()):?> 登陆才可以看到这里的内容 <?php endif;?>8文章作者名称与主页地址<a href="<?php $this->author->permalink(); ?>"><?php $this->author(); ?></a>9文章最后编辑时间<?php echo gmdate('Y-m-d H:i', $this->modified + Typecho_Widget::widget('Widget_Options')->timezone); ?>10当前文章id<?php $this->cid(); ?>11文章中的上一篇和下一篇上一篇: <?php $this->thePrev('%s','没有了'); ?> 下一篇: <?php $this->theNext('%s','没有了'); ?>12文章标签<?php $this->tags(', ', true, 'none'); ?>说明:(', ', true, 'none')第一个单引号间的逗号代表标签与标签的间隔用逗号隔开,true是标签以超链接形式输出,none为该文章没有标签时显示的提示信息。13用户昵称<?php $this->user->screenName(); ?>14后台地址与登陆地址<?php $this->options->adminUrl(); ?>//后台地址 <?php $this->options->adminUrl('login.php'); ?>//登陆地址15分类描述<?php echo $this->getDescription(); ?>16标签相关文章<?php $this->related(5)->to($relatedPosts); ?> <ul> <?php while ($relatedPosts->next()): ?> <li><a href="<?php $relatedPosts->permalink(); ?>" title="<?php $relatedPosts->title(); ?>"><?php $relatedPosts->title(); ?></a></li> <?php endwhile; ?> </ul>17调用某分类文章,pageSize是数量,mid是分类号:<?php $this->widget('Widget_Archive@index', 'pageSize=6&type=category', 'mid=47′) ->parse('<li><a href="{permalink}">{title}</a></li>'); ?>18首行缩进问题,加入css实现.post-content p{ text-indent: 2em; /*em是相对单位,2em即现在一个字大小的两倍*/ } 19最新文章<?php $this->widget('Widget_Contents_Post_Recent')->to($post); ?> <?php while($post->next()): ?> <a href=”<?php $post->permalink(); ?>” title=”<?php $post->title(); ?>”> <?php $post->title(25, '…'); ?></a> <?php endwhile; ?>20神奇的is语法<?php if ($this->is('post')) : ?> 这里就是内容了 <?php endif; ?> typecho可以使用is语法判断很多东西,比如 $this->is('index'); $this->is('archive'); $this->is('single'); $this->is('page'); $this->is('post'); $this->is('category'); $this->is('tag'); 甚至是 $this->is('category', 'default'); $this->is('page', 'start'); $this->is('post', 1); 判断为当前页的第几篇文章,并单独输出内容 <?php if ($this->sequence == 0): ?> //需要的插入 <?php endif; ?>21总访问量1) 首先,在functions.php里加入如下代码://门前大路上,走过一群小伙伴,快来数一数:2,4,6,7,8…… function theAllViews() { $db = Typecho_Db::get(); $row = $db->fetchAll('SELECT SUM(VIEWS) FROM `typecho_contents`'); echo number_format($row[0]['SUM(VIEWS)']); }2) 然后用下面代码调用:<?php echo theAllViews();?>例如:你是第<?php echo theAllViews();?>位相遇的小伙伴2网站运行时间1) PHP调用首先,在functions.php里加入如下代码:// 设置时区 date_default_timezone_set('Asia/Shanghai'); /** * 秒转时间,格式 年 月 日 时 分 秒 * */ function getBuildTime() { // 在下面按格式输入本站创建的时间 $site_create_time = strtotime('2019-06-23 00:00:00'); $time = time() - $site_create_time; if (is_numeric($time)) { $value = array( "years" => 0, "days" => 0, "hours" => 0, "minutes" => 0, "seconds" => 0, ); if ($time >= 31556926) { $value["years"] = floor($time / 31556926); $time = ($time % 31556926); } if ($time >= 86400) { $value["days"] = floor($time / 86400); $time = ($time % 86400); } if ($time >= 3600) { $value["hours"] = floor($time / 3600); $time = ($time % 3600); } if ($time >= 60) { $value["minutes"] = floor($time / 60); $time = ($time % 60); } $value["seconds"] = floor($time); echo '<span class="btime">'.$value['years']. '年'.$value['days']. '天'.$value['hours']. '小时'.$value['minutes']. '分</span>'; } else { echo ''; } }然后用下面代码调用:<?php getBuildTime(); ?>2) JS调用直接在模板文件里添加以下两种样式的任意一种样式一本站已安全运行: <span id="momk"></span> <script language=javascript> function show_date_time(){ window.setTimeout("show_date_time()", 1000); BirthDay=new Date("05-06-2016 12:12:24");//建站日期 today=new Date(); timeold=(today.getTime()-BirthDay.getTime()); sectimeold=timeold/1000 secondsold=Math.floor(sectimeold); msPerDay=24*60*60*1000 e_daysold=timeold/msPerDay daysold=Math.floor(e_daysold); e_hrsold=(daysold-e_daysold)*-24; hrsold=Math.floor(e_hrsold); e_minsold=(hrsold-e_hrsold)*-60; minsold=Math.floor((hrsold-e_hrsold)*-60); seconds=Math.floor((minsold-e_minsold)*-60); momk.innerHTML=daysold+"天"+hrsold+"小时"+minsold+"分"+seconds+"秒" ; } show_date_time(); </script> <style> #momk{animation:change 10s infinite;font-weight:800; } @keyframes change{0%{color:#5cb85c;}25%{color:#556bd8;}50%{color:#e40707;}75%{color:#66e616;}100% {color:#67bd31;}} </style>样式二<span id="momk"></span><span id="momk" style="color: #ff0000;"></span> <script type="text/javascript"> function NewDate(str) { str = str.split('-'); var date = new Date(); date.setUTCFullYear(str[0], str[1] - 1, str[2]); date.setUTCHours(0, 0, 0, 0); return date; } function momxc() { var birthDay =NewDate("2016-5-6"); var today=new Date(); var timeold=today.getTime()-birthDay.getTime(); var sectimeold=timeold/1000 var secondsold=Math.floor(sectimeold); var msPerDay=24*60*60*1000; var e_daysold=timeold/msPerDay; var daysold=Math.floor(e_daysold); var e_hrsold=(daysold-e_daysold)*-24; var hrsold=Math.floor(e_hrsold); var e_minsold=(hrsold-e_hrsold)*-60; var minsold=Math.floor((hrsold-e_hrsold)*-60); var seconds=Math.floor((minsold-e_minsold)*-60).toString(); document.getElementById("momk").innerHTML = "本站已安全运行"+daysold+"天"+hrsold+"小时"+minsold+"分"+seconds+"秒"; setTimeout(momxc, 1000); }momxc(); </script> <style> #momk{animation:change 10s infinite;font-weight:800; } @keyframes change{0%{color:
2025年03月02日
6 阅读
0 评论
0 点赞
2025-02-27
用CF和BackBlaze零成本自建图床,年度最强白嫖攻略
CF大善人就不用多介绍了,BackBlaze在云存储领域属于S3平替,10G免费,兼容S3 API,最关键的是从CF下载不占流量注册地址,信箱即可注册,无需付款BackBlaze免费账户默认存储是私有的,公开访问需要钞票。cloudflare大善人就派上用场了,我们通过worker来让它变成公开访问。1 API1 注册BackBlaze之后,创建一个Bucket。所有图片都会保存在这个bucket里面2 随便上传一个文件,点开文件之后找到S3 URL记下来。3 创建一个Application Keys,访问权限可读写。保存好Key ID和Access Key4 在cloudflare里创建一个worker,Start from a template点右边的Hello world,然后deploy5 在下个页面点Edit code,把代码贴进去,点选Deploy6 回到Worker页面,在Settings -> Variables and Secrets里添加这些配置DOWNLOAD_URL 图床地址,比如https://myhost.xyz UPLOAD_URL 图床上传API地址,比如https://myhost.xyz/upload S3_ACCESS_KEY_ID BackBlaze的Key ID S3_SECRET_ACCESS_KEY BackBlaze的Access key S3_BASE_URL 之前保存下来S3 URL的base URL,去除bucket部分,比如https://s3.us-west-004.backblazeb2.com S3_BUCKET 你创建的bucket名字 S3_REGION 在S3 base URL里面可以找到,比如us-west-0047 设置你的域名的worker route,配置myhost.xyz/*使用worker,图床API就搞定了2 上传页面1 下载压缩包,解压后把里面的文件上传到bucket里就好你可以通过 https://myhost.xyz/_3uWr_VmKwkCzVPgWBzed6xE3WDWZdrvGNLo6Xv9bpk/index.html 访问上传页面(把myhost换成你的域名)2 当你有了初始的上传页面之后,就可以上传新的上传页面了(详见FAQ)3 域名设置重要‼️在你的域名设置里面,A record或者cname可以随便设,但反向代理(小黄云)一定要打开3 FAQQ: 上传链接里的_3uWr_VmKwkCzVPgWBzed6xE3WDWZdrvGNLo6Xv9bpk太长了我记不住怎么办?A: 你可以把链接放收藏夹里。或者可以配置一个page rule来重写Q: 怎么上传成webp?A: 你可以把图片先转换成webp再上传。Q: 图床能不能设置成只有自己可以上传?A: 人还是要有点共享精神的。虽然但是,本系统支持通过混淆来实现安全,方法就是套娃。当你有了最初始的上传页面,首先在上传页面源码(压缩包里的_3uWr_VmKwkCzVPgWBzed6xE3WDWZdrvGNLo6Xv9bpk)中找到url.pathname = 'upload';, 把upload改成你的小秘密,比如upload123456,再把文件名改成index.html,通过上传页面重新上传,你就有了新的上传链接了。接下来去cf worker里面把UPLOAD_URL改成小秘密,比如https://myhost.xyz/upload123456最后去backblaze把原始页面删掉,你就有了一个看起来很安全的系统了。
2025年02月27日
10 阅读
0 评论
0 点赞
2025-02-21
mysql主从同步时mysql server-id无变化(lnmp 环境)
在 Linux 系统中使用 LNMP (Linux, Nginx, MySQL/MariaDB, PHP) 架构时,如果你发现 MySQL 服务器的 server id 没有变化,这可能是由于以下几个原因导致的:1. 配置文件未正确修改MySQL 的 server id 是在其配置文件 my.cnf 或 my.ini 中设置的。通常这个设置位于 [mysqld] 部分。确保你已经正确修改了该配置文件中的 server-id 参数。例如:[mysqld] server-id = 1注意:这个地方有个坑,lnmp默认是有规定server-id = 1,如果作为从服务器的话又在前面规定了server-id = 2,这样冲突不会生效,还是现实server-id = 1,需要把后面的server-id = 1注释掉。2. 配置文件未重新加载修改了配置文件后,需要重启 MySQL 服务或者重新加载配置,以使更改生效。你可以使用以下命令之一来重新加载配置:sudo systemctl restart mysqld或者sudo service mysql restart或者仅重新加载配置(如果支持):sudo systemctl reload mysqld或者sudo service mysql reload3. 查看当前配置你可以查看当前 MySQL 的配置来确认 server-id 是否已经更改:mysql -u root -p -e "SHOW VARIABLES LIKE 'server_id';"4. 多实例配置问题如果你在同一个服务器上运行多个 MySQL 实例,确保每个实例的 server-id 是唯一的。例如,如果你有两个实例,一个使用 server-id = 1,另一个应该使用 server-id = 2 或其他不同的值。5. 检查日志文件查看 MySQL 的日志文件,看是否有关于 server-id 的错误或警告信息,这可能会给出为什么更改未生效的线索。日志文件通常位于 /var/log/mysql/ 或 /var/log/mysqld.log。6. 使用正确的用户启动 MySQL确保你以正确的用户身份启动 MySQL 服务,通常是 mysql 或 root 用户。使用错误的用户可能会导致权限问题,从而无法正确修改配置或启动服务。按照上述步骤检查和修改后,你的 MySQL 服务器的 server-id 应该能够正确设置并变化。如果问题仍然存在,可能需要更详细地检查你的系统环境或配置文件的具体内容。
2025年02月21日
8 阅读
0 评论
0 点赞
2025-02-21
mysql 主从同步时 1040报错
在MySQL中,错误代码1040通常与主从同步过程中的一些配置或连接问题相关。这种错误可能表现为多种不同的消息,但通常涉及到从服务器无法正确连接到主服务器,或者无法正确读取主服务器的二进制日志(binlog)。以下是一些可能导致MySQL主从同步出现1040错误的常见原因及其解决方法:#1 网络问题:确保主服务器和从服务器之间的网络连接是正常的。检查防火墙设置,确保没有阻止MySQL端口(默认是3306)的通信。#2 主服务器配置问题:检查主服务器的my.cnf(或my.ini)配置文件中是否启用了二进制日志(log-bin)。确保server-id在主服务器上是唯一的,并且与从服务器不同。如果使用了bind-address,确保它不会阻止从服务器的连接。从服务器配置问题:确保从服务器的my.cnf(或my.ini)配置文件中有一个唯一的server-id。检查relay-log配置,确保没有错误。确保从服务器上的master.info和relay-log.info文件没有被错误地修改或删除。#3 连接信息错误:在从服务器上执行CHANGE MASTER TO命令时,确保提供了正确的主服务器IP地址、用户名、密码、二进制日志文件名和位置。如果使用了复制过滤(如replicate-do-db),确保它们没有阻止必要的复制事件。#4 权限问题:确保用于复制的用户在主服务器上有足够的权限,包括REPLICATION SLAVE权限。检查该用户的密码是否正确,并且没有过期或被锁定。二进制日志损坏或丢失:检查主服务器的二进制日志文件是否存在且没有损坏。如果二进制日志被删除或损坏,可能需要重新初始化复制。#5 版本不兼容:确保主服务器和从服务器上的MySQL版本是兼容的。在某些情况下,不同版本之间的不兼容可能会导致复制问题。#6 查看错误日志:查看主服务器和从服务器的MySQL错误日志,以获取更详细的错误信息。这可能会提供关于问题的更多线索。7 增加连接数在使用 MySQL 的主从复制(Master-Slave replication)过程中,遇到错误代码 1040 可能与几个不同的问题有关。错误代码 1040 通常表示“Too many connections”,这意味着你的从服务器(Slave)试图同时打开的连接数超过了其配置的最大允许连接数。要解决这个问题,你可以按照以下步骤进行:1)检查当前连接数:使用以下命令查看当前打开的连接数:SHOW STATUS LIKE 'Threads_connected';这将显示当前打开的连接数。2)查看最大连接数设置:查看并确认从服务器上的最大连接数设置:SHOW VARIABLES LIKE "max_connections";这将显示 max_connections 的当前值。默认值通常是 151,但这个值可以根据你的服务器配置进行调整。3)增加最大连接数:如果当前的连接数接近或超过了 max_connections 的值,你可以考虑增加这个值。编辑 MySQL 的配置文件(通常是 my.cnf 或 my.ini),在 [mysqld] 部分添加或修改以下行:max_connections = 1000将值设置为更高的数字,根据你的服务器资源适当调整。修改后,重启 MySQL 服务以使更改生效。4)优化 SQL 查询:检查是否有查询效率低下或频繁执行的查询,这可能导致过多的连接被打开。优化这些查询或使用连接池等技术可以减少连接需求。5)检查应用程序的连接管理:确保应用程序正确管理数据库连接。例如,使用连接池来重用连接而不是每次查询都打开新连接。6)查看错误日志:查看 MySQL 的错误日志文件,可能会有更多关于为什么有太多连接的详细信息。这可以帮助诊断问题。tail -f /var/log/mysql/mysql.log#8 重新初始化复制:如果上述步骤都无法解决问题,可能需要重新初始化复制。这通常涉及停止复制、清空从服务器上的所有数据、重新导入主服务器的数据、并重新设置复制。请注意,具体的错误消息和解决方案可能会因MySQL版本和配置的不同而有所差异。因此,在尝试解决问题时,请务必参考您正在使用的MySQL版本的官方文档。
2025年02月21日
10 阅读
0 评论
0 点赞
2025-02-18
Mysql数据多服务器同步——mysql主从服务器配置教程
0 前言针对网站采取多服务器配置和负载均衡的情况,网站文件可以采用syncthing、verysync之类的同步软件实现同步更新,但针对mysql如果直接采用直接复制数据库文件则会存在权限和报错问题,这个时候就需要配置主从mysql服务器了,让从服务器复制主服务器的数据。首先我们针对该问题咨询了deepseek,deepseek给出如下提示: 嗯,用户想要配置MySQL的主从服务器,我得先理清楚步骤。主从复制通常用于数据备份、负载均衡或者高可用性,对吧?首先需要确认用户使用的是哪个MySQL版本,不过可能不同版本的步骤类似,但最好还是提一下版本兼容性。接下来,主服务器的配置。用户可能需要修改my.cnf或者my.ini文件,启用二进制日志,设置唯一的server-id。然后创建用于复制的账户,赋予REPLICATION SLAVE权限。之后需要锁定数据库,导出数据,记录当前的二进制日志位置。这部分可能会遇到问题,比如用户可能不知道如何找到正确的日志文件和位置,或者忘记锁定导致数据不一致。然后是配置从服务器。同样需要修改配置文件,设置不同的server-id,可能还要配置中继日志的位置。用户可能在这里出错,比如server-id和主服务器重复,或者路径配置不正确。之后需要导入主服务器的数据备份,这一步如果备份文件很大,可能需要较长时间,或者导入时出现权限问题。设置主从连接的时候,用户需要在从服务器上执行CHANGE MASTER TO命令,输入正确的主库IP、端口、用户名、密码以及日志文件和位置。这里常见的错误是输入信息错误,比如密码不对,或者主服务器的防火墙阻止了连接。启动从服务器复制后,需要检查Slave_IO_Running和Slave_SQL_Running的状态是否为Yes,如果有错误,可能需要查看错误日志来排查。可能的故障点包括网络问题导致主从无法通信,主库的二进制日志没有开启,server-id冲突,或者时间不同步。用户可能还会遇到复制延迟的问题,或者主库有写操作而没使用事务导致数据不一致。需要提醒用户定期检查复制状态,处理可能出现的错误。此外,用户可能需要配置更复杂的拓扑结构,比如链式复制或者多主复制,但基础的主从配置是这些的基础。安全方面也要注意,复制账户的权限应该仅限于复制,避免使用高权限账户。另外,备份和恢复策略也是必要的,以防配置过程中出现数据丢失。最后,应该总结一下步骤,确保用户能一步步跟随操作,并提醒常见问题和解决方法。可能还需要给出一些常用的SQL命令示例,比如SHOW MASTER STATUS和SHOW SLAVE STATUS,这样用户可以直接复制粘贴使用。如果用户的环境有特殊需求,比如云服务器或者不同操作系统,可能还需要调整部分步骤,比如配置文件的位置或者服务的重启命令。1 环境配置1)主服务器(Master):IP 地址 192.168.1.100 2)从服务器(Slave):IP 地址 192.168.1.200 3)MySQL 版本:建议主从服务器版本一致(如 MySQL 5.7/8.0) 4)确保主从网络互通,防火墙开放 3306 端口。2 主服务器(Master)配置1) 修改 MySQL 配置文件(1)编辑 my.cnf(路径一般为 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf):[mysqld] server-id = 1 # 唯一ID,主从不能重复 log-bin = mysql-bin # 开启二进制日志 binlog_format = ROW # 推荐使用ROW格式 expire_logs_days = 7 # 日志保留天数 max_binlog_size = 100M # 单个日志文件大小 # 可选:指定同步的数据库(不配置则默认同步所有) # binlog_do_db = db_name(2)重启 MySQL 服务service mysql restart或systemctl restart mysqld用lnmp的也可以用lnmp mysql restart来启动2) 创建复制专用账号登录 MySQL,创建用于复制的用户:CREATE USER 'repl'@'192.168.1.200' IDENTIFIED BY 'Repl_Password123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.200'; FLUSH PRIVILEGES;3)备份主库数据并记录日志位置(1)锁定数据库(防止写入变动):FLUSH TABLES WITH READ LOCK;(2)查看二进制日志状态(记录 File 和 Position)SHOW MASTER STATUS;(3)输出示例+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 107 | | | +------------------+----------+--------------+------------------+(4)保持当前窗口不关闭,新开终端备份数据mysqldump -u root -p --all-databases --master-data > master_db.sql(5)解锁数据库UNLOCK TABLES;3 从服务器(Slave)配置1)修改 MySQL 配置文件(1)编辑 my.cnf:[mysqld] server-id = 2 # 唯一ID,不能与主服务器相同 relay-log = mysql-relay-bin # 中继日志 read_only = 1 # 从库只读(确保数据安全)(2)重启 MySQL 服务systemctl restart mysqld2)导入主库备份数据将 master_db.sql 复制到从服务器,并导入mysql -u root -p < master_db.sql3)配置主从复制连接登录从服务器 MySQL,执行CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='Repl_Password123!', MASTER_LOG_FILE='mysql-bin.000001', -- 主库记录的File MASTER_LOG_POS=107; -- 主库记录的Position启动复制:START SLAVE;4 验证主从同步1)检查从服务器状态SHOW SLAVE STATUS\G关注以下字段:Slave_IO_Running: YesSlave_SQL_Running: YesSeconds_Behind_Master: 0(表示无延迟)2)测试数据同步在主库创建表或插入数据,观察从库是否同步。5 常见问题解决1)主从连接失败检查网络:确保主从 3306 端口互通。验证账号权限:确认 repl 用户权限和密码正确。查看错误日志:tail -f /var/log/mysqld.log2)主从数据不一致重新初始化:从库停止复制,重新导入主库完整备份。跳过错误(谨慎使用):STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;3)二进制日志问题主库未开启 log-bin,或 server-id 重复。6 扩展配置GTID 复制:在 MySQL 5.6+ 启用 GTID 简化故障转移。半同步复制:确保主库事务至少传输到一个从库。多主复制:配置双主架构(需处理冲突)。完成上述操作后,主从服务器已配置成功。还需要定期监控 SHOW SLAVE STATUS 确保复制健康。
2025年02月18日
12 阅读
0 评论
0 点赞
2025-02-14
替换typecho博客joe主题搜索框为google搜索框
之前把typecho的首页生成静态后,经常出现搜索框输入关键词但搜索不正常的问题,于是想着用google搜索代替默认搜索框,网上没找到教程,于是自己动手,这里记录一下。1 获取google搜索代码1 有adsense推广账号的情况可以访问官网1.登录您的 AdSense 账号。 2.点击广告。 3.点击“按广告单元”。 4.点击搜索引擎。 注意:如果您没有看到“搜索引擎”选项,则表示您目前不符合相关条件。 为您的搜索引擎命名。 5.选择您搜索引擎的搜索范围:是搜索整个网络,还是仅搜索您列出的特定网站。 6.如果您想通过展示搜索广告获得收入,请启用通过放置在搜索结果中的广告获得收入。 7.点击创建。 8.复制代码并将其粘贴到您希望显示搜索框的网页的 <body> 与 <body/> 标记之间。 9.点击完成。2 无adsense推广账号的情况如果您想为自己的搜索引擎使用更多自定义选项,可以采用可编程搜索引擎提供的高级功能。例如,您可以使用这些选项来更改搜索引擎的外观风格。详细了解可编程搜索引擎的高级功能。添加搜索引擎后点获取代码即可,最终获取到如下的搜索代码(86fa94bde97ca4363需要改为你获取到的代码)<script async src="https://cse.google.com/cse.js?cx=86fa94bde97ca4363"> </script> <div class="gcse-search"></div>2 找到JOE定义搜索的代码一般在usr/themes/Joe/public/header.php,有两个form地方替换:1 第一处替换 <form class="joe_header__above-search" method="post" action="<?php $this->options->siteUrl(); ?>"> <input maxlength="16" autocomplete="off" placeholder="请输入关键字..." name="s" value="<?php echo $this->is('search') ? $this->archiveTitle(' » ', '', '') : '' ?>" class="input" type="text" /> <button type="submit" class="submit">Search</button> <span class="icon"></span> <nav class="result"> <?php $this->widget('Widget_Contents_Hot@Search', 'pageSize=5')->to($item); ?> <?php $index = 1; ?> <?php while ($item->next()) : ?> <a href="<?php $item->permalink(); ?>" title="<?php $item->title(); ?>" class="item"> <span class="sort"><?php echo $index; ?></span> <span class="text"><?php $item->title(); ?></span> <span class="views"><?php echo number_format($item->views); ?> 阅读</span> </a> <?php $index++; ?> <?php endwhile; ?> </nav> </form>2 第2处替换<form class="search" method="post" action="<?php $this->options->siteUrl(); ?>"> <input maxlength="16" autocomplete="off" placeholder="请输入关键字..." name="s" value="<?php echo $this->is('search') ? $this->archiveTitle(' » ', '', '') : '' ?>" class="input" type="text" /> <button type="submit" class="submit">Search</button> </form>将上述代码替换成<div class="joe_header__above-search"> <script async src="https://cse.google.com/cse.js?cx=86fa94bde97ca4363"></script> <div class="gcse-search"></div> </div>3 不出意外的话可以马上看到搜索框变为google搜索框了演示地址
2025年02月14日
15 阅读
1 评论
0 点赞
1
2
...
9