醒刻 Logo
← 返回文章列表

AWS 云服务器部署 Nginx 完整指南:从公网访问到域名解析和 HTTPS

从 0 开始梳理 AWS EC2 上安装 Nginx、放行安全组、做域名解析、反向代理应用,以及用 Let's Encrypt 配置 HTTPS 的完整流程。

2026年3月19日 · 2706 · 更新于 2026年3月19日

前面折腾服务器和博客部署时,我发现很多教程都只写了“装一下 Nginx 然后配个域名”,真正到自己动手时,最容易卡住的反而是几个细节:

  • AWS 安全组到底要开哪些端口
  • 域名应该解析到哪里
  • Nginx 是直接托管静态页面,还是反向代理本地服务
  • HTTPS 证书应该什么时候申请

所以这篇文章我按“第一次部署也能照着走通”的思路,整理一套更完整的流程。默认场景是:你已经有一台 AWS EC2 Linux 服务器,想让别人通过域名访问你的网站或应用。

先明确这篇文章解决什么问题

部署一个对外可访问的网站,通常要打通下面这条链路:

  1. 你有一台 AWS 云服务器
  2. 服务器上运行了网站程序,或者至少装了 Nginx
  3. AWS 安全组放行了外部访问端口
  4. 域名解析到这台服务器的公网 IP
  5. Nginx 正确响应请求
  6. 最后再补上 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:HTTP
  • 443: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

方式二,给 wwwCNAME 指向主域名:

  • 记录类型:CNAME
  • 主机记录:www
  • 记录值:example.com

如果你是新手,我更建议主域名用 A 记录,wwwCNAME 指向主域名,这样比较清晰。

一个实用的配置示例

如果你想同时支持:

  • example.com
  • www.example.com

那么可以这样配:

  • A 记录:@ -> 你的 EC2 公网 IP
  • CNAME 记录: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 oktest 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
  • 安全组是否放行了 80443
  • 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 端口是否写对
  • 应用进程是否退出了

一套更稳的上线顺序

如果你不想排错时把问题搅在一起,我建议按下面顺序部署:

  1. 先装 Nginx
  2. 用公网 IP 验证 Nginx 默认页
  3. 配域名解析
  4. 用域名访问静态测试页
  5. 再改成反向代理你的应用
  6. 最后申请 HTTPS

这样每一步都能单独验证,哪里错了会很容易定位。

小结

如果只记核心逻辑,其实就一句话:

域名解析负责把请求导向你的 AWS 服务器,Nginx 负责接住请求并返回页面或转发给你的应用,HTTPS 负责把整个访问过程变成安全连接。

最容易踩坑的地方不是命令本身,而是这三件事经常混在一起:

  • 安全组没放行
  • 域名没解析对
  • Nginx 配置和后端端口不一致

只要你按“先 IP、再域名、再 HTTPS”的顺序一层层验证,部署成功率会高很多。

如果后面我把自己的 Next.js 或其他应用完整跑在 AWS 上,我会再补一篇更偏实战的版本,把 PM2、systemd、自动重启和日志排查也一起写进去。

评论区