年轻人的第一台 VPS 代理服务器 - 资源荟萃 ／ 资源荟萃, Lv1 - LINUX DO
年轻人的第一台 VPS 代理服务器 - 资源荟萃 ／ 资源荟萃, Lv1 - LINUX DO年轻人的第一台 VPS 代理服务器 - 资源荟萃 / 资源荟萃, Lv1 - LINUX DO - LINUX DOhttps://linux.do/t/topic/333976免责声明 本文涉及的任何解锁和解密分析脚本仅用于资源共享和学习研究，不能保证其合法性，准确性，完整性和有效性，请根据情况自行判断。 间接使用脚本的任何用户，包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 本文作者对于由此引起的任何隐私泄漏或其他后果概不负责。 请勿将本文内的任何内容用于商业或非法目的，否则后果自负。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利，则应及时通知并提供身份证明，所有权证明，我将在收到认证文件后删除相关脚本。 对任何本文中包含的脚本在使用中可能出现的问题概不负责，包括但不限于由任何脚本错误导致的任何损失或损害． 您必须在下载后的24小时内从计算机或手机中完全删除以上内容。 任何以任何方式查看此项目的人或直接或间接使用该项目的任何脚本的使用者都应仔细阅读此声明。本文作者保留随时更改或补充此免责声明的权利。一旦使用并复制了任何本文相关脚本或其他内容，则视为您已接受此免责声明。 实现的功能 搭建一个稳定的代理服务器。 提供便捷的订阅转换服务，便于分享节点信息。可供 3-4 人使用。 能够访问 ChatGP...2026-02-06 11:21​由 linglong 发布于 2025 年 1月 9 日 ![](assets/729063_2-20260206112156-wt7fpp8.png)[https://linux.do/u/linglong](https://linux.do/u/linglong) 免责声明本文涉及的任何解锁和解密分析脚本仅用于资源共享和学习研究，不能保证其合法性，准确性，完整性和有效性，请根据情况自行判断。间接使用脚本的任何用户，包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 本文作者对于由此引起的任何隐私泄漏或其他后果概不负责。请勿将本文内的任何内容用于商业或非法目的，否则后果自负。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利，则应及时通知并提供身份证明，所有权证明，我将在收到认证文件后删除相关脚本。对任何本文中包含的脚本在使用中可能出现的问题概不负责，包括但不限于由任何脚本错误导致的任何损失或损害．您必须在下载后的24小时内从计算机或手机中完全删除以上内容。任何以任何方式查看此项目的人或直接或间接使用该项目的任何脚本的使用者都应仔细阅读此声明。本文作者保留随时更改或补充此免责声明的权利。一旦使用并复制了任何本文相关脚本或其他内容，则视为您已接受此免责声明。实现的功能搭建一个稳定的代理服务器。提供便捷的订阅转换服务，便于分享节点信息。可供 3-4 人使用。能够访问 ChatGPT，VPS 的 IP 最好是原生 IP，访问一些特殊网站时不会被 block。提供的对外服务要够安全。例如，xray 面板需要以 TLS 加密访问，不能 http 裸奔在公网、SSH 服务更改端口，限制 root 用户登陆、节点使用当前较为安全的的协议等。有 IPV6，平时有使用 BT、 PT 的需求。基于上述功能，本教程搭建的 VPS 有如下特点：选用原生 IP 的 VPS 提供商，价格在 20 刀一年左右。能解锁 GPT。购买域名，使用 cloudflare 解析 DNS，申请 TLS 证书，使得域名能够提供 https 安全访问。使用 nginx 分流、反代本服务器上的代理服务、订阅服务、伪装服务。使用 x-ui 面板搭建 vless+tls+vision 节点；搭建 hysteria2 节点。搭建 sub-store，提供前后端订阅转换、分享服务，提供第三方网盘、glist 同步服务。本教程并非面向纯小白用户，如果你对基础的 Linux 命令不懂，对简单计算机网络知识不懂，建议不要尝试。如果你真的想尝试，并且愿意花时间学习，可以先购买机场，完成科学上网第一步。在 youtube 上学习科学上网基本知识，推荐不良林：www.youtube.com/@bulianglin再结合 Project X 项目的文档 小小白白话文 对照阅读。遇到不明白的知识去问 GPT，大概率能得到一个清晰的答案；或者 google 搜索对应知识。本教程在 Linux 系统下完成。前期准备购买域名域名一般都推荐 namesilo，购买一些便宜点的域名，例如 top，一年只要不到 2 美金，续费基本在 5 美金左右。如果嫌续费贵，大可以在到期以后，重新买一个便宜域名，然后再更新 DNS 解析，和节点信息。购买后需要将 DNS 服务换成 Cloudflare，参考：Namesilo/Cloudflare 域名注册和解析设置教程，便于后续申请 TLS 证书。申请合法的 TLS 证书非常重要，避免你的 VPS 用 http 访问，数据裸奔在公网，指不定哪天就被黑了。DNS 解析当你购买域名，并按照上述参考将域名解析托管到 clouflare 后，就可以设置 DNS 解析了。你可以设置无限多的三级域名，解析到不同的 IP，用作不同的用途。需要注意，这里有一个代理状态栏，如果开启代理，则解析 DNS 时，会解析到 cloudflare 的 CDN IP，而不是自己设置的服务器 IP。该 CDN 会转发请求到服务器，但默认只会转发 443 端口的内容，不过你可以设置 Origin Rules 在 CDN 转发时，转发到服务器指定的端口上。后续的节点搭建会要求设置不同的三级域名，解析到服务器 IP，以识别不同的服务。有一些不需要设置代理，有一些则需要设置代理以提高服务的安全性。购买 VPS经典的 VPS 推荐环节，但由于咱们的情况特殊，一旦有人推荐一些好用的 VPS，或者可以薅羊毛的 VPS，不出多久，就会有大量的用户滥用，导致原有的用户体验下降，或者 IP 段被 GFW 特殊照顾。因此，不给出目前自用的 VPS 推荐。也不给 VPS 长期购买建议。补充：这个网站 vpsIs 罗列了许多VPS 厂家，以及其目前的订购费用，可以按需自选。此处仅仅列出一些目前比较有名的境外 VPS 厂家：BandwagonHost，板瓦工，国内出名的厂家，用的人很多，所以普通线路的质量可能会差点（没用过，仅供参考），C2N 线路的据说速度很快。IP 被封可以给钱换机器。普通机器 50​:💲: 一年，对于个人用户来说小贵。VULTR，小时计费，速度一般，可以用来练手，ip 被封可以直接删除实例，重开一台其他地方的机器。便宜的大概 6​:💲:一月，也有 3、4​:💲:一月的，但几乎买不到。RackNerd，最近两年好像很火，也属于便宜的那一档。CloudCone，了解不多。DMIT，了解不多。除了费用、网络质量外，我们还需要关心：是否有 ipv6、是否支持 GPT 访问（网页端、移动端）。IPV6 一般都会提供，不需要额外费用。但是否支持 GPT 则是看 IP 是否“安全”。主要指的是 风控值，例如之前我在 vultr 购买的波兰服务器现在使用的机器所以，vultr 的波兰 VPS 只支持网页端访问，还会经常弹出 cloudflare 的人机验证。而现在的机器直接可以支持 app 访问。当然 GPT 是否能访问也根据地区有关，我没有仔细测试过，只是说明，在挑选 VPS 的时候尽可能的在网上搜索看看是否支持 GPT 的访问。当然，如果你购买的机器不支持，也可以通过 warp 等手段解锁。安装终端软件如果你也用 Linux，可以略过这一步。使用 windows 的用户推荐安装 termius（全平台可用），免费功能足够了。ssh 登陆，sftp 传输文件非常方便，并且 UI 很好看。其也有移动端 app，我有时会通过手机端登陆上服务器看看情况。官网地址：termius.com/方案选择经过对目前主流的代理协议调查，决定同时搭建两种协议：hysteria2、vless+vision。前者基于 udp 传输、伪装成 http3 流量；后者则是为了解决 tls in tls 问题而推出的一种缓解该特征的方式。只能保证当前时刻，两者用来代理是稳定的。声明：没有最好的协议，只有最适合自己的协议。在搭建上述两种协议时，涉及到 x-ui 面版和 nginx 的使用。为了使服务尽可能的稳定，x-ui 面板启用 https，而 hysteria2 需要在 80 和 443 端口进行伪装，所以要用 nginx 在 443 端口对 x-ui 流量和 hysteria2 的伪装流量分流。除了代理服务，还有订阅服务。目前网络上主要两种：sub converter 和 sub-store。sub converter 的官方支持较慢，例如：clash 原版删除跑路后，clash.meta 继续维护，但改动较大，截止目前 sub converter 官方版本仍未支持 meta 内核的新协议；在 hysteria2 出现 1 年后，其支持才被合并到官方主枝。但即使如此，并不影响其作为一款优秀的订阅转换工具，因为上述的兼容问题，有各种魔改版本来解决，比如 meta 内核官方自己基于 sub converter 开发了支持 meta 协议版本（github.com/MetaCubeX/subconverter）。还有一个重要的原因是，clash 系列、sing-box 等部分软件，配置文件不仅仅需要节点信息，还需要软件配置信息才能正常运行，sub converter 在转换时，可以同时给出配置信息。大部分的机场订阅都是使用 sub converter。例如，曾经使用的一个机场就是用免费的订阅转换工具 sub.v1.mk 来转换其搭建的 v2ray 节点。这里要注意：所有的订阅工具，都可以在后台看到你使用的节点转换信息。所以不能保证所有的搭建者都不去浏览抓换的节点信息。sub-store 则更新维护比较及时，也有前后端界面，区别在于，sub-store 转换节点信息比较方便，但要转换 clash 系列、sing-box 等部分软件时麻烦一些。好处是 sub-store 有更为完善的数据保存同步功能，你可以把你的配置同步到 glist。本教程采用 sub-store 来管理订阅。sub converter 我也做过尝试，但因为其订阅管理不够方便，仍然需要搭配 sub-store 来使用、转换 hysteria2 还有 passwd 不兼容问题，最终作罢。下面是这些服务共存在一台服务器上时，使用 nginx 进行端口分流时拓扑图。服务器购买当前服务器 20 :💲:一年，原生 ip，支持 gpt 网页和移动端，不支持 Netflix 非自制剧。使用 debian 12系统，ubuntu 的操作应该也类似。整体框架搭建步骤分为几步：防火墙设置申请域名证书节点搭建-hysteria2节点搭建-vless+vision搭建 sub-store 服务Nginx 分流隐藏服务服务器搭建服务器 ssh 服务安全加固购买服务器后，供应商会给 root 用户和密码，或者让你上传 ssh key，然后通过 ssh 访问服务器。ssh 连接到服务器后，就可以对服务器的基础安全性进行加固。安装常用软件apt update && apt-get install -y curl vim ufw后续会使用 curl 下载各种脚本，vim 编辑文件（不熟悉的可以替换为 nano），iptables-persistent 管理网络防火墙。 注：部分 vps 提供商有自己的防火墙管理面板，仅仅在 vps 中更改可能不生效。吐槽一下甲骨文的 vps 面板是真的难用，试用了一下直接劝退。建立【非 root】的新用户apt list --upgradable apt update && apt-get install -y sudo getent group 1001|| groupadd -g 1001 vps \ && getent passwd username || useradd -ms /bin/bash -u 1001 -g 1001 -G sudo username \ && echo "username:passwd" | chpasswd echo "username ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers上述命令的含义为：1. 安装 sudo，管理 root 权限。 2. 创建用户名为 username 的用户，密码为 passwd；并将其加入到 root 用户组，且使用 sudo 时不需要输入密码。设置好后，另起一个终端，使用用户 username 登陆尝试一下是否建立成功。注：上述用户名和密码请自行替换为自己的。后续同理。修改 ssh 登陆端口注意命令执行顺序，先放行 ssh，再启动 ufw，并未验证 ufw 的默认配置会不会放行 ssh（虽说应该会考虑到），千万别把自己也挡在防火墙外了。sudo apt-get install ufw sudo ufw allow ssh sudo ufw enable sudo ufw allow 1111 sudo vim /etc/ssh/sshd_config # 修改 PORT 为1111 sudo systemctl restart ssh 上述命令，编辑 ssh 配置文档 /etc/ssh/sshd_config 修改其访问端口为 1111，并使用 ufw 管理防火墙，放行 1111 端口。注：自行修改为自己想用的端口。禁用 root 用户 SSH 远程登录vim /etc/ssh/sshd_config # PermitRootLogin yes 改为 noSSH 启用 RSA 密钥验证登录参考：使用-rsa-密钥登录并禁用密码登录在本机上单独开启一个终端，执行下列操作，允许 VPS 服务器接受本机的 ssh 密钥登陆请求。ssh-keygen # 一路回车，在 ~/.ssh 目录下生成公钥和私钥 ssh-copy-id -p 1111 useranem@ip # 上传公钥到服务器完成上述全部操作后，登陆 VPS，并禁用 22 端口ssh -p 1111 username@ip sudo ufw deny 22为你的域名申请 TLS 证书参考：使用 acme.sh DNS 验证的方式签发 Let'sEncrypt 证书 本教程后续依赖于有 tls 证书验证的域名，务必完成。acme.sh 是一个用来自动获取和管理 SSL/TLS 证书的开源脚本，可以从 Let’s Encrypt 等多个 CA 获取免费的证书。结合使用 Cloudflare DNS 验证的模式申请泛域名证书，并自动续签。在前面购买域名后，已经使用过 Cloudflare 解析域名到 VPS 服务器的 IP 地址了。下面还需要用 Cloudflare 帮助验证域名的有效性，结合 Let’sEncrypt 自动申请和续签证书。Cloudflare API使用 Cloudflare DNS 模式需要准备:Zone IDAccount IDAPI Token获取 Zone ID, Account ID这两种 ID 直接在 Overview 页就能找到。获取 API TokenOverview 页点击 获取您的 API 令牌 进入 API Tokens 页。点击 API Tokens 项旁边 创建令牌​ 按钮，接着选择 编辑区域 DNS​ 的模板，点击 使用模板。​区域资源 里选择需要签发的域名在 客户端 IP 地址筛选 里建议写下 acme.sh 所在的主机做为白名单，需要注意，如果服务器有 ipv6 地址，则也需要添加，因为有可能会 ipv6 优先访问。击 继续以显示摘要​, 确认没问题后最后点击 创建令牌。此时就会出现一个 Token,，即 CF\_Token，拷贝备用。安装脚本后续申请证书的命令，都是在 root 用户下执行的，请先使用 su 切换到 root 用户。安装脚本，设置 letsencrypt 为默认认证服务商，并设置邮箱用来接受 Let’s Encrypt 的邮件通知。安装时，acme 会自动的启动 cron 任务，每天检查是否需要续签证书。su # 进入root用户 curl https://get.acme.sh | sh -s email=name@gmail.com; apt install socat -y; ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt安装后的设置安装完毕后重新加载 bash，自动启用 acme 设置的环境变量，可以直接输入 acme.sh 而无需输入路径。source ~/.bashrc开启自动更新acme.sh --upgrade --auto-upgrade设置环境变量, 也就是准备的那三样, 可以准备好在一个文本编辑器里, 拷贝粘贴依次执行:export CF_Zone_ID="1ce3f2e87e5a9b622c7a97c248b99948" export CF_Account_ID="d42a6bf8659044ac95eae65f722bbd88" export CF_Token="ICny7y9ChJlKEEUetNW8CfX6ADqMOaHG3w0vEJjK"[!CAUTION]注意，这个地方设置cloudflare的时候要注意服务器ip是否刷新，要修改，别直接轮转后复制使用 Cloudflare DNS 验证签发证书将 CA 服务器改成 Let’s Encryptacme.sh --set-default-ca --server letsencrypt开始签发证书使用 DNS 的方式申请不需要放行 80 443 端口。这里以 hyperdns.com 为例，-d 后面接上域名, 可以签发多个，这里签了二级域名(hyperdns.com​) 和所有三级域名(*.hyperdns.com)acme.sh --issue --dns dns_cf -d "leiprism475.site" -d "*.leiprism475.site"需要注意，如果出现错误，需要找到错误原因后，再进行下一步，否则错误次数过多，会触发 letsencrypt 速率限制，一段时间内将无法继续验证。（请注意，完整替换域名，这里演示的 .com 的一级域名，如果只改了一级域名，二级域名不对，将会一直验证，不会成功获取证书。一般的验证5分钟以内就可以完成，如果长时间都不成功，可能就是没有完整替换域名为你自己的域名）。export Ali_Key="LTAI5tASTAJaHRpaMKs27SD7" export Ali_Secret="yU0oERHqt9RrhI5jU7061BiyQgl1x1"成功后，会给出证书的位置，一般位于 ~/.acme.sh/域名_ecc/-----END CERTIFICATE----- [Wed Dec 18 10:07:05 PM CST 2024] Your cert is in: /root/.acme.sh/hyperdns.com_ecc/hyperdns.com.cer [Wed Dec 18 10:07:05 PM CST 2024] Your cert key is in: /root/.acme.sh/hyperdns.com_ecc/hyperdns.com.key [Wed Dec 18 10:07:05 PM CST 2024] The intermediate CA cert is in: /root/.acme.sh/hyperdns.com_ecc/ca.cer [Wed Dec 18 10:07:05 PM CST 2024] And the full-chain cert is in: /root/.acme.sh/hyperdns.com_ecc/fullchain.cer 也可以加上以下参数，指定生成的位置。acme.sh --issue --dns dns_cf -d hyperdns.com -d *.hyperdns.com \ --cert-file /path/to/certfile/in/apache/cert.pem \ --key-file /path/to/keyfile/in/apache/key.pem \ --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \验证自动续签crontab -l 23 9 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null表示每天的上午9:23执行一次。检查是否需要更新证书。手动执行：$ acme.sh --cron --home /root/.acme.sh [Thu Dec 19 09:51:00 AM CST 2024] ===Starting cron=== [Thu Dec 19 09:51:00 AM CST 2024] Renewing: 'hex.hyperdns.com' [Thu Dec 19 09:51:00 AM CST 2024] Renewing using Le_API=https://acme-v02.api.letsencrypt.org/directory [Thu Dec 19 09:51:00 AM CST 2024] Skipping. Next renewal time is: 2025-02-08T09:00:33Z [Thu Dec 19 09:51:00 AM CST 2024] Add '--force' to force renewal. [Thu Dec 19 09:51:00 AM CST 2024] Skipped hex.hyperdns.com_ecc [Thu Dec 19 09:51:00 AM CST 2024] Renewing: 'hyperdns.com' [Thu Dec 19 09:51:00 AM CST 2024] Renewing using Le_API=https://acme-v02.api.letsencrypt.org/directory [Thu Dec 19 09:51:00 AM CST 2024] Skipping. Next renewal time is: 2025-02-15T14:07:05Z [Thu Dec 19 09:51:00 AM CST 2024] Add '--force' to force renewal. [Thu Dec 19 09:51:00 AM CST 2024] Skipped hyperdns.com_ecc [Thu Dec 19 09:51:00 AM CST 2024] ===End cron===使用使用时，往往会要求填入证书和秘钥，这里注意，生成证书时，会有三种，在上述例子中，​hyperdns.com.cer：只有域名的叶子证书。​ca.cer：中间证书，用来构建完整的信任链。​fullchain.cer：由域名证书与中间证书组合而成的完整证书链文件，配置服务器时常用此文件以确保客户端能正确验证证书链。通常，采用 fullchain.cer 作为网站证书的配置。密钥只有一个，例如：​hyperdns.com.key，对应域名证书的私钥，直接输入就行。该证书会作为 hysteria2、x-ui、nginx使用。由于目前在 root 用户下操作，证书文件的权限仅 root 用户访问，因此需要修改。cp /root/.acme.sh/hyperdns.com_ecc/hyperdns.com.key /home/username/hyperdns.com.key cp /root/.acme.sh/hyperdns.com_ecc/fullchain.cer /home/username/fullchain.cer sudo chmod 644 /home/username/hyperdns.com.key sudo chmod 644 /home/username/fullchain.cer‍节点搭建​注意：后续所有节点均使用的是三级域名，在 cloudflare 解析 DNS 时，都不勾选 代理。因为 hysteria2 和 vless+vision 都不支持 cdn。全部都是直连。但提供订阅或者面板访问的域名，需要打开代理，提高一些安全性。搭建和配置 hysteria2同样在root权限下完成。命令 su官网脚本安装官网地址：v2.hysteria.network/zh/，可查看其配置说明。bash <(curl -fsSL https://get.hy2.sh/)如果出现$ bash <(curl -fsSL https://get.hy2.sh/) Checking for installed version ... v2.6.0 Checking for latest version ... v2.6.0 Install /etc/hysteria/config.yaml ... exists Creating user hysteria ... /dev/fd/63: line 1021: useradd: command not found 则是系统的 PATH 环境出现问题，可以执行 export PATH=$PATH:/usr/sbin​ 暂时缓解，如果希望永久解决，可以将 /usr/sbin 添加到 PATH 中，在系统的 shell 配置文件（例如 \~/.bashrc 或 \~/.profile）中加入如下行：export PATH=$PATH:/usr/sbin # 然后执行以下命令来使更改生效： source ~/.bashrc​若域名没有 SSL 证书，则可生成自签证书（但不推荐，相当于你没有任何验证，容易被中间人攻击）。或者购买域名（namesilo 域名购买 和 cloudflare 托管解析）。但如果经过前面的设置，就无需担心，已经拥有了正规的 SSL 证书。自签证书申请（不建议使用）注：需要切换到 root 用户su openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) -keyout /etc/hysteria/server.key -out /etc/hysteria/server.crt -subj "/CN=bing.com" -days 36500 && sudo chown hysteria /etc/hysteria/server.key && sudo chown hysteria /etc/hysteria/server.crt非面板搭建的配置如果不使用面板搭建，则需要手动设置配置文件。服务器配置文件hysteria2 支持 acme 通过 dns 方式申请证书，同样需要 cloudflare_api_token，但为了方便续签和其他服务使用证书，不采用这种方式。当然，即便你采用这种方式，也不会产生任何冲突和影响。自行修改下面的配置中用户密码、trafficStats 端口/密码。简单解释这个配置的含义：监听 8443 端口，该端口是建立 hysteria2 服务的基础。可以修改，但需要同时允许防火墙通过端口、修改客户端配置。tls 认证，配置自有域名的证书，以防止安全攻击。可以使用自签证书，但理论上并不安全，虽然大多数的小白教程都直接使用。如果完成本文前面的证书申请步骤，则这一步填入已有的证书即可。auth，权限验证，验证通过，才能够正常提供服务。支持多用户认证，每个用户使用 用户名+密码 的方式进行验证，适合小规模多用户使用。需要注意：用户名不能含有大写字母。使用大写字母会连不上，目前已经确认这是一个 bug，后续版本会修复。Hysteria2 版本为 v2.6.0。masquerade，伪装，服务器像普通网站服务器一样真的响应 HTTP 请求，假装自己就是一个正常的网页服务器。trafficStats，流量统计接口bandwidth，带宽设置，不宜设置过大，造成流量浪费。cat << EOF > /etc/hysteria/config.yaml listen: :8443 #监听端口 #使用 acme 证书，如果用cloudflare解析dns，并开启代理，则不需要申请，只填写域名即可 #acme: # domains: # - a.com #你的域名，需要先解析到服务器ip # email: test@sharklasers.com #使用 acme 申请 CA 证书 #acme: # domains: # - "*.hyperdns.com" # email: your_email_address # type: dns # dns: # name: cloudflare # config: # cloudflare_api_token: your_api_token #使用自签证书 或者已有 ca 证书 #ca 证书 tls: cert: /home/username/fullchain.cer key: /home/username/hyperdns.com.key #使用自签证书 #tls: # cert: /etc/hysteria/server.crt # key: /etc/hysteria/server.key auth: # 设置多用户 type: userpass userpass: usr1: 8374393j4d usr2: t2rt9shd92 masquerade: type: proxy proxy: url: https://bing.com #伪装网址 rewriteHost: true listenHTTP: :80 listenHTTPS: :8443 trafficStats: listen: :22222 secret: trafficStats_passwd bandwidth: up: 20 mbps down: 50 mbps EOF最后，服务器端需要启动 hysteria2 server，并设置开机自启。systemctl enable hysteria-server.service --now并运行命令：systemctl status hysteria-server.service 查看 hysteria 日志，观察是否启动成功。如果没有启动成功，请查看具体的报错信息，并解决。可以查看 hysteria2 官网：故障排除。端口跳跃参考：hysteria2 端口跳跃、meta hysteria2配置运营商可能会阻断或限速 UDP 连接。表现为突然无法使用，或者网速慢，但几分钟（十几分钟）后又恢复。不过，这些限制往往仅限单个端口。端口跳跃可用作此情况的解决方法。Hysteria 服务端并不能同时监听多个端口，因此不能在服务器端使用上面的格式作为监听地址。建议配合 iptables 或 nftables 的 DNAT 将端口转发到服务器的监听端口。# IPv4 iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443 # IPv6 ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443在这个示例中，服务器监听 443 端口，但客户端可以通过 20000-50000 范围内的任何端口连接。对于本示例来说，没有放行这么多端口，只放行部分（端口号需要在 1000-65535），供参考：ufw allow 50220:50959/udp ufw allow 60133:60968/udp iptables -t nat -A PREROUTING -i eth0 -p udp --dport 50220:50959 -j REDIRECT --to-ports 8443 iptables -t nat -A PREROUTING -i eth0 -p udp --dport 60133:60968 -j REDIRECT --to-ports 8443 ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 50220:50959 -j REDIRECT --to-ports 8443 ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 60133:60968 -j REDIRECT --to-ports 8443注意：有的 vps 中默认的网口并不是 eth0，请使用 ifconfig​ 或者 ip addr 找出真实的网卡名。如果添加出错，需要删除规则，则可以参考：删除 ufw 规则ufw status numbered # 查看规则的编号 ufw delete 3 # 删除想删除的规则的编号删除改 iptables列出当前的规则并找到规则的编号。使用以下命令列出规则：sudo iptables -L -v -n --line-numbers sudo iptables -L -v -n -t nat # 查看添加的 nat 规则这会输出规则列表，并在每个规则前面显示一个编号。假设你要删除编号为 2 的规则，可以执行：sudo iptables -D <链名> <规则编号>例如，要删除 nat 表中的 PREROUTING 链上的第 2 条规则：sudo iptables -t nat -D PREROUTING 2使用端配置clash.meta 为例，在配置文件中按照如下方式填写，yaml 格式。proxies: - name: "🇺🇸 Hysteria" # Hysteria2 不支持套用 CDN server: your_ip port: 8443 ports: 50220-50959/60133-60968 type: hysteria2 password: usr1:8374393j4d # 多用户配置 用户名:密码 up: 20 down: 50 sni: www.hyperdns.com skip-cert-verify: false将上述节点信息，添加到已有的 clash 配置文件中，就可以看到节点，如果检测不通，则说明信息填写错误，请仔细检查，并确认 hysteria 服务器端成功启动。节点信息配置出错，或者与服务端不匹配，则无法连通。填写参考：server 填写服务器 ip 或者没有开启代理的域名。 hysteria 不支持cdn，开启代理会导致无法正常使用。如果使用域名，有可能会发生不稳定的情况，这时改回 ip 即可。port 监听端口要和服务器一致。ports 端口跳跃端口也要和服务器上开放的端口一致，保证服务器防火墙放行对应端口，并设置端口转发到监听端口。密码 password 要正确，多用户需要注意格式要求，用户名和密码中间必须要有 : 但不能有空格。sni 认证网址也要正确，需要和证书提供的一致。但这仅限于 tls 认证，只要该域名是证书中包含的域名即可。常用指令#启动Hysteria2 systemctl start hysteria-server.service #重启Hysteria2 systemctl restart hysteria-server.service #查看Hysteria2状态 systemctl status hysteria-server.service #停止Hysteria2 systemctl stop hysteria-server.service #设置开机自启 systemctl enable hysteria-server.service #查看日志 journalctl -u hysteria-server.service流量统计 API在服务端配置 trafficStats​ 后，可通过 HTTP API 查询服务器的\=\=流量\=\=统计信息，以及踢用户下线。注：下述 api 都是 http，不安全。在后续使用 nginx 反代时，会更新为 https 访问方式。curl -H 'Authorization: trafficStats_passwd' http://ip_address:22222/trafficbash 脚本#!/bin/bash green='\033[0;32m' cyan='\033[0;36m' NC='\033[0m' # No Color # 显示在线用户 echo "在线用户：" curl -H 'Authorization: trafficStats_passwd' http://ip_address:22222/online echo # 函数：将字节转换为可读格式 bytes_to_readable() { local bytes=$1 if (( bytes < 1024 )); then printf "%d B" "$bytes" elif (( bytes < 1024**2 )); then printf "%.2f KB" "$(echo "scale=2; $bytes / 1024" | bc)" elif (( bytes < 1024**3 )); then printf "%.2f MB" "$(echo "scale=2; $bytes / (1024^2)" | bc)" else printf "%.2f GB" "$(echo "scale=2; $bytes / (1024^3)" | bc)" fi } # 设置URL和头部 URL="http://ip_address:22222/traffic" AUTH_HEADER="Authorization: trafficStats_passwd" # 发送GET请求并获取响应 response=$(curl -s -w "HTTPSTATUS:%{http_code}" -H "$AUTH_HEADER" "$URL") # 提取body和状态码 body=$(echo "$response" | sed -e 's/HTTPSTATUS\:.*//g') status_code=$(echo "$response" | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') if [ "$status_code" -eq 200 ]; then # 使用 jq 解析 JSON 并遍历每个键 echo "$body" | jq -r 'to_entries[] | "\(.key) \(.value.tx) \(.value.rx)"' | while read -r key tx rx; do readable_tx=$(bytes_to_readable "$tx") readable_rx=$(bytes_to_readable "$rx") echo -e "$key: 上传 ${green}${readable_tx}${NC}, 下载${cyan}${readable_rx}${NC}" done else echo "请求失败，状态码：$status_code" fi 搭建缓解 TIT 特征的 vless+vision+tlsTIT 特征 TLS in TLS 是一种 TIS 传输 TLS 的特征，可能在某些地区能够被精确的识别和封禁。目前可以通过一些搭建方式来缓解。比如 naive 和 vision 通过字节填充来缓解 TIT。参考：搭建 VISION 节点、TIT 问题及解决方式使用 x-ui 面板搭建节点，x-ui 是一个前端项目，负责通过 UI 界面配置节点参数，最终使用 xray 来搭建节点。安装 x-ui 面板x-ui 虽然提供了 docker 镜像，但是没有更新，且不好使用。还是直接安装比较合适。bash <(curl -Ls https://raw.githubusercontent.com/FranzKafkaYu/x-ui/956bf85bbac978d56c0e319c5fac2d6db7df9564/install.sh) 0.3.4.4安装时，建议修改端口和账号用户与密码。需要防火墙放行自己设定的端口，假设设置的是 11080 端口。安装后输入命令 x-ui 可以查看使用方式。root@LA:~# x-ui x-ui 面板管理脚本 0. 退出脚本 ———————————————— 1. 安装 x-ui 2. 更新 x-ui 3. 卸载 x-ui ———————————————— 4. 重置用户名密码 5. 重置面板设置 6. 设置面板端口 7. 查看当前面板信息 ———————————————— 8. 启动 x-ui 9. 停止 x-ui 10. 重启 x-ui 11. 查看 x-ui 状态 12. 查看 x-ui 日志 ———————————————— 13. 设置 x-ui 开机自启 14. 取消 x-ui 开机自启 ———————————————— 15. 一键安装 bbr (最新内核) 16. 一键申请SSL证书(acme申请) 17. 配置x-ui定时任务 面板状态: 已运行 是否开机自启: 是 xray 状态: 运行 请输入选择 [0-17],查看面板登录信息请输入数字7:0x-ui 面板安装成功后，需要登陆面板进行操作。鉴于目前对 http 访问的安全风险很重视，在初次没有配置好 https 时，需要先用 ssh 隧道进行访问。在本机上输入下列命令，让本机的 11080 端口和服务器的 11080 端口建立 ssh 隧道。ssh -L 11080:localhost:11080 user@serverip在浏览器中输入 http://localhost:port​ 登陆 x-ui 面板，第一次登陆以后，点击面板设置，会自动更改根路径，后续登陆需要输入 http://localhost:port/新根路径 才能正常登陆。其中 port 在安装时由自己设置，本例子中为 11080。http://localhost:port/5I1Q/xui/但这种方式不要长期使用，当我们登入面板后，就应该立即去设置中，将 http 明文访问，升级为 https。此处，填写已经申请到的 fullchain 证书，和密钥。保存后重启面板即可通过下面的网址访问https://ip:port/5I1Q但这样访问，浏览器会提示不安全，因为 ip 并不符合证书中所认证的域名。所以，还需要在 cloudflare 中为 xui 面板单独设置一个三级域名单独用于访问 xui 面板，并且需要和后续的 nginx 分流配合起来，让访问 xui 域名的流量由 443 正确的分到 xui 端口。否则就需要在 cloudflare 中配置 Origin Rules 将 cloudflare 前端代理的 443 端口流量自动的分流到服务器的对应端口，服务器也因此要开放 xui 端口，有暴露服务的风险。x-ui 搭建配置在面板添加节点。注：flow 在打开 4 和 5 后才会显示。还​需要防火墙放行 xray 的端口。其中​域名需要解析到服务器的ip地址​，​且 cloudflare 解析时，不能打开代理。使用端配置直接复制面板中提供的链接可以导入到小火箭，但是不能导入到 clash，clash 需要手动配置，或者用 sub-store 转换。这里还没有搭建 sub-store，则手动填写。clash 端proxies: - name: "🇺🇸 vless" type: vless server: hvl.hyperdns.com # 解析到真实ip，不套用 CDN port: 58505 udp: true uuid: c19119d6-796d-4c4b-add6-8392jeusisk flow: xtls-rprx-vision packet-encoding: xudp tls: true servername: hvl.hyperdns.com alpn: - h2 - http/1.1 client-fingerprint: chrome skip-cert-verify: false network: tcp smux: enabled: false 上述节点导入后就可以正常访问了。订阅服务搭建参考：通过VPS架设Sub-Store(新版)、SubStore 部署Sub-Store 项目分为前后端，前后端是分离的，部署在 VPS 上则需要前后端都部署，并且需要在前端访问之前套一个 Nginx，否则传输的都是 http 流量，不安全。部署后，可以在任意前端设置后端 api，即可使用。因此，在 mihomo-party 中，可以输入后端 api，以支持节点分享。安装组件同样先进入 su。apt update -y && apt install unzip curl wget git -y 安装 FNM - Node 版本管理器$ curl -fsSL https://fnm.vercel.app/install | bash ... In order to apply the changes, open a new terminal or run the following command: source /root/.bashrc按照回显的图示，运行命令保存生效source /root/.bashrc #请按照你的回显提示命令进行输入FNM 安装 Nodefnm install v20.18.0可以安装其他版本，但是后续服务配置文件需要同步修改版本。安装 PNPM 软件包管理器curl -fsSL https://get.pnpm.io/install.sh | sh -按照回显的图示，运行命令source /root/.bashrc安装 Sub-Store创建文件夹并拉取项目mkdir -p /root/sub-store #在 root 目录下面创建 sub-store 文件夹 cd /root/sub-store #进入 sub-store 文件夹拉取项目并解压# 拉取后端项目 curl -fsSL https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store.bundle.js -o sub-store.bundle.js # 拉取前端项目 curl -fsSL https://github.com/sub-store-org/Sub-Store-Front-End/releases/latest/download/dist.zip -o dist.zip解压前端文件，并改名为 frontend，而后删除源压缩文件unzip dist.zip && mv dist frontend && rm dist.zip创建系统服务pm2 的启动方式会有 BUG，所以我们采用服务进程的方式来启动进入 VPS 目录 /etc/systemd/system/​，在里面创建一个文件 sub-store.service，​vim /etc/systemd/system/sub-store.service写入以下服务信息[Unit] Description=Sub-Store After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] LimitNOFILE=32767 Type=simple Environment="SUB_STORE_FRONTEND_BACKEND_PATH=/2cXaAxRGfddmGz2yx1wA" Environment="SUB_STORE_BACKEND_CRON=0 0 * * *" Environment="SUB_STORE_FRONTEND_PATH=/root/sub-store/frontend" Environment="SUB_STORE_FRONTEND_HOST=0.0.0.0" Environment="SUB_STORE_FRONTEND_PORT=3001" Environment="SUB_STORE_DATA_BASE_PATH=/root/sub-store" Environment="SUB_STORE_BACKEND_API_HOST=127.0.0.1" Environment="SUB_STORE_BACKEND_API_PORT=3000" ExecStart=/root/.local/share/fnm/fnm exec --using v20.18.0 node /root/sub-store/sub-store.bundle.js User=root Group=root Restart=on-failure RestartSec=5s ExecStartPre=/bin/sh -c ulimit -n 51200 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target上面服务代码中的 2cXaAxRGfddmGz2yx1wA​ 为API请求密钥，请自行修改，推荐自动生成地址：点击访问启动服务，并设置开机自启。如果前面 fnm 安装 nodo 时，不是版本 v20.18.0，这里需要同步修改，否则执行不成功。systemctl enable sub-store.service --now后端服务相关命令systemctl start sub-store.service #启动服务 systemctl enable sub-store.service #设置为开机自启 systemctl status sub-store.service #查看服务状态 systemctl stop sub-store.service #停止服务 systemctl restart sub-store.service #重启服务正常情况下，运行服务状态，应该类似下图：（ active:running ）Nginx前面搭建面板、订阅服务时，都需要在访问时，加上对应的端口号，如果暴露在公网，有安全风险。可以通过搭建 Nginx 服务，对外只暴露 443 80 端口，将 443 加密流量在 Nginx 内部分流到不同的本地端口，本地端口不需要暴露。就解决了这个问题。安装 Nginxsudo apt install libnginx-mod-stream nginx -y 配置分流在我的主机上，同时存在 x-ui面板​、hysteria2​，因此，希望 sub-store​ 可以和其他两个服务共存。且 hysteria2 伪装需要监听 80 443 端口，普通的 https 网络访问，也需要直接访问 443 端口。在拥有一个有 ssl 认证的域名，一台可用服务器时，有两种解决方式：通过 Cloudfalre 设置 Origin Rules，根据不同的 访问域名，将服务转发到不同的端口。例如：hysteria2​ 仍然监听 80，443端口，x-ui面板​ 设置访问端口 81，sub-store​设置访问端口 82。然后 Cloudfalre 中将访问 sub.name.com 的 https 流量转发到服务器的 82 端口，访问 xui.name.com 的 https 流量转发到服务器的 81 端口，普通流量不管，自动转发到服务器的 80，443。但由于 sub-store 不支持 https 流量，所以还是需要设置 nginx 服务器，将 https 流量解析并代理成 http 流量到 sub-store 端口。设置 nginx 反代服务，开放 443，80，8443端口。xui、sub-store 的网络访问都走 443，hysteria 监听 80 和 8443，hysteria 代理端口也为 8443。ngnix 将流量从 443 分流到 xui、sub-store、hysteria各自的端口上。当通过 https 协议访问 443 时，xui、sub-store分流到各自端口，其余流量全部分流到 8443，这部分流量被重定向到伪装站，而符合 hysteria 代理流量会直接访问 8443，不走 nginx 分流。 示意图如下：因为一定需要 nginx 作反代，所以，采用第二种方式。配置 nginx stream 分流和 nginx server在 /etc/nginx/nginx.conf​ 中的 http 块外部分，也就是顶层配置下，加入 include /etc/nginx/vps.conf;​，并删除 /etc/nginx/sites-enabled 下的基础配置。# /etc/nginx/nginx.conf user www-data; worker_processes auto; pid /run/nginx.pid; error_log /var/log/nginx/error.log; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { sendfile on; tcp_nopush on; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; gzip on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } include /etc/nginx/vps.conf; 在 /etc/nginx​ 下创建文件 vps.conf，并填入下列分流规则：根据域名分流将 443 端口的 https 流量分流到不同的后端。其中 xui 本身支持 https，不需要对 https 解密再转发。而 substore 目前只支持 http，所以需要将 sub 流量转发到 nginx server，由 nginx server 解密再转发到 sub 的端口。除此之外的流量，都转发到 hysteria 的伪装端口。后续会在 /etc/nginx/sites-enabled/vps.conf 中为 substore 配置一个 nginx 反代服务，其监听的是 8444 端口，因此这里需要将 sub 对应的流量分流至 8444。xui 端口为 11080，这在 xui 面板搭建一节中提到过，是用户安装时自行设置的。hysteria 则是在配置文件中设置了伪装服务端口为 8443。# /etc/nginx/vps.conf stream { # 定义一个映射，将 SNI 中的服务器名映射到后端标识符 map $ssl_preread_server_name $backend { hostnames; sub.xyz.top sub; xui.xyz.top xui; default hysteria; # 默认后端 } # 定义各个后端的上游服务器 upstream sub { server 127.0.0.1:8444; # sub.xyz.top 对应的后端，对接的是 nginx server } upstream xui { server 127.0.0.1:11080; # xui.xyz.top 对应的后端 } upstream hysteria { server 127.0.0.1:8443; # 默认后端 } # 定义一个服务器块，监听指定端口并根据 SNI 分发流量 server { listen 443; listen [::]:443; proxy_pass $backend; ssl_preread on; } } 然后需要设置 sub-store 的 server 反代并部署 SSL 证书用于 tls 认证，解密 https 流量。# /etc/nginx/sites-enabled/vps.conf server { listen 8444 ssl http2; listen [::]:8444 ssl http2; server_name sub.xyz.top; ssl_certificate /root/.acme.sh/xyz.top_ecc/fullchain.cer; ssl_certificate_key /root/.acme.sh/xyz.top_ecc/xyz.top.key; location / { proxy_pass http://127.0.0.1:3001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 启动 nginx移除默认的配置文件：sudo rm /etc/nginx/sites-enabled/default​。如果 /etc/nginx/sites-enabled 有其他的配置文件，都会被 nginx 启动，因此为了防止冲突，需要移除。sudo nginx -t # 检测配置是否正确 sudo systemctl restart nginx sudo nginx -s reload # 重新启动 nginx如果出现下列错误 unknown directive "stream"​，则是缺少 stream 的支持库，安装即可 sudo apt install libnginx-mod-stream。这可能是由于 nginx v20.18.0 版本较低，v22.13.0 版本没有该问题。$ sudo nginx -t 2024/12/19 16:53:58 [emerg] 1424878#1424878: unknown directive "stream" in /etc/nginx/vps.conf:2 nginx: configuration file /etc/nginx/nginx.conf test failed访问服务在搭建好 nginx 反代后，就可以通过域名直接用 https 访问对应的服务了，不需要像之前一样，输入 ip+端口号的形式来访问。大大提高了安全性和易用性。访问 SubStore设置好后，SubStore 地址为：https://sub.xyz.top其后端 API 为（可以在 mihomo-party 中添加），也可以直接在前端的设置中填入。https://sub.xyz.top/2cXaAxRGfddmGz2yx1wA浏览器访问带有后端功能的前端，输入https://sub.xyz.top?api=https://sub.xyz.top/2cXaAxRGfddmGz2yx1wA或者访问前端，在设置中，保存后端的 api。访问 xui首先在 cloudflare 中，设置一个三级域名，并解析到服务器 ip，且关闭代理。假设三级域名是：xui.hyperds.com，则现在可以通过https://xui.hyperds.com/5I1Q直接访问。访问其他网址除了上述 xui、sub以外的域名，都会被发送到 hysteria 伪装端口，返回的就是伪装的网站。sub-store 的使用我在另一个贴子中有详细介绍：节点的订阅管理\分享-我的方案 claw7刀年抛很香 年轻人的第一台VPS：Reality 节点搭建 佬们 推荐个机场 这段时间，连国外dns都不让用了 请问下CF挂载的域名怎么开启https访问‍https://linux.do/u/linglong4210https://linux.do/u/ajun06https://linux.do/u/flow_waves54阅读时间 26 分钟
void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j), quick_sort(q, j + 1, r); }
宝塔面板公网ip非80端口非443端口部署ssl_宝塔域名绑定80以外的端口
宝塔面板公网ip非80端口非443端口部署ssl_宝塔域名绑定80以外的端口-CSDN博客宝塔面板公网ip非80端口非443端口部署ssl_宝塔域名绑定80以外的端口-CSDN博客https://blog.csdn.net/weixin_41187842/article/details/129165773文章浏览阅读5k次，点赞3次，收藏12次。3、申请ssl证书，由于ssl默认访问80端口，所以使用文件验证失败，只能使用DNS验证。使用Let's Encrypt申请证书，使用dns验证，勾选手动解析，点击申请。此时会弹出一个让你设置TXT解析记录的框，到域名服务商那里添加解析记录，回到宝塔面板，点击验证。如果验证成功，此时访问。2、再到域名运营商做A记录解析，此时可以通过http://test.xxx.cn:8085访问到网站。有不少人使用家用宽带，虽然申请下来了公网ip，但是运营商封了80与443端口，但仍想使用ssl证书。_宝塔域名绑定80以外的端口2025-01-08 19:28:58宝塔面板公网ip非80端口非443端口部署ssl​https://blog.csdn.net/weixin_41187842/category_8127481.html运维专栏收录该内容20 篇文章2 订阅[订阅专栏]()有不少人使用家用宽带，虽然申请下来了公网ip，但是运营商封了80与443端口，但仍想使用ssl证书一、仅封80端口1、先在宝塔面板里创建网站，域名为test.xxx.cn:80852、再到域名运营商做A记录解析，此时可以通过http://test.xxx.cn:8085访问到网站3、申请ssl证书，由于ssl默认访问80端口，所以使用文件验证失败，只能使用DNS验证。使用Let's Encrypt申请证书，使用dns验证，勾选手动解析，点击申请​此时会弹出一个让你设置TXT解析记录的框，到域名服务商那里添加解析记录，回到宝塔面板，点击验证。如果验证成功，此时访问https://test.xxxx.cn:8085/是无法访问的，要去掉端口号，直接访问https://test.xxxx.cn。一、80端口与443端口都封1、2、3步与上面一样，由于443端口被封，则需手动修改ssl的端口。打开宝塔的test.xxxx.cn的站点设置，找到配置文件，找到 listen 443 ssl http2; 改为 listen 442 ssl；如图：​此时访问 https://test.xxxx.cn:442可以访问显示推荐内容
Ubuntu初始化配置防火墙1. 检查ufw​是否已安装​ufw​通常在Ubuntu中默认安装。你可以通过以下命令检查是否已安装：sudo ufw status如果未安装，可以使用以下命令安装：sudo apt update sudo apt install ufw2. 启用ufw​如果ufw​尚未启用，可以使用以下命令启用它：sudo ufw enable启用后，防火墙将开始运行，并在系统启动时自动启用。3. 检查防火墙状态你可以使用以下命令检查防火墙的状态：sudo ufw status verbose这将显示当前的防火墙规则和状态。4. 允许或拒绝特定端口或服务你可以使用ufw​允许或拒绝特定的端口或服务。例如：允许SSH（默认端口22）：sudo ufw allow ssh或者直接指定端口：sudo ufw allow 22/tcp允许HTTP（端口80）：sudo ufw allow http或者：sudo ufw allow 80/tcp允许HTTPS（端口443）：sudo ufw allow https或者：sudo ufw allow 443/tcp拒绝某个端口：sudo ufw deny 8080/tcp5. 删除规则如果你想删除某条规则，可以使用以下命令：sudo ufw delete allow 80/tcp或者通过规则编号删除：sudo ufw status numbered sudo ufw delete 2 # 删除编号为2的规则6. 禁用ufw​如果你想暂时禁用防火墙，可以使用以下命令：sudo ufw disable7. 重置ufw​如果你想重置所有规则并禁用ufw​，可以使用以下命令：sudo ufw reset8. 允许特定IP地址你可以允许特定IP地址访问所有端口：sudo ufw allow from 192.168.1.100或者允许特定IP地址访问特定端口：sudo ufw allow from 192.168.1.100 to any port 229. 拒绝特定IP地址你可以拒绝特定IP地址访问：sudo ufw deny from 192.168.1.20010. 查看日志你可以查看ufw​的日志以监控防火墙活动：sudo ufw logging on sudo tail -f /var/log/ufw.log‍SSH在Ubuntu上安装SSH（Secure Shell）服务非常简单。以下是安装和配置SSH的步骤：1. 安装SSH服务器默认情况下，Ubuntu可能没有安装SSH服务器。你可以通过以下命令安装：sudo apt update sudo apt install openssh-server2. 启动SSH服务安装完成后，SSH服务会自动启动。你可以通过以下命令检查SSH服务的状态：sudo systemctl status ssh如果服务没有启动，可以使用以下命令手动启动：sudo systemctl start ssh3. 设置SSH服务开机自启为了确保SSH服务在系统重启后自动启动，可以运行以下命令：sudo systemctl enable ssh4. 配置SSH（可选）SSH的配置文件位于 /etc/ssh/sshd_config​。你可以编辑此文件以更改默认设置。例如：修改SSH端口（默认是22）：sudo nano /etc/ssh/sshd_config找到 Port 22​ 这一行，将其修改为其他端口号（如 Port 2222​），然后保存并退出。禁用root登录（增强安全性）：找到 PermitRootLogin yes​，将其改为 PermitRootLogin no​。限制允许登录的用户：添加一行 AllowUsers your_username​，只允许特定用户登录。修改完成后，重启SSH服务以使更改生效：sudo systemctl restart ssh5. 允许SSH通过防火墙如果启用了ufw​防火墙，需要允许SSH端口（默认是22）通过防火墙：sudo ufw allow ssh如果你修改了SSH端口（例如改为2222），则需要允许新端口：sudo ufw allow 2222/tcp6. 连接到SSH服务器在另一台机器上，你可以使用以下命令连接到SSH服务器：ssh username@your_server_ip如果修改了SSH端口，需要指定端口号：ssh -p 2222 username@your_server_ip7. 卸载SSH服务器（可选）如果你不再需要SSH服务器，可以通过以下命令卸载：sudo apt remove openssh-server
siyuanversion: "3.9" services: main: image: b3log/siyuan # 使用的镜像源名称 container_name: SiYuan # 设置容器名称 command: [ "--workspace=/siyuan/workspace/", "--accessAuthCode=xxx" # 官方设置的容器内的数据存放路径与认证码 ] volumes: - "/home/solost/docker/siyuan/workspace:/siyuan/workspace" network_mode: "host" ports: - "6806:6806" restart: always # 容器自动重启 environment: - LANG=zh_CN - PUID=1001 - PGID=1002用户权限在图片中，“entrypoint.sh ”脚本确保以指定的 “PUID ”和 “PGID ”创建 “siyuan ”用户和组。因此，当主机创建工作区文件夹时，请注意设置文件夹的用户和组所有权，使其与计划使用的 PUID​ 和 PGID​ 匹配。例如chown -R 1001:1002 /siyuan/workspace如果使用自定义的 PUID​ 和 PGID​ 值，入口点脚本将确保在容器内创建正确的用户和组，并相应调整挂载卷的所有权。无需在 docker run​ 或 docker-compose​ 中手动传递 -u​，因为环境变量会处理自定义。‍
常用公式基本求导公式${\left( {x}^{\alpha }\right) }^{\prime } = \alpha {x}^{\alpha - 1}\left( {\alpha \text{ 为常数 }}\right)$${\left( {a}^{x}\right) }^{\prime } = {a}^{x}\ln a\left( {a > 0,a \neq 1}\right)$${\left( {\mathrm{e}}^{x}\right) }^{\prime } = {\mathrm{e}}^{x}$${\left( {\log }_{a}x\right) }^{\prime } = \frac{1}{x\ln a}\left( {a > 0,a \neq 1}\right)$${\left( \ln \left| x\right| \right) }^{\prime } = \frac{1}{x}$${\left( \sin x\right) }^{\prime } = \cos x$${\left( \cos x\right) }^{\prime } = - \sin x$${\left( \arcsin x\right) }^{\prime } = \frac{1}{\sqrt{1 - {x}^{2}}}$${\left( \arccos x\right) }^{\prime } = - \frac{1}{\sqrt{1 - {x}^{2}}}$${\left( \tan x\right) }^{\prime } = {\sec }^{2}x$${\left( \cot x\right) }^{\prime } = - {\csc }^{2}x$${\left( \arctan x\right) }^{\prime } = \frac{1}{1 + {x}^{2}}$${\left( \operatorname{arccot}x\right) }^{\prime } = - \frac{1}{1 + {x}^{2}}$${\left( \sec x\right) }^{\prime } = \sec x\tan x$${\left( \csc x\right) }^{\prime } = - \csc x\cot x$${\left\lbrack \ln \left( x + \sqrt{{x}^{2} + 1}\right) \right\rbrack }^{\prime } = \frac{1}{\sqrt{{x}^{2} + 1}}$${\left\lbrack \ln \left( x + \sqrt{{x}^{2} - 1}\right) \right\rbrack }^{\prime } = \frac{1}{\sqrt{{x}^{2} - 1}}.$基本积分公式泰勒公式求极限注意：相减展开过程中，要展到相同次数，不能一个展开到 2 次，另一个 3 次相乘过程与相减类似相除过程中，可以简单判断分子或者分母展开的阶数，然后分子或者分母相应展到相同阶数，如果有部分与分母阶数不同，根据抓大头原则即可，趋向于 0 比分母次数更高的可以直接舍去，趋向于正无穷，比分母阶数低的可以舍去二重积分求极值无条件的二重积分求极值1.先求函数的偏导数2.找到令偏导数不存在或者为 0 的点，偏导数相互带入，求出可疑点3.求二阶偏导数4.把可疑点带入，判断 Δ，然后根据条件带入原方程即可求出极大或者极小值条件最值与拉格朗日数乘法首先，如果能将条件转化为变量带入首先转化，就可以转成无条件的求法1.构造辅助函数2.求各个变量的偏导，令其为 03.解方程4.比较方程得出的各点大小，找出最大最小值多元函数求极值注意：极值可能存在的地方1.函数定义域内部2.定义域边界例如：${(x,y)|x+2*y<=1,x>=0,y>=0}$$x=0$ 时候，可以求出内部的驻点(偏导数为 0)，还有边界点 $(0,0),(0,1/2)$$y=0$ 时候，可以求出内部的驻点(偏导数为 0)，还有边界点 $(1,0)$$x+2*y=1$ 时候，把方程的 x 或者 y 换掉，又会有一个新的方程，再求新方程的极值例题见 1000 题 A 组 13 章 18 题极坐标二重积分计算如果遇到被积函数是椭圆的情况 $\frac{x^{2}}{a^{2}}+\frac{y^{2}}{b^{2}}$$=$$r^{2}$令 $x=arcost$, $y=brsint$根据题目给出的条件，计算出 t 的范围和 r 的范围然后 $dxdy=abrdr$ 写方程过程一定记得换了，不是 $rdr$求渐近线求渐近线过程1.垂直渐近线（$x\to x_0$）2.水平渐近线（$x\to \infty$）3.求斜渐近线时，先求出$\frac{f(x)}{x},$也就是斜率，判断$x\to +\infty和x \to -\infty$的极限值是否相同，如果存在且极限值不同，则斜渐近线条数取决于不同极限值个数注意：如果遇到趋向于负无穷，稳妥起见用-t 换元 x，t 趋向于正无穷,趋向于负无穷时从绝对值提出 $x^2$ 时候要加负号遇到以下情况可以用导数定义来求导数被求导的函数过于复杂被求导的函数中含有抽象函数被求导的函数不符合求导法则分段函数分段点求导用定义让函数值为 0 的点（如果出现表达式一部分趋于 $x_0$ 时 $f(x)$ 为 0，可以拆成 $(x-x0)*g(x)$ 使用极限运算法则拆开算）连续相关注意点问 $f'(x)$ 是否连续？分段函数分段点处，求非分段点趋向于分段点的极限值是否与分段点处函数值相等，相等即连续（部分情况需要左导数右导数和函数值都进行判断）一般情况先求 $f(x)$ 在分段点和不在分段点的导数的表达式在让非分段点的导数趋于分段点，比较分段点和非分段点的函数值是否相等求分段函数的导数不在分段点：使用导数求导法则直接求在分段点：使用导数的定义进行求解函数有界性判断问题连续函数有界问题闭区间函数 $f(x)$ 连续，则 $f(x)$ 有界开区间函数连续，且在端点处极限存在，函数有界导函数 在有限区间有界，则 $f(x)$ 有界一般情况下， 函数的单调没办法直接推出 $f’(x)>0$ 的例如，函数在某邻域单调增，只能推出导函数 >=0，不能推出 >0，比如 $x^{3}$衍生：$f(x)$ 在 $x_0$ 的某邻域内是凹函数，只能推出 $f''(x)>=0$,例如 $x^{4}$ 不能推出 $f''(x)>0$导函数在某点大于 $0$，不能推出函数在邻域内单调增在二阶可导的情况下，$f’(x_0)>0$，可以推出在 $x_0$ 的邻域内函数单增(二阶导数存在，一阶导函数连续)，二阶导数存在，一阶导数连续（连续就是不会导数突变方向），就可以推出一点导数值大于 0，一定是邻域内其他点导数值也是大于 0 的极限值和函数值无关设函数 $f(x)$ 在区间 $(-1,1)$ 内有定义，且 0 点的极限值等于 0$(A) 当 \mathop{\lim }\limits_{{x \rightarrow 0}}\frac{f\left( x\right) }{\sqrt{\left| x\right| }} = 0,f\left( x\right) 在 x = 0 处可导;$$(B) 当 \mathop{\lim }\limits_{{x \rightarrow 0}}\frac{f\left( x\right) }{{x}^{2}} = 0,f\left( x\right) 在 x = 0 处可导;$A,B 选项中，可以得出，函数在 0 点的极限值等于 0，但是导数的定义式是，$lim_{x->0}\frac{f(x)-f(0)}{x}$，需要知道的是 0 点的函数值，但是选项中只能得出极限值，由于极限值和函数值无关，所以选项全错无穷小与有界量的乘积是仍然是无穷小，例如 $xsin(\frac{1}{x})$例如 $xe^{\frac{1}{x}}$，当 x 趋向于 0 时，极限值不存在，因为是无穷小乘无界量极限存在的充要条件是左右极限存在且相等函数导数的充要条件是左右导数存在且相等导数存在的必要条件是函数连续函数的性态函数单调性$f'(x)>0 => f(x)单调增$$f'(x)>=0 <=> f(x)单调不减$$f(x)单调增加 => f'(x)>=0$极限值大于 0 可以推出函数值大于 0极限值 >=0，不能推出函数值大于等于 0($x^3$)函数值 >=0 或者 >0，可以推出极限值大于 0数列收敛问题证明数列收敛有两种方法单调有界性准则证明数列单调增有上界，或者单调减有下界，单调性证明用做差或者做比夹逼定理通过放缩来计算左右边界的极限趋于同一个值$1^{∞}$当使用 $1^{∞}$ 时候，注意 $limu^v$ 使用过程中需要保证求出的结果不是无穷，一般不要用在分母单独使用数列极限数列求极限过程中要把 $n->x$，把数列极限改写成函数极限，才能用洛必达不要随便在 $e$ 上做等价代换，因为在分式中，分子和分母都有 $e$，如果不统一的话，直接换分子的 $e$ 的指数，就相当于等价后更换 $e$ 指数中加减进行直接等价代换了只有在极限的非零因子(与整个世子是相乘的)的极限可以先求出来判断求数列和的极限用夹逼准则还是定积分定义分母的变化部分和主体部分作比，如果趋向于 0 是次量级那就使用夹逼定理，如果趋向于 1 那就是同量级使用定积分的定义次量级和主体部分相比，可以忽略，不影响极限值，但是如果是同量级，就会影响极限值，夹逼准则无法精准求出$\mathop{\lim }\limits_{{n \rightarrow \infty }}\sqrt[n]{{a}_{1}^{n} + {a}_{2}^{n} + \cdots + {a}_{m}^{n}} = \mathop{\max }\limits_{{1 \leq i \leq m}}{a}_{i}$$\mathop{\lim }\limits_{{n \rightarrow \infty }}\sqrt[n]{1 + {x}^{n} + {\left( \frac{{x}^{2}}{2}\right) }^{n}},\left( {x \geq 0}\right)$ 中，把 1 可以换成 $1,2,3.....,10000$ 就等价于 $1^n+1^n+....1^n$ 结果还是等价于在 $1,x,\frac{x^2}{2}$ 在不同区域的大小数列极限证明方法总结数列极限证明常用不定式对数列求极限过程和函数不定式极限相同，但一定 要把数列极限转换为函数极限（归结原理） ，否则不能直接用洛必达n 项和的数列极限夹逼原理定积分定义n 项连乘的数列极限夹逼原理取对数化为 n 项和递推关系定义的数列先证数列收敛，在求极限先求极限，再证极限为所求极限（一般使用压缩映射原理）使用压缩映射原理时，若求出的极限值比较复杂，则不把极限带入，而是使用 a 带入单调性判定常用方法单调性判定常用有三种方法:(1) 若 ${x}_{n + 1} - {x}_{n} \geq 0\left( { \leq 0}\right)$ ,则 $\left\{ {x}_{n}\right\}$ 单调增 (单调减);(2) 设 $\left\{ {x}_{n}\right\}$ 不变号,若 ${x}_{n} > 0$ ,则当 $\frac{{x}_{n + 1}}{{x}_{n}} \geq 1\left( { \leq 1}\right)$ 时, $\left\{ {x}_{n}\right\}$ 单调增 (单调减);若 ${x}_{n} < 0$ ,则当 $\frac{{x}_{n + 1}}{{x}_{n}} \geq 1\left( { \leq 1}\right)$ 时, $\left\{ {x}_{n}\right\}$ 单调减 (单调增);(3) 设数列 $\left\{ {x}_{n}\right\}$ 由 ${x}_{1} = a,{x}_{n + 1} = f\left( {x}_{n}\right) \left( {n = 1,2,\cdots }\right) ,{x}_{n} \in I$ 所确定,若 $f\left( x\right)$ 在 $I$ 上单调增,则当 ${x}_{1} \leq {x}_{2}$ 时, $\left\{ {x}_{n}\right\}$ 单调增; 当 ${x}_{1} \geq {x}_{2}$ 时, $\left\{ {x}_{n}\right\}$ 单调减;若 $f\left( x\right)$ 在 $I$ 上单调减,则 $\left\{ {x}_{n}\right\}$ 不单调.无穷小阶的比较定义法直接比较（函数两两进行比阶）等价无穷小替换后进行简单比阶洛必达泰勒展开利用定义求出函数的阶数(用 $x^k$ 相比为 1，那么原函数为 k 阶数)求导定阶数（每个都进行求导，相当于降了一阶，再用等价无穷小替换）利用若 $\mathop{\lim }\limits_{{x \rightarrow 0}}\frac{f\left( x\right) }{g\left( x\right) } = 1 ,则 {\int }_{0}^{\varphi \left( x\right) }f\left( t\right) \mathrm{d}t \sim {\int }_{0}^{\varphi \left( x\right) }g\left( t\right) \mathrm{d}t ,其中 \mathop{\lim }\limits_{{x \rightarrow 0}}\varphi \left( x\right) = 0$(不定积分换被积函数)结论: 若 $f\left( x\right)$ 在 x=0 的某邻域内连续,且当 $x \rightarrow 0$ 时 $f\left( x\right)$ 是 $x$ 的 $m$ 阶无穷小,$\varphi \left( x\right)$ 是 $x$ 的 $n$ 阶无穷小,则当 $x\rightarrow0$ 时 $F\left( x\right)={\int }_{0}^{\varphi \left( x\right) }f\left( t\right) \mathrm{d}t$ 是 $x$ 的 $n\left( {m + 1}\right)$ 阶无穷小) 也就是上限函数阶数*（被积函数阶数 +1）间断点的类型判断当 f(x)没有显性给出时候，要注意先求出表达式，在求表达式的过程中可能会先遇到不满足定义域的情况，也就是有些情况下表达式不存在，要在表达式存在的条件下进行讨论，先求出表达式表达式在变型过程中，可能给一个分母乘了一个式子让分式消去，注意这个过程定义域的变化，可能导致有间断点的函数被化简为没有间断点或者间断点减少介值定理、最值定理及零点定理的证明如果遇到函数值$f(x_0)$和极限值$lim_{x->x_0}f(x)$，要能想到极限的保号性或者中值定理证明函数值等于 0 要能想到零点定理若给定值，要能想到最值定理复合函数求导复合函数求导法则：读者不难验证：若 ( $y = g(f(x))$ ) ，则 ( $\frac{\mathrm{d}y}{\mathrm{d}x} \Bigg|_{x=0}$ ) 不存在。设$y = f(u), u = g(x), u_0 = g(x_0)$，如果 $g'(x_0)$和$f'(u_0)$都存在，则$y = f(g(x))$在 ($x_0$ ) 处可导，且$\frac{\mathrm{d}y}{\mathrm{d}x} \Bigg|_{x=x_0} = f'(u_0) \cdot g'(x_0)$ ，如果$g'(x_0)$和$f'(u_0)$至少有一个不存在，则$y=f(g(x))﻿$在$x_0$处并非一定不可导，此时，先求出复合函数$y = f(g(x))$的表达式，然后再进一步考查$y = f(g(x))$在$x_0$处的可导性。25武忠祥《高数辅导讲义》.pdf - p72 - 隐函数求导法一阶导数代公式 ，二 阶导数利用$\frac{\mathrm{d}^2y}{\mathrm{d}x^2}=\frac{\mathrm{d}}{\mathrm{d}t}\Big(\frac{y^{'}(t)}{x^{'}(t)}\Big)\frac{1}{x^{'}(t)}$，注意，二阶导是对x求导，但是上面是关于t的导数，对x不能直接求，所以要先对t求导，然后再$\frac{dt}{dx}=\frac{1}{\frac{dx}{dt}}$25武忠祥《高数辅导讲义》.pdf - p73 - 参数方程求导法在参数方程涉及到求斜率的方程中，因为斜率是$\frac{dy}{dx}$,参数方程是关于t的方程，所以要注意将 对t的导数换成对x的 ，注意，二阶导中，$\frac{dy}{dx}$也就是$\frac{y'(t)}{x'(t)}$,$\frac{d{\frac{y(t)}{x(t)}}}{dx^2}$就是$\frac{y'(t)}{x'(t)}$再次对x求导，然后再$\frac{dt}{dx}$也就是$\frac{1}{\frac{dt}{dx}}$，总的来说，公式整理后就是$\frac{\mathrm{d}^2y}{\mathrm{d}x^2}=\frac{y^{\prime\prime}(t)x^{\prime}(t)-x^{\prime\prime}(t)y^{\prime}(t)}{x^{\prime3}(t)}$反函数的导数反函数的导数，因为$\varphi^{'}(y)=\frac{\mathrm{d}x}{\mathrm{d}y}=\frac{1}{\frac{\mathrm{d}y}{\mathrm{d}x}}=\frac{1}{f^{'}(x)}$,$\varphi''(y)=\frac{\mathrm{d}}{\mathrm{d}x}\biggl[\frac{1}{f'(x)}\biggr]\bullet\frac{\mathrm{d}x}{\mathrm{d}y}=-\frac{f''(x)}{\bigl[f'(x)\bigr]^2}\bullet\frac{1}{f'(x)}$注意：$\frac{dx}{dy}=\frac{1}{\frac{dy}{dx}},但\frac{d^{2}x}{dy^{2}}\neq\frac{1}{\frac{d^{2}y}{dx^{2}}}$常用的高阶导数$(e^{ax+b})^{(n)}=a^ne^{ax+b}$$\sin(ax+b)^{(n)}=a^{n}\sin(ax+b+\frac{n\pi}2)$$\cos(ax+b)^{(n)}=a^{n}\cos(ax+b+\frac{n\pi}2)$$\ln(ax+b)^{(n)}=(-1)^{n-1}(n-1)!\frac{a^n}{(ax+b)^n}$$(\frac1{ax+b})^{(n)}=(-1)^nn!\frac{a^n}{(ax+b)^{n+1}}$$(\frac{c}{ax+b})^{(n)}=(-1)^{n}cn!\frac{a^{n}}{(ax+b)^{n+1}}$常见的转换：正弦函数和余弦函数三角恒等式转换和角公式:$\sin(x+y) = \sin x \cos y + \cos x \sin y$$\cos(x+y) = \cos x \cos y - \sin x \sin y$差角公式:$\sin(x-y) = \sin x \cos y - \cos x \sin y$$\cos(x-y) = \cos x \cos y + \sin x \sin y$倍角公式:$\sin 2x = 2 \sin x \cos x$$\cos 2x = \cos^2 x - \sin^2 x = 2 \cos^2 x - 1 = 1 - 2 \sin^2 x$半角公式:$\sin \frac{x}{2} = \pm \sqrt{\frac{1 - \cos x}{2}}$$\cos \frac{x}{2} = \pm \sqrt{\frac{1 + \cos x}{2}}$余弦到正弦的转换:$\sin x = \cos \left(\frac{\pi}{2} - x \right)$正弦到余弦的转换:$\cos x = \sin \left(\frac{\pi}{2} - x \right)$正弦和余弦的周期性:$\sin(x + 2\pi k) = \sin x$$\cos(x + 2\pi k) = \cos x$其中 ( k ) 是任意整数。正弦和余弦的奇偶性:$\sin(-x) = -\sin x$（奇函数）$\cos(-x) = \cos x$（偶函数）高阶导数前两种主要用来求n阶导函数，泰勒公式用来求某点的导数公式法归纳法泰勒公式‍
思源笔记搭建过程中出现了一些问题version: "3.9" services: main: image: b3log/siyuan command: ['--workspace=/siyuan/workspace/', '--accessAuthCode=${AuthCode}'] user: '1000:1000' ports: - 6806:6806 volumes: - /siyuan/workspace:/siyuan/workspace restart: unless-stopped environment: # A list of time zone identifiers can be found at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - TZ=${TimeZone} 在这个里面，就算按照教程来，但是一直显示文件夹路径不合法，改了权限和都没什么用，最后好像说是是思源笔记的路径本来就有点问题，所以直接把数据库的卷挂载在自己想存储的目录version: "3.9" services: main: image: b3log/siyuan # 使用的镜像源名称 container_name: SiYuan # 设置容器名称 command: [ "--workspace=/home/user/SiYuan/workspace/", "--accessAuthCode=xxxx!" # 官方设置的容器内的数据存放路径与认证码 ] user: '1000:1000' volumes: - "/home/user/SiYuan/workspace:/home/siyuan" network_mode: "host" ports: - "6806:6806" restart: always # 容器自动重启 environment: - LANG=zh_CN
大数据计算模式机器代表作品分布式文件系统物理结构分布式文件系统在物理结构上是由计算机集群中的多个节点构成的，如图3-2所示。这些节点分为两类：主节点（名称节点）：文件目录的创建、删除、重命名，管理数据节点和文件块的映射关系。客户端只有访问名称节点才能找到请求的文件块所在的位置，进而到相应位置读取所需文件块。从节点（数据节点）：负责数据的存储和读取。在存储时，由名称节点分配存储位置，然后由客户端把数据直接写入相应数据节点；在读取时，客户端从名称节点获得数据节点和文件块的映射关系，到相应位置访问文件块。数据节点也要根据名称节点的命令创建、删除和复制数据块。HDFS 副本存放策略(1)在集群内发起写操作请求，则把第1个副本放置在发起写操作请求的数据节点上，实现就近写入数据。在集群外发起写操作请求，则从集群内部挑选一台磁盘空间较为充足、CPU不太忙的数据节点，作为第1个副本的存放地。(2)第2个副本会被放置在与第1个副本不同的机架的数据节点上。(3)第3个副本会被放置在与第1个副本相同的机架的其他节点上。(4)如果还有更多的副本，则继续从集群中随机选择数据节点进行存放。Shuffle过程(1)在Map端的Shuffle过程Map任务的输出结果首先被写入缓存，当缓存满时，就启动溢写操作，把缓存中的数据写入磁盘文件，并清空缓存。当启动溢写操作时，首先需要对缓存中的数据进行分区，然后对每个分区的数据进行排序和合并，再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件，随着Map任务的执行，磁盘中就会生成多个溢写文件。在Map任务全部结束之前，这些溢写文件会被归并成一个大的磁盘文件，然后通知相应的Reduce任务来“领取”属于自己处理的数据。(2)在Reduce端的Shuffle过程Reduce任务从Map端的不同Map机器“领取”属于自己处理的那部分数据，然后对数据进行归并后交给Reduce处理。WordConunt设计思路分片（Splitting）阶段：一个大文件被切分成多个分片，分配到多个不同的机器上。每个机器上的Map任务负责处理分配给它的那一部分数据。Map阶段：在Map任务中，输入被默认处理为键值对形式，其中键是文件的行号，值是对应的行内容。Map任务解析每行的内容，识别出单词，并输出键值对，格式为<单词，1>，表示这个单词出现一次。Shuffle阶段：Map阶段的输出经过排序和分区处理，转换成<key, value-list>的形式，例如<hadoop, [1, 1, 1, 1, 1]>。这表明单词"hadoop"出现了五次。Reduce阶段：Reduce任务接收来自Shuffle阶段的中间结果，开始进行汇总计算。每个Reduce任务负责一部分数据的汇总，计算每个单词的最终频数，并将这些结果输出到分布式文件系统中。Spark主要具有如下优点。(l)Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作，还提供了多种数据集操作类型，编程模型比MapReduce更灵活。(2)Spak提供了内存计算，中间结果直接放到内存中，带来了更高的迭代运算效率。(3)Spark基于DAG的任务调度执行机制，要优于MapReduce的迭代执行机制。Spark各种概念之间的相互关系在Spark中，一个应用(Application)由一个任务控制节点(Driver)和若干个作业(Job)构成，一个作业由多个阶段(Stage)构成，一个阶段由多个任务(Task)组成。当执行一个应用时，任务控制节点会向集群管理器(Cluster Manager)申请资源，启动Executor,并向Executor发送应用程序代码和文件，然后在Executor上执行任务，运行结束后执行结果会返回给任务控制节点，或者写到HDFS或者其他数据库中。流计算与HadoopHadoop作为大数据技术的事实标准，主要依靠MapReduce和HDFS来支撑大规模的分布式存储和处理。然而，Hadoop的MapReduce模型主要适用于批量数据处理，不适合流计算的实时需求。尽管可以通过小批量处理来减少延迟，这种方法会增加处理开销和复杂度，降低系统的可维护性和用户程序的可伸缩性。因此，业界已经开发了许多专门的实时流数据处理系统来满足这些需求。1、编程实现文件合并和去重操作对于两个输入文件，即文件 A 和文件 B，请编写 MapReduce 程序，对两个文件进行合并，并剔除其中重复的内容，得到一个新的输出文件 C。下面是输入文件和输出文件的一个样例，供参考。输入文件A的样例如下：20150101 x 20150102 y 20150103 x 20150104 y 20150105 z 20150106 x输入文件B的样例如下：20150101 y 20150102 y 20150103 x 20150104 Z 20150105 y根据输入文件A和B合并得到的输出文件C的样例如下：20150101 x 20150101 y 20150102 y 20150103 x 20150104 y 20150104 z 20150105 y 20150105 z 20150106 x参考代码public class MyTest { public static class Map extends Mapper<Object, Text, Text, Text> { private static Text text = new Text(); public void map(Object key, Text value, Context context) { text = value; context.write(text, new Text("")); } } public static class Reduce extends Reducer<Text, Text, Text, Text> { public void reduce(Text key, Iterable<Text> values, Context context) { context.write(key, new Text("")); } } }2、编写MapReduce程序实现对输入文件的排序现在有多个输入文件，每个文件中的每行内容均为一个整数。要求读取所有文件中的整数，进行升序排序后，输出到一个新的文件中，输出的数据格式为每行两个整数，第一个数字为第二个整数的排序位次，第二个整数为原待排列的整数。下面是输入文件和输出文件的一个样例供参考。输入文件 1 的样例如下：33 37 12 40输入文件 2 的样例如下：4 16 39 5输入文件 3 的样例如下：1 45 25输出结果如下：1 1 2 4 3 5 4 12 5 16 6 25 7 33 8 37 9 39 10 40 11 45public class MyTest { public static class Map extends Mapper<Object, Text, IntWritable, IntWritable> { private static IntWritable data = new IntWritable(); public void map(Object key, Text value, Context context) { String text = value.toString(); data.set(Integer.parseInt(text)); context.write(data, new IntWritable(1)); } } public static class Reduce extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable> { private static IntWritable line_num = new IntWritable(1); public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) { for (IntWritable val : values) { context.write(line_num, key); line_num = new IntWritable(line_num.get() + 1); } } } }3、编写 MapReduce 程序实现求平均值每个输入文件表示学生某门课程的成绩，输入文件中每行内容由两个字段组成，第一个字段是学生姓名，第二个字段是学生的成绩；编写 MapReduce 应用程序求出所有学生的平均成绩，并输出到一个新文件中。下面是输入文件和输出文件的一个样例，供参考。输入文件(AlgorithmScore)的样例如下：XiaoMing 92 XiaoHong 87 XiaoXin 82 XiaoLi 90输入文件(DataBaseScore)的样例如下：XiaoMing 95 XiaoHong 81 XiaoXin 89 XiaoLi 85输入文件(PythonScore)的样例如下：XiaoMing 82 XiaoHong 83 XiaoXin 94 XiaoLi 91输出结果如下：XiaoHong 83.67 XiaoLi 88.67 XiaoMing 89.67 XiaoXin 88.33public class MyTest { public static class MyMapper extends Mapper<Object, Text, Text, FloatWritable> { private Text stuName = new Text(); private FloatWritable stuScore = new FloatWritable(); public void map(Object key, Text value, Context context) { String[] line = value.toString().split(" "); this.stuName.set(line[0]); this.stuScore.set(Float.parseFloat(line[1])); context.write(this.stuName, this.stuScore); } } public static class MyReducer extends Reducer<Text, FloatWritable, Text, FloatWritable> { private FloatWritable avgScore = new FloatWritable(); public void reduce(Text key, Iterable<FloatWritable> values, Context context) { int num = 0; float sum = 0; float avg = 0; for (FloatWritable val : values) { sum += val.get(); num++; } avg = sum / num; BigDecimal b = new BigDecimal(avg); avgScore.set(b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue()); context.write(key, avgScore); } } }1、编写 Spark 独立应用程序实现数据去重对于两个输入文件 A 和 B，编写 Spark 独立应用程序，对两个文件进行合并、剔除其中重复的内容并排序，并输出到终端中。下面是输入文件和输出结果的一个样例，供参考。输入文件A的样例如下：20150101 x 20150102 y 20150103 x 20150104 y 20150105 z 20150106 x输入文件B的样例如下：20150101 y 20150102 y 20150103 x 20150104 Z 20150105 y根据输入文件A和B合并得到的输出文件C的样例如下：20150101 x 20150101 y 20150102 y 20150103 x 20150104 y 20150104 z 20150105 y 20150105 z 20150106 xobject MyTest { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("MyTest").setMaster("local") val sc = new SparkContext(conf) val data = sc.textFile("file:///home/hadoop/myfile") val rdd1 = data.map(line => (line, "")) val rdd2 = rdd1.groupByKey() val rdd3 = rdd2.sortByKey() val rdd4 = rdd3.keys rdd4.foreach(println) } }2、编写 Spark 独立应用程序实现整合排序对于两个输入文件 A 和 B，编写 Spark 独立应用程序，对两个文件进行合并、剔除其中重复的内容并排序，并输出到终端中。下面是输入文件和输出结果的一个样例，供参考。输入文件 1 的样例如下：33 37 12 40输入文件 2 的样例如下：4 16 39 5输入文件 3 的样例如下：1 45 25输出结果如下：1 1 2 4 3 5 4 12 5 16 6 25 7 33 8 37 9 39 10 40 11 45object MyTest { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("MyTest").setMaster("local") val sc = new SparkContext(conf) val data = sc.textFile("file:///home/hadoop/myfile", 1) val rdd1 = data.map(line => (line.toInt, "")) val rdd2 = rdd1.partitionBy(new HashPartitioner(1)) val rdd3 = rdd2.sortByKey() val rdd4 = rdd3.keys var index = 0 val rdd5 = rdd4.map(t => { index = index + 1 (index, t) }) rdd5.foreach(t => println(t._1 + " " + t._2)) } }3、编写 Spark 独立应用程序实现求平均值每个输入文件表示学生某门课程的成绩，输入文件中每行内容由两个字段组成，第一个字段是学生姓名，第二个字段是学生的成绩；编写 Spark 独立应用程序求出所有学生的平均成绩，并输出到终端中。下面是输入文件和输出结果的一个样例，供参考。输入文件(AlgorithmScore)的样例如下：XiaoMing 92 XiaoHong 87 XiaoXin 82 XiaoLi 90输入文件(DataBaseScore)的样例如下：XiaoMing 95 XiaoHong 81 XiaoXin 89 XiaoLi 85输入文件(PythonScore)的样例如下：XiaoMing 82 XiaoHong 83 XiaoXin 94 XiaoLi 91输出结果如下：XiaoHong 83.67 XiaoLi 88.67 XiaoMing 89.67 XiaoXin 88.33object MyTest { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("MyTest").setMaster("local") val sc = new SparkContext(conf) val data = sc.textFile("file:///home/hadoop/myfile") val rdd1 = data.map(line => line.split(" ")) val rdd2 = rdd1.map(t => (t(0), t(1).toInt)) val rdd3 = rdd2.mapValues(x => (x, 1)) val rdd4 = rdd3.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2)) val rdd5 = rdd4.mapValues(x => x._1.toDouble / x._2) rdd5.foreach(t => { val x = t._2 println(t._1 + " " + f"$x%1.2f") }) } }