很多小团队在阿里云 ECS 上部署网站或接口时,习惯把应用端口直接开放到公网。能跑起来,但后端暴露在外面,扩容、换域名、管证书都很被动。阿里云 nginx 的组合是常见的解法:它占资源少,能同时处理静态文件、反向代理和负载均衡。下面用一个典型场景,讲清楚搭建时的主要步骤,以及最容易漏掉的环节。

一、场景背景
假设某在线教育团队的后端是 Spring Boot 服务,跑在两台阿里云 ECS 上,端口是 8080。前端静态页面也要对外提供,并且全站要求 HTTPS。以前的做法是直接放开 8080,每次发版都要手动改访问地址,域名和证书也散落在各处。团队决定让 nginx 做统一入口,由它负责静态资源、请求转发和证书卸载。
二、开始前先确认三件事
动手之前,先把基础条件查清楚,省得装到一半才返工。
- 确认 ECS 的操作系统(比如 Alibaba Cloud Linux 3 或 CentOS 系列)和登录方式,密钥或密码都要记好。
- 在安全组里放行 80 和 443 端口。很多人服务装好了打不开,排查半天,最后发现是安全组没配。
- 域名要完成备案,并解析到 ECS 的公网 IP。国内服务器对外提供网站服务需要备案,这一步跳不过去。
三、安装与基础配置
在 Alibaba Cloud Linux 或 CentOS 上,直接用系统包管理器安装 nginx,设置开机自启并启动。用浏览器访问公网 IP,看到默认欢迎页,就说明服务已经正常运行。
主配置文件一般在 /etc/nginx/nginx.conf。站点配置建议拆到 conf.d 目录下,一个域名一个文件,之后按域名管理会清楚很多。每次改完配置,先执行语法检查,确认没问题再 reload。一个括号漏写,直接 reload 就可能让整个服务掉线,所以这个检查步骤别省。
四、配置反向代理
反向代理是这次改造的重点。nginx 监听 80 和 443,收到请求后,把 /api 开头的请求转给后端的 Java 服务,其余请求直接返回前端静态文件。
具体写法是在 server 块里定义 location。/api 路径用 proxy_pass 指向后端地址。根路径用 root 指向前端构建产物所在的目录,再配合 try_files,让单页应用的前端路由能正常刷新。另外,记得用 proxy_set_header 把客户端真实 IP 和 Host 头传给后端。不设置的话,后端日志里全是 nginx 的内网地址,查问题时几乎没法定位到具体用户。
上线后,团队遇到一个小问题:部分接口上传文件时返回 413。原因是 nginx 默认的请求体限制只有 1MB,把 client_max_body_size 调大就解决了。这类默认值最好结合业务实际文件大小提前评估,上线后再查,耗时会多很多。
五、配置负载均衡
两台后端之间的流量分配,用 upstream 模块实现。在 http 块里定义 upstream,把两台 ECS 的内网地址放进去,默认是轮询。如果其中一台机器性能更好,可以给它加大 weight,让它多分一些请求。
后端之间通信,尽量走内网 IP。内网流量不计入公网费用,延迟也更低。再加上 max_fails 和 fail_timeout,某台实例连续失败后,nginx 会暂时把它踢出轮询,用户请求就不会继续落到故障机器上。
六、配置 HTTPS,这一步最容易漏
团队的域名证书是在阿里云 SSL 证书服务里申请的免费 DV 证书。下载后会得到证书文件和私钥。把它们上传到服务器指定目录,在 server 块里开启 443 监听,并填好证书路径。
这里有两个容易漏的地方。第一,证书文件要用包含中间证书的完整链,只放单独的证书,部分浏览器和客户端会提示证书不受信任,而你本机测试时却一切正常。第二,私钥文件权限要收紧,只让 nginx 进程能读,别设成所有人可读。
配置完成后,还要把 80 端口的请求全部重定向到 HTTPS,保证用户始终走加密连接。同时建议开启 HTTP/2,关闭老旧的 TLS 版本,只保留 TLS 1.2 和 1.3。这些改动不需要动业务代码,安全性和访问速度都会有所改善。
七、日志与日常运维
nginx 默认把访问日志和错误日志写到本地文件。在阿里云上,可以接入日志服务 SLS 做集中采集,然后按状态码、接口路径或来源做统计。比如 5xx 的数量突然上涨,往往意味着后端出了问题,通过日志能比较快地发现。
日常维护有几条习惯建议坚持。改配置前先备份原文件。每次变更都做语法检查。尽量用 reload 而不是 restart,减少连接中断。nginx 版本也要定期更新,修复已知的安全漏洞。
八、结语
阿里云上的 nginx 方案,本质是把公网入口、证书管理、流量分发和静态资源收拢到一层。对文中的教育团队来说,后端不再直接暴露,发版只需要改 upstream,证书也集中管理。整体思路不复杂,真正决定上线顺不顺利的,是安全组、备案、证书链和请求体大小这些细节。