腾讯云轻量服务器免费升配操作教程
腾讯云轻量应用服务器,1核2G内存5M峰值带宽1T流量包,学生认证后仅需9元/月! 可以认证后购买一年,再续费3年。 然后参加活动,免费升级成2核4G内存6M峰值带宽。总共需要432块钱。并且目前学生认证随便填写哦! 抓...
腾讯云轻量应用服务器,1核2G内存5M峰值带宽1T流量包,学生认证后仅需9元/月! 可以认证后购买一年,再续费3年。 然后参加活动,免费升级成2核4G内存6M峰值带宽。总共需要432块钱。并且目前学生认证随便填写哦! 抓...
腾讯云轻量服务器真的是一款倍受大家吹捧的一款服务器,因为他的海外地区(香港,新加坡,硅谷)的带宽直接比国内翻十倍,而且价格反而更低,拥有着30M带宽,可以满足我们的绝大多数需求,不仅可以建站还可以做 =-= 你懂的,而且线路非常的好,在大陆...
腾讯云有个特色就是每天都会有4场限时秒杀活动,分别为08:00 , 13:00 ,16:00 , 19:00,每场的服务器地域配置各不相同,有北京上海地区,也有香港等海外地区,价格都是非常的便宜,基础配置甚至都地址两位数每年。有想要建站的朋...
UCloud (优刻得科技股份有限公司)是中立、安全的云计算服务平台,坚持中立,不涉足客户业务领域。公司自主研发IaaS、PaaS、大数据流通平台、AI服务平台等一系列云计算产品,并深入了解互联网、传统企业在不同场景下的业务需求,提供公有云...
腾讯云最近也出了活动,香港轻量服务器,腾讯云香港轻量服务器测试ip,1核心/1G/30M带宽/1T流量,才24元/月,这是要和阿里云对着干的呀,这款服务器真的是初级全能服务器,无论是要建个小站还是搭建个什么特殊服务都是绰绰有余的,而且大厂稳...
KVMCloud是一家新开的国人服务器厂商,主营有云服务器、虚拟主机、IDC独立服务器与SSL证书部署服务,有高速CN2回国线路,香港NTT,以及百度CDN的白金级分销专业版一年只需1180,官网价格:1590元 这款为特价款,放个小站还是...
极光KVM八月:清凉一夏活动,现已发布, 八月,三伏天,让利30%,全场30OFF立享七折! 优惠码:30OFF 极光互联官网 点击进入 七折立享,适用于全场任意产品,续费同价。 另有特别活动,优惠码见下方套餐: 美西CN2:洛杉矶CN2 ...
酷锐云是一家国人VPS主机商,成立于2019年,主要销售云服务器即VPS业务、挂机宝业务。数据中心包括美国圣何塞、香港安畅、香港沙田GIA等线路,均是目前比较热门的优选线路。另外还有大连BGP,圣何塞为CN2-GIA线路,提供单机10G天机...
商家介绍: 金斗云是一家新成立的主机服务商,是我家门口的主机商,位置在吉林省长春市绿园区明翰国际2022室;就在我家门口,如果服务器有什么问题可以找我,我去公司去给你解决 哈哈哈 !率属于吉林省印象云网络科技有限公司旗下,主营业务为美国圣何...
iON Cloud是Krypt在2019年8月份上线的一个VPS子品牌,主营VPS服务。目前上线了洛杉矶CN2 GT线路和新加坡PCCW、新加坡CN2线路、香港、圣何塞等线路,中国大陆速度优秀。 ION官网 经过万万测试 圣何塞得线路非常得...
kvmla年前新开的新加坡机房机柜经过半个多月的测试已经就位正式开始上线促销销售: (1)新加坡云服务器,100Mbps带宽,CN2网络,一律8折优惠; (2)新加坡两款独立服务器,CN2网络,7.5折促销; (3)香港沙田CN2 2核心免...
修罗云是于2019年新成立的国人商家,主要提供洛杉矶CN2 KVM VPS、香港CMI KVM VPS、洛杉矶虚拟主机等。现在推出美西三网GIA & 香港CN2 建站区七折优惠。CERA机房,三网 CN2 GIA ,季付送内存 51...
UCloud (优刻得科技股份有限公司)是中立、安全的云计算服务平台,坚持中立,不涉足客户业务领域。公司自主研发IaaS、PaaS、大数据流通平台、AI服务平台等一系列云计算产品,并深入了解互联网、传统企业在不同场景下的业务需求,提供公有云...
极光KVM主打高性价比VPS产品,成立2年有余, 美西CN2_GIA,提供专线级高质量网络接入,月均15元起, 全新推出的美西直连产品,提供大带宽接入,高防不绕路,月均10元起 极光互联官网 点击进入 美西CN2:洛杉矶CN2 GIA专线,...
阿里云的突发性能T5是一款性价比非常高的机器,价格不贵,而且突发性能很强。利用率低的时候回自动增长积分,利用积分可以实现突发性能,使得性能在短时间内 超出你服务器的配置。 上面就是阿里云突发性能t5对新用户的价格,可以说非常的便宜了,一年才...
很奇怪,今天突然发现WordPress Redis Object Cache缓存插件报错无法连接到Redis了。
具体报错如下图:
以为是 Redis 容器挂了,到主机上 tcping 了下 127.0.0.1 的 6379 端口,发现是通着的,顿时陷入了沉思······
来吧,老样子,介绍下环境:
查了半天,PHP Redis插件、redis容器运行状态及日志、php日志、OpenResty日志,都没发现问题······
最终排查出可能是因为插件自动升级的原因,导致原来插件的配置文件被覆盖成默认了,默认Redis服务地址为:127.0.0.1,传统环境下是没问题的,但是我们的 PHP 是 docker 容器化部署的,这就有问题了,如果填写 127.0.0.1 的话,去尝试连接的则是 PHP 容器内的127地址,所以肯定无法连接,那么我们把此地址改为容器名即可正常与Redis容器内应用通信,详细操作方法如下:
位置在网站根目录下的:/wp-content/plugins/redis-cache/includes/object-cache.php
默认为:
protected function build_parameters() {
$parameters = [
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
'timeout' => 1,
'read_timeout' => 1,
'retry_interval' => null,
'persistent' => false,
];
修改为:
protected function build_parameters() {
$parameters = [
'scheme' => 'tcp',
'host' => '1Panel-redis-kKCk',
'port' => 6379,
'database' => 0,
'password' => 'password',
'timeout' => 1,
'read_timeout' => 1,
'retry_interval' => null,
'persistent' => false,
];
修改涉及两处:
位置在网站根目录下:/wp-config.php
在最下方添加如下代码:
/** Redis Object Cache */
define( 'WP_REDIS_HOST', '1Panel-redis-kKCk' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_PASSWORD', 'password' );/** Redis设置了密码时填写 */
保存。
之后回到 WordPress 控制台插件处刷新界面,开启即可。
因为可以理解为Docker默认内置了一个小型DNS服务器,记录了容器名和容器IP地址的对应的对应关系,所以可以直接通过主机名进行通信。
想看看?这样:
列出我们docker的网卡,找出容器在使用的,记录下来,比如:1panel-network
docker network ls
docker network inspect 1panel-network
可以看到,这里就记录着我们Docker容器名和容器IP的对应关系。
由于腾讯文档是在线应用,腾讯可能随时对应用进行更新,有的时候发现用着用着突然就变样子了,常用的功能突然找不到了,不知道被挪到哪里去了······
最新的位置在:插入-->行列-->行高列宽-->自动调整行高列宽
这么常用的功能不知为何被藏得这么深~
登录此地址:dash.cloudflare.com
登录后进入如下界面,如图:
Worker 每天每免费账号有次数限制,为10万次。每分钟为1000次。完全够用了。
因为Cloudflare workers的域名workers.dev DNS被污染了,国内无法访,所以我们要有自己的域名。
选择free即可
点击开始快速扫描
比如,我的域名是在阿里云购买的,就需要到阿里云控制台修改默认的阿里DNS服务器地址为Cloudflare的地址。
切换域名的DNS服务器可能需要等待一会儿,完成后我们会收到邮件,我先去尿个尿~
尿完回来已经完成了,我们继续~
自定义一个worker名称,这里叫docker-porxy,然后点击部署。
点击可以预览我们的项目,如下显示表示已经部署成功。
点击页面的编辑代码,输入如下js代码。(代码来源:cmliu/CF-Workers-docker.io: 这个项目是一个基于 Cloudflare Workers 的 Docker 镜像代理工具。它能够中转对 Docker 官方镜像仓库的请求,解决一些访问限制和加速访问的问题。 (github.com))
注意:代码中 “你的域名” 替换为刚才生成的域名:“docker-proxy.1943483088.workers.dev”
// _worker.js
// Docker镜像仓库主机地址
let hub_host = 'registry-1.docker.io'
// Docker认证服务器地址
const auth_url = 'https://auth.docker.io'
// 自定义的工作服务器地址
let workers_url = 'https://你的域名'
// 根据主机名选择对应的上游地址
function routeByHosts(host) {
// 定义路由表
const routes = {
// 生产环境
"quay": "quay.io",
"gcr": "gcr.io",
"k8s-gcr": "k8s.gcr.io",
"k8s": "registry.k8s.io",
"ghcr": "ghcr.io",
"cloudsmith": "docker.cloudsmith.io",
// 测试环境
"test": "registry-1.docker.io",
};
if (host in routes) return [ routes[host], false ];
else return [ hub_host, true ];
}
/** @type {RequestInit} */
const PREFLIGHT_INIT = {
// 预检请求配置
headers: new Headers({
'access-control-allow-origin': '*', // 允许所有来源
'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS', // 允许的HTTP方法
'access-control-max-age': '1728000', // 预检请求的缓存时间
}),
}
/**
* 构造响应
* @param {any} body 响应体
* @param {number} status 响应状态码
* @param {Object<string, string>} headers 响应头
*/
function makeRes(body, status = 200, headers = {}) {
headers['access-control-allow-origin'] = '*' // 允许所有来源
return new Response(body, { status, headers }) // 返回新构造的响应
}
/**
* 构造新的URL对象
* @param {string} urlStr URL字符串
*/
function newUrl(urlStr) {
try {
return new URL(urlStr) // 尝试构造新的URL对象
} catch (err) {
return null // 构造失败返回null
}
}
function isUUID(uuid) {
// 定义一个正则表达式来匹配 UUID 格式
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
// 使用正则表达式测试 UUID 字符串
return uuidRegex.test(uuid);
}
async function nginx() {
const text = `
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
`
return text ;
}
export default {
async fetch(request, env, ctx) {
const getReqHeader = (key) => request.headers.get(key); // 获取请求头
let url = new URL(request.url); // 解析请求URL
workers_url = `https://${url.hostname}`;
const pathname = url.pathname;
const hostname = url.searchParams.get('hubhost') || url.hostname;
const hostTop = hostname.split('.')[0];// 获取主机名的第一部分
const checkHost = routeByHosts(hostTop);
hub_host = checkHost[0]; // 获取上游地址
const fakePage = checkHost[1];
console.log(`域名头部: ${hostTop}\n反代地址: ${hub_host}\n伪装首页: ${fakePage}`);
const isUuid = isUUID(pathname.split('/')[1].split('/')[0]);
const conditions = [
isUuid,
pathname.includes('/_'),
pathname.includes('/r'),
pathname.includes('/v2/user'),
pathname.includes('/v2/orgs'),
pathname.includes('/v2/_catalog'),
pathname.includes('/v2/categories'),
pathname.includes('/v2/feature-flags'),
pathname.includes('search'),
pathname.includes('source'),
pathname === '/',
pathname === '/favicon.ico',
pathname === '/auth/profile',
];
if (conditions.some(condition => condition) && (fakePage === true || hostTop == 'docker')) {
if (env.URL302){
return Response.redirect(env.URL302, 302);
} else if (env.URL){
if (env.URL.toLowerCase() == 'nginx'){
//首页改成一个nginx伪装页
return new Response(await nginx(), {
headers: {
'Content-Type': 'text/html; charset=UTF-8',
},
});
} else return fetch(new Request(env.URL, request));
}
const newUrl = new URL("https://registry.hub.docker.com" + pathname + url.search);
// 复制原始请求的标头
const headers = new Headers(request.headers);
// 确保 Host 头部被替换为 hub.docker.com
headers.set('Host', 'registry.hub.docker.com');
const newRequest = new Request(newUrl, {
method: request.method,
headers: headers,
body: request.method !== 'GET' && request.method !== 'HEAD' ? await request.blob() : null,
redirect: 'follow'
});
return fetch(newRequest);
}
// 修改包含 %2F 和 %3A 的请求
if (!/%2F/.test(url.search) && /%3A/.test(url.toString())) {
let modifiedUrl = url.toString().replace(/%3A(?=.*?&)/, '%3Alibrary%2F');
url = new URL(modifiedUrl);
console.log(`handle_url: ${url}`)
}
// 处理token请求
if (url.pathname.includes('/token')) {
let token_parameter = {
headers: {
'Host': 'auth.docker.io',
'User-Agent': getReqHeader("User-Agent"),
'Accept': getReqHeader("Accept"),
'Accept-Language': getReqHeader("Accept-Language"),
'Accept-Encoding': getReqHeader("Accept-Encoding"),
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0'
}
};
let token_url = auth_url + url.pathname + url.search
return fetch(new Request(token_url, request), token_parameter)
}
// 修改 /v2/ 请求路径
if (/^\/v2\/[^/]+\/[^/]+\/[^/]+$/.test(url.pathname) && !/^\/v2\/library/.test(url.pathname)) {
url.pathname = url.pathname.replace(/\/v2\//, '/v2/library/');
console.log(`modified_url: ${url.pathname}`)
}
// 更改请求的主机名
url.hostname = hub_host;
// 构造请求参数
let parameter = {
headers: {
'Host': hub_host,
'User-Agent': getReqHeader("User-Agent"),
'Accept': getReqHeader("Accept"),
'Accept-Language': getReqHeader("Accept-Language"),
'Accept-Encoding': getReqHeader("Accept-Encoding"),
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0'
},
cacheTtl: 3600 // 缓存时间
};
// 添加Authorization头
if (request.headers.has("Authorization")) {
parameter.headers.Authorization = getReqHeader("Authorization");
}
// 发起请求并处理响应
let original_response = await fetch(new Request(url, request), parameter)
let original_response_clone = original_response.clone();
let original_text = original_response_clone.body;
let response_headers = original_response.headers;
let new_response_headers = new Headers(response_headers);
let status = original_response.status;
// 修改 Www-Authenticate 头
if (new_response_headers.get("Www-Authenticate")) {
let auth = new_response_headers.get("Www-Authenticate");
let re = new RegExp(auth_url, 'g');
new_response_headers.set("Www-Authenticate", response_headers.get("Www-Authenticate").replace(re, workers_url));
}
// 处理重定向
if (new_response_headers.get("Location")) {
return httpHandler(request, new_response_headers.get("Location"))
}
// 返回修改后的响应
let response = new Response(original_text, {
status,
headers: new_response_headers
})
return response;
}
};
/**
* 处理HTTP请求
* @param {Request} req 请求对象
* @param {string} pathname 请求路径
*/
function httpHandler(req, pathname) {
const reqHdrRaw = req.headers
// 处理预检请求
if (req.method === 'OPTIONS' &&
reqHdrRaw.has('access-control-request-headers')
) {
return new Response(null, PREFLIGHT_INIT)
}
let rawLen = ''
const reqHdrNew = new Headers(reqHdrRaw)
const refer = reqHdrNew.get('referer')
let urlStr = pathname
const urlObj = newUrl(urlStr)
/** @type {RequestInit} */
const reqInit = {
method: req.method,
headers: reqHdrNew,
redirect: 'follow',
body: req.body
}
return proxy(urlObj, reqInit, rawLen)
}
/**
* 代理请求
* @param {URL} urlObj URL对象
* @param {RequestInit} reqInit 请求初始化对象
* @param {string} rawLen 原始长度
*/
async function proxy(urlObj, reqInit, rawLen) {
const res = await fetch(urlObj.href, reqInit)
const resHdrOld = res.headers
const resHdrNew = new Headers(resHdrOld)
// 验证长度
if (rawLen) {
const newLen = resHdrOld.get('content-length') || ''
const badLen = (rawLen !== newLen)
if (badLen) {
return makeRes(res.body, 400, {
'--error': `bad len: ${newLen}, except: ${rawLen}`,
'access-control-expose-headers': '--error',
})
}
}
const status = res.status
resHdrNew.set('access-control-expose-headers', '*')
resHdrNew.set('access-control-allow-origin', '*')
resHdrNew.set('Cache-Control', 'max-age=1500')
// 删除不必要的头
resHdrNew.delete('content-security-policy')
resHdrNew.delete('content-security-policy-report-only')
resHdrNew.delete('clear-site-data')
return new Response(res.body, {
status,
headers: resHdrNew
})
}
点击保存并部署。
我们可以自定义一个二级域名,一级域名必须是我们托管在了Cloudflare的。如果域名已经托管至Cloudflare,会自动弹出预览DNS记录;点击添加自定义域。
#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.wanpeng.top"]
}
docker pull docker.wanpeng.top/library/alpine:latest # 拉取 library 镜像
docker pull docker.wanpeng.top/coredns/coredns:latest # 拉取 coredns 镜像
速度还不错,能跑百兆!成功!
如果自己有国外的服务器,可以搭建个私人的镜像仓库,也可以中转拉取镜像的流量,可以参考我写的另一篇文章:搭建自己的Docker镜像加速服务:使用1Panel部署Docker Registry缓存镜像 (wanpeng.life)
https://docker.wanpeng.top
#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.wanpeng.top"]
}
修改完成后重启Docker服务
systemctl restart docker
docker pull docker.wanpeng.top/library/alpine:latest # 拉取 library 镜像
docker pull docker.wanpeng.top/coredns/coredns:latest # 拉取 coredns 镜像
1. 搭建自己的Docker镜像加速服务:使用1Panel部署Docker Registry缓存镜像 (wanpeng.life)
2. Cloudflare Workers搭建docker镜像加速服务 将域名解析托管到Cloudflare实现自定义加速服务域名 无限流量 (wanpeng.life)
阿里云漏洞库 (aliyun.com)介绍了相关漏洞描述、影响范围、处理建议等。
ssh -V
OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022
在影响范围:8.5p1 <= OpenSSH < 9.8p1之内
rpm -qa |grep openssh
sudo dnf --refresh upgrade openssh -y
rpm -qa | grep openssh
版本包版本已经升级到 xxxx.2.xxx版本,此版本已解决此漏洞。
完成!
官方修复文档:AlmaLinux OS - Forever-Free Enterprise-Grade Operating System
之前部署过一个开源的中文Linux命令查询工具,非常的好用:
然后为了从此工具界面把一些流量吸引到主站点上,所以想着修改下HTML代码,加上如上图的内容,index.html手动顺利添加上了,但是发现,每个命令的讲解界面都是单独的HTML文件,一共600多个,这要是手动修改人都改麻了,于是有了今天的内容,使用Python脚本批量修改,每行都写了注释,供大家参考和修改。
import os
# 定义目录路径
directory = '/path/to/your/html/files' # 替换为你的HTML文件目录路径
# 要添加的标题行
new_line = '<h2><a target="_blank" href="https://www.wanpeng.life/">更多技术类博文可访问博客:万万没想到</a></h2>\n'
# 要匹配的行
target_line = '<a target="_blank" href="https://github.com/jaywcjlove/linux-command/new/master/command">添加命令</a> |'
# 遍历目录下的所有HTML文件
for filename in os.listdir(directory):
# 检查文件是否为HTML文件
if filename.endswith('.html'):
# 获取文件的完整路径
filepath = os.path.join(directory, filename)
# 读取文件内容
with open(filepath, 'r', encoding='utf-8') as file:
lines = file.readlines() # 逐行读取文件内容
# 重新写入文件内容,并在匹配行上面添加新行
with open(filepath, 'w', encoding='utf-8') as file:
for line in lines:
# 如果匹配到目标行,则在其上面添加新行
if target_line in line:
file.write(new_line) # 在目标行上面添加新的标题行
# 无论是否匹配,都写入原文件内容
file.write(line)
print("批量修改完成!") # 打印完成信息
不到1s,600多个文件就都修改完了
经过测试,各个页面也都成功加上了链接,成功!