前面折腾服务器和博客部署时,我发现很多教程都只写了“装一下 Nginx 然后配个域名”,真正到自己动手时,最容易卡住的反而是几个细节:
- AWS 安全组到底要开哪些端口
- 域名应该解析到哪里
- Nginx 是直接托管静态页面,还是反向代理本地服务
- HTTPS 证书应该什么时候申请
所以这篇文章我按“第一次部署也能照着走通”的思路,整理一套更完整的流程。默认场景是:你已经有一台 AWS EC2 Linux 服务器,想让别人通过域名访问你的网站或应用。
先明确这篇文章解决什么问题
部署一个对外可访问的网站,通常要打通下面这条链路:
- 你有一台 AWS 云服务器
- 服务器上运行了网站程序,或者至少装了 Nginx
- AWS 安全组放行了外部访问端口
- 域名解析到这台服务器的公网 IP
- Nginx 正确响应请求
- 最后再补上 HTTPS
只要这 6 步里有一步没通,网页就可能打不开。
准备工作
开始之前,先准备好这些信息:
- 一台 AWS EC2 实例
- 实例的公网 IPv4 地址
- 一套你自己的域名
- SSH 登录密钥
- 一台本地电脑,可以通过终端连上服务器
如果你还没登录过服务器,可以先这样连接:
ssh -i /path/to/your-key.pem ubuntu@你的公网IP
如果你的镜像不是 Ubuntu,用户名可能会不同,常见情况有:
- Ubuntu:
ubuntu - Amazon Linux:
ec2-user - Debian:
admin或你自己创建的用户
第一步:在 AWS 放行端口
这一步特别关键。很多人 Nginx 明明装好了,但浏览器还是打不开,根本原因往往是 AWS 安全组没放行。
进入 AWS 控制台后,找到:
EC2 -> Instances -> 你的实例 -> Security -> Security groups
然后给这台实例对应的安全组添加入站规则。
最低建议放行这些端口
22:SSH 远程登录80:HTTP443:HTTPS
如果你只是临时测试 Nginx,也至少要先开 80。
推荐规则示例
- Type:
SSH,Port:22,Source: 你的本机 IP - Type:
HTTP,Port:80,Source:0.0.0.0/0 - Type:
HTTPS,Port:443,Source:0.0.0.0/0
其中 SSH 最好不要直接开放给全网,尽量限制成你自己的 IP,安全性更高。
第二步:安装 Nginx
下面以 Ubuntu 为例。
先更新软件包索引:
sudo apt update
安装 Nginx:
sudo apt install -y nginx
启动并设置开机自启:
sudo systemctl enable nginx
sudo systemctl start nginx
检查运行状态:
sudo systemctl status nginx
如果看到 active (running),说明 Nginx 已经启动成功。
第三步:先用公网 IP 测试 Nginx
这一步不要跳。先别急着配域名,先确认公网 IP 能访问。
浏览器直接打开:
http://你的公网IP
如果看到 Nginx 默认欢迎页,说明下面这几件事都已经是通的:
- 服务器开机正常
- Nginx 正在运行
- AWS 安全组已放行 80 端口
- 公网网络链路正常
如果这里都打不开,就先不要继续配域名。优先检查:
- 安全组是否放行了
80 sudo systemctl status nginx是否正常- 服务器是否真的有公网 IP
第四步:域名如何解析到 AWS 服务器
这一步就是你刚才特别提到的“域名如何解析”。
域名解析本质上就是告诉浏览器:
“当用户访问这个域名时,请去找哪一台服务器。”
你需要找到的关键信息
先在 AWS 控制台里记下你的 EC2 公网 IPv4 地址,比如:
43.123.45.67
接着到你的域名服务商后台添加 DNS 记录。常见平台有:
- 阿里云
- 腾讯云
- Cloudflare
- Namecheap
- GoDaddy
最常见的解析方式
1. 主域名解析
如果你想让下面这个地址可以访问:
example.com
一般添加一条 A 记录:
- 记录类型:
A - 主机记录:
@ - 记录值:
43.123.45.67
2. 子域名解析
如果你想让下面这个地址可以访问:
www.example.com
可以再加一条记录,常见有两种写法。
方式一,直接加 A 记录:
- 记录类型:
A - 主机记录:
www - 记录值:
43.123.45.67
方式二,给 www 配 CNAME 指向主域名:
- 记录类型:
CNAME - 主机记录:
www - 记录值:
example.com
如果你是新手,我更建议主域名用 A 记录,www 用 CNAME 指向主域名,这样比较清晰。
一个实用的配置示例
如果你想同时支持:
example.comwww.example.com
那么可以这样配:
A记录:@ -> 你的 EC2 公网 IPCNAME记录:www -> example.com
域名解析生效要多久
DNS 解析不是立刻全网同步的,一般几分钟到几十分钟都有可能,个别时候可能更久。
你可以在本地电脑执行下面命令检查:
nslookup example.com
或者:
dig example.com
如果返回的是你的 EC2 公网 IP,说明解析基本已经生效。
第五步:为域名配置 Nginx 站点
等域名已经解析到你的服务器后,就可以正式给这个域名写 Nginx 配置。
先创建网站目录
如果你只是想先测试一个静态页面,可以先放一个简单的 HTML 文件:
sudo mkdir -p /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example.com/html
创建首页:
cat > /var/www/example.com/html/index.html <<'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>It works</title>
</head>
<body>
<h1>Nginx 部署成功</h1>
<p>如果你看到了这个页面,说明域名和 Nginx 都已经通了。</p>
</body>
</html>
EOF
创建 Nginx 配置文件
新建站点配置:
sudo nano /etc/nginx/sites-available/example.com
写入下面内容:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
然后启用它:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
测试配置是否正确:
sudo nginx -t
如果显示 syntax is ok 和 test is successful,就可以重载 Nginx:
sudo systemctl reload nginx
现在访问:
http://example.com
如果能看到你刚才写的页面,说明域名解析和 Nginx 站点配置都已经成功。
第六步:如果你的网站不是静态页,而是本地服务
很多时候,我们不是想让 Nginx 直接托管 HTML,而是想让它代理一个运行在本机端口上的应用。
比如:
- Node.js 项目跑在
3000 - Next.js 项目跑在
3000 - Flask 跑在
5000 - FastAPI 跑在
8000
这时就要用反向代理。
反向代理示例
假设你的应用运行在:
127.0.0.1:3000
那么 Nginx 配置可以改成:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
这个配置的作用是:
- 用户访问
example.com - 请求先到 Nginx
- Nginx 再转发给本机
3000端口上的应用
这样做的好处是:
- 外部不需要直接暴露应用端口
- 后续加 HTTPS 更方便
- 多个服务也更容易统一管理
第七步:申请 HTTPS 证书
当 http://example.com 已经能正常访问后,再申请 HTTPS 是最稳的顺序。
Ubuntu 下常见做法是用 Certbot。
先安装:
sudo apt install -y certbot python3-certbot-nginx
然后执行:
sudo certbot --nginx -d example.com -d www.example.com
执行过程中一般会让你做几件事:
- 输入邮箱
- 同意服务条款
- 选择是否把 HTTP 自动跳转到 HTTPS
我建议直接选择跳转,这样以后用户无论输 http 还是 https,都会自动进入安全连接。
证书申请成功后会发生什么
Certbot 通常会自动帮你修改 Nginx 配置,把它变成类似这样:
server {
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
第八步:检查证书自动续期
Let's Encrypt 证书有效期通常是 90 天,所以要确认自动续期机制是否正常。
可以先做一次模拟测试:
sudo certbot renew --dry-run
如果没有报错,后续一般就能自动续期。
常见问题排查
1. 域名已经解析了,但浏览器还是打不开
优先检查:
- 域名是否真的解析到了这台 EC2 的公网 IP
- 安全组是否放行了
80和443 - Nginx 是否在运行
- Nginx 配置里的
server_name是否写对
2. 公网 IP 能打开,域名打不开
这通常说明:
- Nginx 没问题
- 服务器也没问题
- 问题大概率就在 DNS 解析
这时候重点看域名后台的 A 记录是不是写对了公网 IP。
3. Certbot 申请证书失败
常见原因有:
- 域名还没解析生效
80端口没开放- Nginx 配置有语法错误
- 域名被 CDN 或代理挡住了真实验证流程
建议先确保 http://example.com 能正常打开,再去申请证书。
4. Node 或 Next 项目能本地访问,但域名访问 502
这通常说明 Nginx 已经收到了请求,但它代理的后端服务没起来。
重点检查:
- 应用是否真的运行在
127.0.0.1:3000 proxy_pass端口是否写对- 应用进程是否退出了
一套更稳的上线顺序
如果你不想排错时把问题搅在一起,我建议按下面顺序部署:
- 先装 Nginx
- 用公网 IP 验证 Nginx 默认页
- 配域名解析
- 用域名访问静态测试页
- 再改成反向代理你的应用
- 最后申请 HTTPS
这样每一步都能单独验证,哪里错了会很容易定位。
小结
如果只记核心逻辑,其实就一句话:
域名解析负责把请求导向你的 AWS 服务器,Nginx 负责接住请求并返回页面或转发给你的应用,HTTPS 负责把整个访问过程变成安全连接。
最容易踩坑的地方不是命令本身,而是这三件事经常混在一起:
- 安全组没放行
- 域名没解析对
- Nginx 配置和后端端口不一致
只要你按“先 IP、再域名、再 HTTPS”的顺序一层层验证,部署成功率会高很多。
如果后面我把自己的 Next.js 或其他应用完整跑在 AWS 上,我会再补一篇更偏实战的版本,把 PM2、systemd、自动重启和日志排查也一起写进去。