印象里我第一次买云服务器,在购买页面上来回纠结了快两个小时,生怕点错一个选项就多扣一笔钱。买完之后又陷入下一个问题:怎么连上去?连上去之后装nginx,光一个安装包就折腾了一晚上,搜索引擎开了十几个标签页,最后还是靠各路博客拼凑出完整步骤。所以这篇内容我不打算绕弯子,目标只有一个:帮新手把“买服务器—连服务器—装nginx”这条链路走通,每一步给你可以直接照抄的命令、配置和操作顺序,顺带把我踩过的坑也放进来,能少走一点是一点。
这篇文章适合三种人:第一次买云服务器、还在选型和下单阶段犹豫的人;已经买到服务器但连不上、卡在SSH连接这一步的人;以及服务器能连上但不知道nginx怎么装、装完不知道怎么配置的人。老手可以直接跳到第四节、第五节看编译安装和配置思路,新手建议从头到尾过一遍,全程大概需要一两个小时,跟着操作就能把一台能对外服务的nginx服务器跑起来。
1. 买服务器之前,先把这三件事想清楚
购买云服务器本身不难,难的是在下单之前把需求想清楚。很多人买完才发现内存不够用、地域选错了、系统镜像不是自己熟悉的,这时候换配置、换系统、迁移数据,每一项都是额外成本。
1.1 配置怎么选:CPU、内存、带宽和硬盘的关系
云服务器的常规配置参数有四个:CPU核数、内存大小、带宽、硬盘容量。很多新手只看CPU核数,但实际运行中内存往往才是最先卡脖子的。
跑一个纯nginx静态网站,1核1G都够用,nginx本身的内存占用可以控制在几十兆;但如果你打算在上面装Java、Tomcat、MySQL、Redis这一套,那内存预算至少要按4G起步。我的个人建议:
| 使用场景 | 参考配置 | 说明 |
|---|---|---|
| 纯静态网站、nginx学习、轻量脚本 | 1核2G | 最低配也能跑,带宽选小一点没问题 |
| 个人博客、小型Web应用 | 2核4G | 最稳妥的新手起步配置 |
| 小型团队内部系统、生产环境 | 4核8G | 预留涨业务的空间,不至于频繁迁移 |
| 高并发、对外API服务 | 8核16G以上,建议多台 | 单机堆配置性价比很低,后续应该考虑集群 |
带宽是另一个容易被忽略的坑。带宽决定网站对外访问的速度,但它和运行性能无关,只影响流量进出。个人项目选固定带宽3M到5M就够用了;如果用户规模大、视频图片多,流量计费模式会更划算,但新手阶段很难预估流量,我建议先选固定带宽,用量稳定后再切换计费方式。
硬盘容量相对简单,系统盘40G到60G足够应付Linux系统和nginx,后续如果磁盘不够,云平台一般支持在线扩容。不过扩容操作需要在控制台里做,还要扩展分区,建议买的时候就稍微留宽裕一点。
1.2 地域怎么选:延迟、备案和访问速度的取舍
地域选择这个问题,很多人会直觉地选“离自己近”的节点。对国内用户来说,选国内节点(比如北京、上海、广州等地域)确实延迟低,但买国内节点意味着如果要在上面绑定域名提供网站服务,通常需要完成网站备案流程,这个过程需要预留时间。海外节点(比如香港、新加坡等)不需要备案,购买后即开即用,但跨地域网络访问可能会存在一些延迟波动。
我的建议是:如果只是自己学习、测试、跑个API服务,优先选国内节点就近购买,延迟低、连接稳定;如果是为了快速上线一个不需要备案的站点,或者面向海外用户提供服务,再考虑香港或海外节点。
这里还有个细节:选地域时尽量考虑云平台的数据中心分布,同一个地域内不同可用区(可用区A、B、C)之间的内网是互通的,但跨地域走公网流量是要计费的。多台服务器如果要做内网互通,比如nginx和后端应用分离部署,就一定要选同一个地域。
1.3 系统镜像:Ubuntu还是CentOS
系统镜像的选择直接影响后面每一步操作。现在主流云平台都支持Ubuntu、CentOS/AlmaLinux、Rocky Linux、Debian、Windows Server等系统镜像。
我的推荐优先级是:Ubuntu 22.04 LTS 或 24.04 LTS。原因是apt包管理工具对新手非常友好,nginx、vim、git这些常用软件一条命令就能装好,而且网上遇到问题时搜到的教程绝大多数都是基于Ubuntu/Debian体系的。
CentOS 7已经在2024年停止维护,新购机器不建议再选。如果你所在的团队习惯用RHEL系,那就选Rocky Linux或AlmaLinux,它们是CentOS停服后的主流替代方案,包管理工具是yum/dnf,命令示例我会在后续内容中同时给出Ubuntu和CentOS两套。总的来说,新手首选Ubuntu,遇到问题的排查成本最低。
2. 购买流程实操:从注册到开机
配置想清楚之后,购买流程本身可以控制在十分钟内。现在国内主流云平台包括阿里云、腾讯云、华为云等,操作流程大同小异,这里按通用流程讲。
2.1 注册、实名认证与新用户优惠
购买云服务器的第一步是注册云平台账号,这是必须的。注册时需要绑定手机号并完成实名认证,个人认证一般提交身份证信息后很快就能通过。实名认证是购买国内节点的前置条件,这一步躲不掉。
在正式下单之前,务必先看看新用户优惠。各大云平台对“首次购买”或“学生认证”用户通常有力度不小的折扣,一台一年期的入门服务器可能只需要几十到一百多元。学生认证通常还支持免费领取试用实例。别急着直接原价下单,先确认自己有没有可用的优惠资格,能省下不少预算。
账号安全方面,建议开启两步验证,并且不要把账号密码和支付密码设成同一个。云服务器是暴露在公网的东西,你的账号就是这台机器的钥匙,保护账号比保护服务器本身还重要。
2.2 下单页面的关键选项逐个拆解
云平台服务器购买页面上,需要关注的选项有这么几个:付费方式、实例规格、地域、镜像、公网IP、带宽和安全组。
付费方式上,新手学习用途选按量付费比较好,可以随时释放,避免买了包年套餐却闲置。如果确定要长期运行,包年包月通常有折扣。我的习惯是先用按量付费测试几天,确认运行稳定后再根据实际业务决定是否转为包年。
公网IP一定要勾选“分配公网IP”,不勾的话服务器只有内网地址,外面根本连不上。这个选项有些平台默认选中,有些需要手动勾,下单前仔细看一眼摘要信息。
安全组的初始规则各个平台不一样,正常情况下会默认放行22端口(SSH连接端口),但后文要用的80端口(HTTP)和443端口(HTTPS)基本都需要手动添加。安全组本质上是云平台层面的防火墙,它比服务器内部的防火墙优先级更高,后面讲连接和访问问题时还会反复提到它。
登录方式推荐密钥对,密钥文件保存在本地,登录时不需要输入密码,安全性更高。如果用密码登录,一定要设置一个高强度密码(大小写字母+数字+特殊字符组合,长度不低于12位),新手最容易在这里偷懒。
2.3 购买完成后第一件要做的事
下单完成后,云平台会提示你查看服务器详情。先把这几项记下来:公网IP地址、操作系统用户名(Ubuntu系统默认用户名通常是root,也可以创建普通用户)、安全组规则列表。
如果选择的是密码登录,部分平台会在后台重置一次密码,这时记下的是初始密码,首次登录建议立刻改掉。如果选择的是密钥登录,把私钥文件下载到本地并妥善保存,私钥一旦丢失,登录凭证就没了。
我强烈建议购买后马上去安全组页面,确认22端口已开放,然后一次性把80和443端口也放行规则加上。因为安装nginx后就要立即用这端口,事后想起再去补规则,又要多花几分钟,而且容易因为没放行导致的访问失败而误以为nginx配置错了。
3. 连接云服务器:从SSH到终端工具
服务器本质上是一台放在机房里的Linux电脑,你需要在本地终端里用SSH协议连上它,然后执行命令。SSH连接是后面所有操作的前提,这一块内容对纯新手来说可能是最容易卡住的点。
3.1 Linux和Mac自带终端连接方法
如果你的电脑是Linux或Mac系统,直接打开终端(Terminal),执行下面的命令:
ssh root@你的服务器公网IP如果用户名不是root(比如Ubuntu部分镜像默认用户是ubuntu),就换成:
ssh ubuntu@你的服务器公网IP第一次连接时系统会提示确认服务器指纹,类似这样:
The authenticity of host 'x.x.x.x (x.x.x.x)' can't be established.输入yes回车即可。接着会让你输入密码,输密码时屏幕上不会显示任何字符,这是正常现象,输完直接按回车。连接成功后会看到类似root@your-server:~#的命令行提示符,说明已经进到服务器里了。
如果是密钥登录,命令格式多一个参数:
ssh -i ~/.ssh/my-key.pem root@你的服务器公网IP这里有一个非常容易踩的坑:私钥文件权限太宽会导致SSH拒绝使用。解决办法是把私钥文件权限改成600:
chmod 600 ~/.ssh/my-key.pem3.2 Windows系统怎么连
Windows 10及以上版本的系统自带OpenSSH客户端,可以直接在PowerShell或Windows Terminal里执行:
ssh root@你的服务器公网IP如果你不想记命令,或者需要管理多台服务器,推荐用图形化SSH工具,比如Xshell(个人免费版)、FinalShell、Putty。这类工具的核心功能一样:填好主机IP、端口(默认22)、用户名,选对认证方式(密码或密钥),点击连接就进去了。
Xshell类的工具优势在于会话管理。把每台服务器的IP、用户名、密钥保存下来,以后连接就是点一个条目的事,不用重复输入。服务器数量多的时候,效率差异特别明显。
Windows下连接时,如果用了密钥,Xshell需要在“用户身份验证”里选择PublicKey方式并加载私钥文件,密码验证和密钥验证不能混用。如果连不上,优先检查用户名是否正确、密钥格式是否为OpenSSH格式。
3.3 第一次连接失败:按这个顺序排查
SSH连接失败是新手遇到最多的问题。我按照出现频率排个序,对照排查即可。
| 排查项 | 怎么检查 | 解决方法 |
|---|---|---|
| 安全组未放行22端口 | 去云控制台查看安全组规则 | 添加入方向规则,协议TCP,端口22,来源0.0.0.0/0 |
| 用户名不对 | 回忆镜像类型,Ubuntu常见ubuntu用户 | 用root试一次,或确认镜像默认用户名 |
| 密码/密钥不对 | 检查有没有漏字符、大小写 | 去控制台重置密码,或重新关联密钥 |
| IP地址写错 | 核对控制台公网IP | 公网IP可能变化,释放后重买会变 |
| 本地网络问题 | 换手机热点试一下 | 有些网络对22端口有限制,但概率很低 |
国内还有一些情况是本地宽带运营商对22端口做限制,如果换了热点能连上而家里宽带连不上,那问题就不在服务器端,只能换连接端口或者加一层跳板机,不过初学者遇到这种情况的比例不高。
4. 安装nginx:包管理器安装和编译安装两条路
连上服务器之后,接下来的核心任务就是安装nginx。nginx的安装方式主要有两种:用系统包管理器安装,和源码编译安装。大多数场景下,推荐你用包管理器方式,零依赖、一条命令搞定;编译安装更适合有特殊模块需求、需要定制参数的老手。
4.1 用apt/yum一条命令搞定安装
Ubuntu/Debian系统执行:
sudo apt update sudo apt install nginx -yRocky/AlmaLinux/CentOS系统执行:
sudo yum install nginx -y安装完成后,nginx会自动注册为系统服务。启动并设置开机自启:
sudo systemctl start nginx sudo systemctl enable nginx查看运行状态:
sudo systemctl status nginx如果看到active (running),说明nginx已经起来了。这种安装方式的好处是配置文件统一放在/etc/nginx/目录下,日志在/var/log/nginx/,干净的目录结构方便后续维护。要用到更新也比较省心:
sudo apt upgrade nginx或者:
sudo yum update nginx系统包管理器安装的nginx版本可能不是最新的,但这不一定是坏事。官方源的版本经过充分测试,稳定性和兼容性有保障,生产环境追求的是稳定而非追新。这也是我优先推荐包管理器安装的根本原因。
4.2 编译安装nginx:什么时候需要、怎么操作
编译安装nginx的典型场景是:需要某个官方预编译版本不含的模块(比如某些第三方流量治理模块),或者需要指定安装路径、加入非标准编译参数。如果只是一般的Web服务、反向代理、负载均衡,包管理器的nginx都支持,没有必要编译。
编译安装的完整流程如下,以nginx 1.24.0为例。
先安装编译工具和依赖库:
sudo apt install -y gcc make libpcre3-dev zlib1g-dev libssl-dev下载源码包并解压:
wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0配置编译参数。这是最核心的一步,--prefix指定安装目录,--with-http_ssl_module开启HTTPS支持:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module然后编译并安装:
make -j$(nproc) sudo make install启动编译安装的nginx:
/usr/local/nginx/sbin/nginx编译安装踩过几次坑之后的经验:第一,./configure阶段如果报缺失依赖,不要硬着头皮继续,先回去把依赖包装齐;第二,编译参数一旦确定,后续想加模块还需要重新编译,所以在configure阶段就尽量把所有会用到的模块一次性加齐;第三,编译安装的nginx不会自动注册为systemd服务,要开机自启就得手写一个service文件,对新手来说这一步比较容易出错。
如果你的Linux环境是纯内网、无法访问外网下载源码包,就只能找一台同架构的机器下载好源码包再拷贝进去,而且得确认依赖库齐全。这类内网离线安装场景比较特殊,操作前先确认目标机器架构和操作系统版本。
4.3 验证nginx是否正常工作
安装完成不管用哪种方式,都要验证一次。服务器本机执行:
curl http://127.0.0.1如果返回一坨HTML,里面能看到Welcome to nginx!字样,说明nginx本体已经正常工作了。
接下来在本地浏览器地址栏输入http://你的服务器公网IP,如果能看到nginx欢迎页,说明公网链路也通了。如果本机curl能用但浏览器打不开,问题几乎都出在安全组或服务器防火墙没放行80端口,排查方向放在那里。
开放80端口:
sudo ufw allow 80如果用的是CentOS系自带firewalld:
sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --reload同时也得回云控制台确认安全组里80端口已放行,这个我在前面已经强调过,再次提醒的原因是:云平台安全组和服务器内部防火墙是两层独立机制,任何一层挡住,外面都访问不到。
5. nginx配置实战:从静态网站到反向代理
nginx装好只是起点,配置才是日常打交道最多的环节。nginx的配置体系不复杂,把核心文件结构和几个常用场景讲清楚,你就能应付大多数需求。
5.1 nginx.conf结构拆解:不要被配置文件吓到
用包管理器安装的nginx,主配置文件在/etc/nginx/nginx.conf,Ubuntu系统还会额外包含/etc/nginx/sites-enabled/下的站点配置文件。
打开nginx.conf,内容看起来很长,但核心结构只有三层:main层(全局配置)、events层(事件模型)、http层(HTTP服务配置)。
user www-data; worker_processes auto; events { worker_connections 768; } http { sendfile on; include /etc/nginx/mime.types; access_log /var/log/nginx/access.log; server { listen 80; server_name _; root /var/www/html; } }关键参数逐个解释:
worker_processes auto:nginx的工作进程数,设auto会让它自动匹配CPU核心数。worker_connections:单进程最大并发连接数,数值越高并发能力越强。server:一个server块代表一个虚拟主机配置,监听端口、域名、根目录都在这一层。location:server块内部的路径匹配规则,不同的URL路径可以走不同的处理逻辑。
新手不要想着一次看懂所有指令。实际使用时记住:改配置后一定要先测试语法再重载。测试指令是:
sudo nginx -t语法通过会显示syntax is ok,不通过会指出第几行哪个参数有问题,这是个救命命令。
5.2 部署一个静态网站:最常用的server块写法
假设你自己写了一个HTML页面,放在服务器/var/www/mysite/index.html,要让nginx把这个目录作为网站根目录对外提供服务。
Ubuntu系统推荐在/etc/nginx/sites-available/mysite里创建配置文件:
server { listen 80; server_name example.com www.example.com; root /var/www/mysite; index index.html; location / { try_files $uri $uri/ =404; } }然后创建软链接到sites-enabled:
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginxCentOS/Rocky系统通常直接在/etc/nginx/conf.d/mysite.conf创建配置文件,内容一样。
如果你有主域名和二级域名,比如主站是example.com,博客是blog.example.com,那就配置两个server块,一个server块对应一个域名:
server { listen 80; server_name example.com; root /var/www/mysite; } server { listen 80; server_name blog.example.com; root /var/www/blog; }前提是域名已经解析到这台服务器的公网IP。这里可以看到server_name就是域名匹配的关键,nginx收到HTTP请求后会根据请求头里的Host字段来决定走哪个server块,这也是多域名共用一台服务器的基本原理。
nginx的index指令决定访问根路径时默认返回哪个文件。try_files $uri $uri/ =404的作用是:如果文件不存在,依次尝试目录索引,都没有就返回404。这个配置能避免直接暴露目录结构,是静态站安全性的基础。
5.3 反向代理配置:nginx的看家本领
静态网站只是nginx能力的冰山一角,真正让nginx在架构中不可替代的是反向代理能力。简单说,反向代理就是nginx对外接收请求,再转发给内部的后端服务(比如Java进程、Node.js服务),并把后端返回的结果传回给客户端。
一个典型的反向代理配置:
server { listen 80; server_name api.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这里的含义是:访问api.example.com的所有请求,nginx都转发给本机8080端口上运行的后端服务。proxy_set_header那一串是告诉后端“原始的请求是谁发出来的”,否则后端看到的所有请求都来自127.0.0.1,无法区分真实用户来源,这会直接影响日志采集和业务逻辑。
反向代理解决的典型问题有三个:第一,后端服务只监听内网端口,不直接暴露公网,降低被扫描攻击的风险;第二,多个后端服务可以共用一个域名端口,通过不同路径或域名分发;第三,为横向扩展做准备,后面可以加一个upstream配置实现多台后端自动负载均衡。
举一个多个应用共存的例子:服务器上同时跑着8080端口的一个Java服务和3000端口的一个Node.js服务,nginx可以这样配置:
server { listen 80; server_name app.example.com; location /java/ { proxy_pass http://127.0.0.1:8080; } location /node/ { proxy_pass http://127.0.0.1:3000; } }这样一个公网入口就把多个内部服务暴露出去了。很多“nginx代理”相关的需求,本质就是这种配置。你在搜索里看到的nginx代理、nginx反向代理相关教程,核心逻辑都是这里展开的。
6. 常见问题排查与避坑实录
这一节写的都是安装配置nginx过程中我会遇到、也会经常在社群里看到别人问的问题。每个问题都对应一个真实场景,排查思路按优先级排好。
6.1 端口被占用:nginx启动失败的常见原因
执行启动命令后看到报错:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)这说明80端口已经被其他进程占用了。最常见的占用者是Apache,如果你之前装过宝塔面板、phpstudy之类的集成环境,80端口几乎必被占用。先用下述命令查是谁占用了端口:
sudo lsof -i:80或者:
sudo netstat -tulpn | grep :80看到占用进程的PID后,确认是Apache就先停掉并禁用开机自启:
sudo systemctl stop apache2 sudo systemctl disable apache2如果是其他进程,根据自己的情况决定是否停用。如果这台服务器上必须保留这个占用80端口的程序,还可以把nginx的监听端口改成没有冲突的端口,但这样对外访问URL里就得带端口号。
Windows本地安装nginx时也常遇到端口被占用的问题,报错可能类似nginx: [emerg] createfile() "d:/phpstudy_pro/www/admin2.com/nginx.htaccess",这通常和站点路径权限、配置文件指向的目录不存在有关。Windows下排查时要特别注意路径不能带中文、不能带空格,站点目录的读写权限要给足,出了这类问题先检查路径配置,再检查目录权限。
6.2 配置改动后如何平滑重载:nginx -t必须养成习惯
nginx配置改动后,不需要重启进程,重启会造成瞬间断连,正确做法是重载配置。重载前先测试语法:
sudo nginx -t语法测试通过后执行:
sudo systemctl reload nginx或者:
sudo nginx -s reload平滑重载的原理是:nginx主进程收到重载信号后,用新配置启动一组新工作进程,再将旧的请求处理完、把旧工作进程优雅退出。所以重载过程中已经建立的连接不会中断,对在线业务完全无感。
这是我最想强调的一个操作习惯:任何时候改完配置文件,先nginx -t,再 reload。我曾经有一次改完location规则直接reload,结果配置文件有漏写的分号,导致整个nginx服务起不来,网站直接挂了。从那以后再也没跳过语法测试这一步。
6.3 80端口已经放行,浏览器还是访问不了
这个问题看似简单,排查链路却长,容易让人绕晕。顺序如下:
第一,先在本机curl确认nginx本身没问题:
curl http://127.0.0.1 curl http://你的服务器公网IP第二,检查服务器内部防火墙。Ubuntu看ufw状态:
sudo ufw status如果ufw是active状态,且没有放行80端口,执行:
sudo ufw allow 80CentOS/Rocky看firewalld:
sudo firewall-cmd --list-all第三,检查云平台安全组。回控制台查看入方向规则,确认TCP 80端口已经放行。有些平台创建服务器时默认只放行22、3389端口,80和443都要手动添加。
第四,检查域名解析。如果你是用域名访问,先解析确认能ping通,再确认解析的是这台服务器的公网IP。DNS解析生效需要时间,刚添加的解析记录可能最长要等几个小时。
还有一个容易忽略的点:如果你买的是按流量计费且带宽已用尽,也会出现浏览器访问不了的情况,此时去控制台看监控图表,确认公网出流量是否已经打满。
6.4 日志排查:nginx报错信息的查看方法
nginx出问题时不要瞎猜,去看日志。访问日志和错误日志是两个文件:
- 访问日志:
/var/log/nginx/access.log,记录每一次HTTP请求。 - 错误日志:
/var/log/nginx/error.log,记录启动报错、配置报错、上游连接失败等。
比如反向代理配置后访问返回502,先看错误日志:
sudo tail -f /var/log/nginx/error.log看到connect() failed (111: Connection refused) while connecting to upstream,说明nginx转发时后端端口没有服务在监听,去确认后端应用是否启动即可。日志是定位问题最快的方式,比反复试配置高效得多。
我把上面的排查逻辑整理成一个速查表:
| 现象 | 排查方向 | 常见根因 |
|---|---|---|
| 连接超时 | 安全组、防火墙 | 22/80/443端口未放行 |
| 502 Bad Gateway | 后端服务状态 | 后端未启动或端口没对上 |
| 403 Forbidden | 目录权限、index文件 | 网站目录无读取权限 |
| 404 Not Found | root路径、try_files | 文件路径不对或未上传 |
| 301重定向循环 | server_name配置 | 多个server块强匹配冲突 |
我个人在实际操作中的体会是,云服务器加nginx这套组合,本身没有太难的技术点,但每一环都可能因为一两个细节翻车。购买时的地域和配置没选对,后续要付出迁移成本;SSH钥匙权限不对,连登录都进不去;nginx配置漏一个分号,服务直接罢工。这个领域不存在什么“一次学会终身受用”的快捷键,养成“改前备份、改后测试、出问题看日志”这三个习惯,比记多少命令都管用。
如果你接下来想继续深入,推荐按这个方向走:先给nginx配一个HTTPS证书,把网站从HTTP升级到HTTPS;然后试试把静态资源用nginx的gzip压缩和缓存头配置优化一遍;再往后可以了解nginx的upstream模块,用两台后端服务做一次最简单的负载均衡。每一步都能在现有环境里直接动手,不用额外买服务器。把今天这台机器的价值榨干,你就已经超过了大多数停留在“看过教程”阶段的同行。