ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

云服务器部署全流程:从选购到上线,SSH、Nginx与HTTPS实战指南

2026/9/20 10:46:38 拓冰建站 浏览量
云服务器部署全流程:从选购到上线,SSH、Nginx与HTTPS实战指南 芯飞云服务器我之前也折腾过一阵子从选购、SSH连接、环境配置到项目正式上线跑通整个过程踩了不少坑也沉淀了不少经验。很多朋友买了服务器之后就卡在连上机器这一步或者好不容易连上了又不知道接下来该怎么把代码弄上去、让程序稳定跑起来。这篇东西我就把整个过程从头到尾捋一遍从你拿到一台全新的云服务器开始一直到项目真正上线、能对外提供服务为止中间涉及的选型思路、操作命令、常见报错和排查方法一次讲清楚。1. 选机器和登录之前先想清楚这几件事很多人买完服务器就直接开始敲命令了其实登录之前有几件事想清楚能省下后面一大堆麻烦。1.1 买一台什么样的服务器才够用芯飞云的服务器配置选择和其他云厂商类似核心就是CPU、内存、带宽、磁盘这几项。拿我自己的经验来说如果你是跑一个中小型Web项目、个人博客、小程序后端接口2核4G的配置是比较舒服的起步档位。1核2G不是不能跑但装了基础环境之后剩余资源会比较紧张Node或者Java应用一启动内存很容易吃满到时候排查起来很头疼。带宽这块容易被忽略。云服务器的带宽决定了用户访问你的项目时数据传输的上限。如果是图片、视频类应用带宽小会直接卡死如果是纯API接口或者管理后台5Mbps基本够用。注意这里说的带宽是公网出口带宽跟机房内网带宽是两码事。磁盘的话系统盘建议至少40G起步数据盘看业务量再挂。顺手提醒一句购买时看清套餐里系统盘是什么类型SSD和普通云盘在IOPS上差距还是挺明显的数据库应用尤其敏感。1.2 安全组和防火墙很多人上不了线的第一道坎这里必须重点强调因为太多人栽在这上面。你在云控制台买完机器默认情况下可能只开放了22端口有的甚至22都不开你的程序跑起来监听8080、3000但外部就是访问不到。这不是程序代码的问题而是云平台的安全组策略没有放行对应端口。有人会混淆云平台的安全组和系统内部的防火墙规则。安全组是云厂商那一层做的流量过滤系统防火墙如firewalld或者iptables是操作系统内部的过滤两层都要放行才行。实际操作中建议这样处理在芯飞云控制台找到安全组或防火墙入口添加入站规则放行你需要对外的端口比如80HTTP、443HTTPS以及你的应用端口。系统内部如果装了firewalld执行firewall-cmd --list-ports查看当前放行列表没有的话就添加。如果你用的是Ubuntu且没有装额外防火墙那system层面的限制主要靠云安全组来控制。提示22端口是SSH登录端口无论如何要放行但为了安全建议修改默认端口或做密钥登录后面详细说。2. SSH连接别再用密码裸奔密钥登录一次配好拿到服务器的第一件事自然是登录上去。SSHSecure Shell是Linux服务器远程管理的标准方式它的原理简单说就是客户端和服务端通过加密通道通信整个过程传输的数据都是加密的比Telnet那种明文协议安全得多。2.1 从本地连上服务器的三种方式先说最基础的密码登录。以Linux或macOS本地的终端为例ssh root你的服务器IPWindows用户可以在PowerShell里执行同样的命令也可以使用VSCode的Remote-SSH插件、Xshell、FinalShell等工具。VSCode连服务器做开发这几年非常流行配置好后本地写代码、远程跑程序体验很接近在本地开发而且不占本地资源。执行后会提示输入密码输入root密码回车就能进到服务器的shell环境。第一次连如果遇到Host key verification failed的提示通常是你本机的known_hosts里记录过这台服务器的指纹但指纹对不上一般重装系统后会遇到删掉known_hosts对应行或整个文件就能解决。2.2 密钥登录配置全程密码登录虽然简单但长期用风险不小。服务器每天都会被各种扫描工具探测攻击如果你的密码不够复杂被暴力破解只是时间问题。密钥登录会安全很多。密钥对的工作原理是本地生成一对密钥公钥 私钥把公钥放到服务器上登录时服务器用公钥验证你的私钥私钥不通过网络传输所以不会在网络传输过程中被截获。具体操作如下# 在本地执行生成密钥对 ssh-keygen -t ed25519 -C 你的备注信息一路回车即可默认生成在~/.ssh/id_ed25519。ed25519算法比传统的RSA更短更快安全性也更好。然后把公钥传到服务器上ssh-copy-id root你的服务器IP或者手动把~/.ssh/id_ed25519.pub的内容追加到服务器的~/.ssh/authorized_keys文件里。之后再用SSH登录就不需要密码了。为了安全考虑密钥配置好以后可以在服务器的sshd_config中设置PasswordAuthentication no彻底禁用密码登录。这一步做完你的服务器在防暴力破解这一关上就稳了一大截。2.3 VSCode远程开发的体验优化如果你主要用VSCode开发可以装好 Remote-SSH 插件配置好 SSH config 文件。大概是这样Host my-server HostName 你的服务器IP User root Port 22 IdentityFile ~/.ssh/id_ed25519配置好以后VSCode左侧会出现远程资源管理器点连接就能直接在服务器上打开文件夹、装插件、开终端。这个模式下本地只负责渲染界面编译、运行全部在服务器上完成。对于想在一台高配服务器上跑程序但又不想折腾命令行的人来说这种开发方式非常顺手。3. 拿到一台裸机之后系统初始化到底要做什么服务器刚装好系统基本就是一台裸机里面只有最基础的内核和工具真正要让项目跑起来还得做几项初始化工作。这个过程别嫌麻烦很多后续问题都是初始化没做导致的。3.1 更新软件源和基础软件以Ubuntu为例登录后第一件事是把软件源索引降到最新并升级系统软件包apt update apt upgrade -yapt update是从软件源拉取软件列表apt upgrade是真正更新已安装的软件。部分云厂商会提供内网镜像源速度会快不少芯飞云的控制台一般会给出对应的源配置方法如果你是海外节点默认源速度尚可如果是国内节点可以换成清华、阿里或者厂商提供的内网源。基础软件方面curl、wget、git、vim这些是必需品apt install -y curl wget git vim unzip这里提醒一下vim需要一段时间适应但服务器上改配置文件是家常便饭不会用的话至少学会i进入编辑模式、:wq保存退出、Esc退出编辑模式这几个键能覆盖大部分使用场景。3.2 创建部署用户与目录规划长期用root直接部署项目对运维来说是大忌。root权限过大一旦应用被入侵攻击者直接拿到系统最高权限。更稳妥的做法是创建一个普通用户用于日常操作和运行项目adduser deploy usermod -aG sudo deploydeploy是用户名你自己可以定义。加入sudo组后需要管理员权限时用sudo前缀提权平时以普通用户身份操作。所有Web项目建议放在同一个根目录下比如/var/www或者/home/deploy/apps后续的项目、日志、备份都围绕这个目录来组织路径清晰了排查问题也快。3.3 时间同步别忽略服务器时间不准会导致日志时间错乱、HTTPS证书校验失败、数据库事务时间异常。云服务器一般默认带systemd-timesyncd或chrony来做时间同步。Ubuntu下可以确认一下timedatectl输出里有System clock synchronized: yes就说明时间在正常同步。如果显示no执行timedatectl set-ntp true打开NTP同步即可。很多人部署完发现日志时间对不上往往就是这一步没检查。4. 把程序跑起来语言环境、依赖与进程守护系统准备就绪接下来才是核心环节——把代码跑起来。不同语言有不同的环境安装方式但核心链路是一致的装运行时 → 拉代码装依赖 → 启动 → 守护进程。4.1 安装运行环境以Node.js和Python为例Node.js项目的环境安装比较推荐用nvmNode Version Manager来管理版本好处是切换版本方便不需要root权限。安装方式curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash装完重新加载shell配置然后安装你项目需要的Node版本nvm install 18 nvm use 18Python 项目在 Ubuntu 22.04 以上系统默认带的python3就能用但记得装python3-venv创建虚拟环境避免项目依赖污染系统的Python环境apt install -y python3-venv python3-pip python3 -m venv /home/deploy/apps/myapp/venvJava项目直接装OpenJDK即可apt install -y openjdk-17-jdk然后配好JAVA_HOME环境变量。注意不要为了图省事就直接用系统自带的python命令Ubuntu 上python默认可能不存在要用python3。习惯性的python xxx.py会报错说找不到命令这类问题排查起来让人怀疑人生。4.2 用systemd守护进程告别nohup裸奔很多新手部署项目时会用nohup node app.js 这种后台启动方式nohup 的意思是忽略挂断信号让进程在退出终端后继续运行。它确实能跑但不优雅进程宕了不会自动重启、开机不会自动启动、日志管理也麻烦。正确做法是用 systemd 来管理应用进程。以Node项目为例在/etc/systemd/system/myapp.service里写一个服务单元文件[Unit] DescriptionMy App Service Afternetwork.target [Service] Userdeploy WorkingDirectory/home/deploy/apps/myapp ExecStart/home/deploy/.nvm/versions/node/v18.20.0/bin/node app.js Restartalways RestartSec5 EnvironmentNODE_ENVproduction [Install] WantedBymulti-user.target然后重新加载systemd并启动服务systemctl daemon-reload systemctl enable --now myappenable是设置开机自启--now是立即启动。之后查看运行状态systemctl status myapp在这个体系里进程异常退出后Restartalways会在5秒后自动拉起这比手动重启要可靠得多。你还可以用journalctl -u myapp -f实时查看应用日志排查问题方便不少。4.3 进程管理中的常见误区我之前碰到过一个情况程序启动后报端口已被占用原因是之前手动启动的那个进程没杀掉。排查时可以这样lsof -i:3000 kill -9 进程PID或者fuser -k 3000/tcp直接杀掉占用进程。另一个常见问题是权限如果你用root启动了程序它会生成root属主的日志文件之后切换成普通用户去运行可能因为没写权限而直接崩溃。所以强烈建议从一开始就统一用同一用户运行服务。5. 从本地上到线上Git部署与前端构建程序本地跑通了接下来要把代码弄到服务器上。常见方法有三种直接在服务器上git clone、用rsync同步文件、走CI/CD流水线。这里重点讲Git部署的完整链路。5.1 Git仓库与服务器拉取代码如果你的代码在GitHub、GitLab、Gitee等平台上服务器上直接执行git clone 仓库地址但这里有个很现实的痛点很多仓库是私有的。首次拉取会让你输入账号密码现在主流平台都要求用Token代替密码。建议在服务器上配置部署密钥Deploy Key只读权限专门用于拉代码。以GitHub为例在服务器执行ssh-keygen -t ed25519 -C deploy-key把生成的公钥内容添加到GitHub仓库的 Deploy keys 里之后git clone gitgithub.com:用户名/仓库名.git就能免密拉取。5.2 前端项目构建与静态文件伺服前端项目Vue、React等部署和纯后端不太一样本地写好代码后要打包成静态文件然后让Web服务器伺服这些文件。构建过程和本地一致在服务器上执行npm install npm run build构建产物通常在dist或build目录。这一步在服务器上做的好处是环境一致避免本地构建产物和服务器不兼容的问题。静态文件用什么伺服最经典的方案是Nginx。它的核心作用是接收浏览器请求定位到静态文件并返回。配置大概长这样server { listen 80; server_name yourdomain.com; root /home/deploy/apps/myapp/dist; index index.html; }前端项目还有一个经典问题history路由模式刷新404。Vue Router和React Router在history模式下刷新某个二级路径时Nginx找不到对应的静态文件会报404。解决办法是配置try_files让所有路径都回退到index.htmllocation / { try_files $uri $uri/ /index.html; }5.3 后端接口与反向代理如果你的项目是前后端分离架构后端API跑在某个端口上比如3000用户不能直接访问3000端口而是要通过Nginx做反向代理转发。为什么这么做一是安全。后端服务不用直接暴露对公网只需要监听内网地址或者只被Nginx访问。二是灵活。你可以随时切换后端端口、流量分发、拦截请求、加访问控制都在Nginx这层做。对应的Nginx配置location /api/ { proxy_pass http://127.0.0.1:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }这里注意proxy_pass末尾是否带/会导致路径拼接方式不同带斜杠表示把/api前缀去掉再转发不带斜杠则原样转发。这个细节很容易踩坑我踩过一次之后就把这两个行为的差异刻进脑子里了。6. 项目上线前的安全检查与HTTPS项目能跑了还不能急着说上线。有几个安全动作必须做否则后面出了问题再补救就晚了。6.1 防火墙规则梳理再次确认安全组和系统防火墙的放行规则。原则是只放行必要的端口其他一律关闭。22端口如果改成非默认端口安全组和防火墙都要同步修改。按我的经验至少要把fail2ban这类的防爆破工具装上它能监控登录日志多次失败后自动封禁攻击者的IPapt install -y fail2ban配置好/etc/fail2ban/jail.local启用对SSH和Web服务的保护。装完后你会看到攻击日志里一堆被封禁的IP心里踏实不少。6.2 HTTPS证书配置别让用户看到不安全现在已经2025年了没有HTTPS的网站会被浏览器直接警告给用户极差的信任感。证书的申请现在很方便Lets Encrypt 的免费证书完全够用。用certbot一键签发apt install -y certbot python3-certbot-nginx certbot --nginx -d yourdomain.com前提是你的域名已经解析到这台服务器且80端口能被访问。证书签发后certbot会自动修改Nginx配置启用HTTPS并设置定时自动续期任务。这里要提醒一句如果服务器时间没同步好证书校验会失败报证书尚未生效之类的错所以之前说的第三步时间同步非常重要。6.3 数据备份不能等数据丢了才想起来服务器上的数据分为代码和数据库两类。代码有Git仓库就不怕丢数据库则需要定期导出。写一个简单的备份脚本扔到crontab里#!/bin/bash BACKUP_DIR/home/deploy/backups DATE$(date %Y%m%d) mysqldump -u root mydb $BACKUP_DIR/mydb_$DATE.sql find $BACKUP_DIR -name *.sql -mtime 7 -delete这段脚本的意思是把数据库导出到备份目录并保留7天的备份。find ... -mtime 7 -delete是删除7天前的文件防止磁盘被备份文件占满。光在服务器本地备份还不够有条件的话把备份文件再用rclone之类的工具同步到对象存储或者其他机器上做到异地冗余。7. 上线后一定会遇到的坑命令找不到、端口不通、内存爆炸项目上线跑起来只是开始真实世界中会遇到一堆莫名其妙的问题。这些坑我基本都踩过挑几个高频的展开说说排查思路。7.1 无法将xxx识别为cmdlet、函数、脚本文件或可运行程序的名称这是Windows用户在PowerShell里常遇到的报错核心原因是系统PATH环境变量里没有配置你调用的程序路径。安装了Node.js、Git之后安装程序通常会自动写入PATH但如果你用的是一些绿色版/压缩包解压的工具或者修改过系统环境变量就可能导致路径失效。解决方法有两种思路一种是找到程序的实际安装路径加到系统的PATH环境变量里另一种是用完整路径调用。判断是不是这个问题可以先执行where.exe node能输出路径说明Node能正常找到没输出则说明不在PATH里。注意修改环境变量后要重新打开终端才会生效。类似的在Linux终端里如果提示bash: xxx: command not found问题本质也差不多要么没安装要么安装路径不在PATH里。先用which xxx看看不行再apt install xxx。7.2 端口不通的排查链路项目明明在跑但外部就是访问不了。这种问题排查时我习惯从链路的最外层往内层逐层检查先在服务器本地确认进程是否监听ss -lntp | grep 3000再看看防火墙规则firewall-cmd --list-ports再确认安全组是否放行。第4步容易被忽略你的程序是否绑定到了正确的IP地址上。如果代码里监听的是127.0.0.1那外部网络根本连不上必须监听0.0.0.0才能真正对外提供服务。很多框架在配置时有一个host参数默认值可能就是127.0.0.1这就是本机能访问别人访问不了的最常见原因。7.3 内存与Swap小配置服务器的自救2G内存的服务器跑几个服务后内存可能就吃紧了。现象是进程莫名的OOMOut of Memory被杀系统卡顿查询慢。检查当前内存状态free -h如果你发现free显示的available很低可以考虑配置Swap交换分区让系统在物理内存吃紧时把一些不常用的内存数据挪到磁盘上虽然性能比物理内存差很多但至少不会直接OOM。创建Swap的经典流程fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile再写入/etc/fstab让它在开机时自动挂载。注意Swap是应急之策如果你的应用真的一直需要大量内存加内存才是根本解法。写在最后的一点体会从买服务器到项目上线这个过程对新手来说确实有一点点复杂但整套链路你完整走一遍之后很多东西就一通百通了。说到底云服务器上部署项目就是三件事让计算机把代码跑起来、让外部能访问到它、让它出问题时能自己恢复。SSH、systemd、Nginx、防火墙、HTTPS这些工具都是老老实实的每个工具的文档都很完善你只需要把串联关系搞明白。如果你问我有什么建议是最值得推荐的我还是想说从第一台服务器开始就坚持用普通用户运行应用、用密钥登录、用systemd管理服务、配置好Nginx反向代理。这些看起来多花了几分钟时间的事情实际上能让你在后续的维护中省下数不清的时间。至于其他细节遇到问题了再查在实战中积累的经验往往比看十天教程都更有用。最后再分享一个小技巧平时多看看服务器上的系统日志/var/log/syslog、journalctl这些日志文件里就隐藏着很多你还没发现的隐患。每天或者每周花几分钟瞄一眼长期坚持下来很多问题你会在它爆发成故障之前就提前发现这才是老手和新手之间最大的区别。