使用Docker Compose在AWS Lightsail上部署Next.js的方法

b7bcc17b-6493-455b-bb45-6ed748c03f72.png

以下是使用Docker Compose在AWS Lightsail上部署Next.js的方法。我们将解释在此配置中使用NGINX、Next.js和MySQL的基本步骤。

    1. 在中国本土进行翻译时,建议转化为简体中文:

创建Lightsail实例:
登录AWS管理控制台,打开Lightsail服务。
选择创建实例。
进行实例设置,选择OS Only和Ubuntu。

安装Docker和Docker Compose:
在Lightsail实例上通过SSH连接后,安装Docker和Docker Compose。
# 安装Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

# 安装Docker Compose
sudo curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

配置Docker Compose:
在根目录下创建docker-compose.yml文件。

version: ‘3’

services:
nginx:
image: nginx:latest
ports:
– “80:80”
volumes:
– ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
– nextjs

nextjs:
build:
context: ./path_to_nextjs_app
dockerfile: Dockerfile
environment:
– DATABASE_URL=mysql://user:password@mysql:3306/dbname

mysql:
image: mysql:latest
environment:
MYSQL_DATABASE: dbname
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: root_password
volumes:
– mysql-data:/var/lib/mysql

volumes:
mysql-data:

注意:上述YAML文件仅显示了基本配置,需要进行适当的设置和调整。

创建Next.js的Dockerfile:
在Next.js应用程序目录中创建Dockerfile。

FROM node:14

WORKDIR /app
COPY . .
RUN npm install
RUN npm run build

CMD [“npm”, “start”]

NGINX的配置:
创建nginx.conf文件,并编写NGINX的配置。特别是,需要配置将请求作为反向代理转发到Next.js应用程序的设置。

执行Docker Compose:
docker-compose up -d

设置安全组:
在Lightsail管理控制台中编辑实例的安全组,并确保适当的端口(例如:80、443)已打开。

基本部署已完成。请注意,如果需要考虑到安全性、备份、错误处理等生产环境的使用,可能需要进行额外的设置。

使用Route 53将域名与Lightsail实例关联起来。

使用Route 53将域名与Lightsail实例相关联的步骤如下。

    1. 在Route 53上创建新的托管区:

登录AWS管理控制台,打开Route 53服务。

点击”创建托管区”按钮来创建新的托管区。
输入域名并创建托管区。

获取Lightsail的公共IP:

在Lightsail的管理页面上记录下已创建实例的公共IP地址。

在Route 53上创建记录集:

转到之前创建的托管区的管理页面。

点击”创建记录”。
使用以下设置创建A记录:

名称:您的域名或子域名。
类型:A – IPv4地址。
值:Lightsail实例的公共IP地址。

保存记录。

在域名注册商处更新Nameserver:

复制Route 53提供的Nameservers (NS记录) 值。
访问您购买域名的注册商的管理页面,并将域名的Nameserver设置更改为Route 53的Nameserver。

获取SSL证书(选项):

如果要使用HTTPS托管网站,需要SSL/TLS证书。您可以使用AWS证书管理器 (ACM) 或Let’s Encrypt获取证书。
需要在NGINX配置中添加SSL。这需要引用证书文件以及监听HTTPS端口443的设置。

更新NGINX配置(选项):

如果使用SSL/TLS证书,需要更新NGINX配置以便正确处理HTTPS请求。

完成上述步骤后,您可以使用Route 53将域名关联到Lightsail实例上。通过这样做,您可以使用浏览器通过该域名访问实例。

使用Certbot来配置SSL化。

创建一个nginx.conf文件,并在其中写入NGINX的配置。
使用Certbot获取SSL/TLS证书,并在NGINX配置中使用该证书。

docker-compose.yml的示例:

version: '3'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./certs:/etc/letsencrypt
    depends_on:
      - nextjs

  nextjs:
    build:
      context: ./path_to_nextjs_app
      dockerfile: Dockerfile
    environment:
      - DATABASE_URL=mysql://user:password@mysql:3306/dbname

  mysql:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: dbname
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: root_password
    volumes:
      - mysql-data:/var/lib/mysql

  certbot:
    image: certbot/certbot:latest
    volumes:
      - ./certs:/etc/letsencrypt
    command: certonly --webroot --webroot-path=/var/www/certbot -d yourdomain.com -d www.yourdomain.com --email your@email.com --agree-tos --non-interactive

volumes:
  mysql-data:

在这个例子中,Certbot获取了SSL/TLS证书,并将其设置为在NGINX中使用。然而,Certbot的设置需要根据域名和电子邮件地址进行相应的更改。

使用diagrams库进行构图

from diagrams import Cluster, Diagram
from diagrams.aws.compute import Lightsail
from diagrams.aws.network import Route53
from diagrams.generic.os import Ubuntu
from diagrams.onprem.container import Docker
from diagrams.onprem.database import Mysql
from diagrams.onprem.network import Nginx
from diagrams.onprem.compute import Server

with Diagram("AWS Next.js Deployment", show=False):

    dns = Route53("Route 53\nDomain")
    
    with Cluster("Lightsail Instance"):
        os = Ubuntu("Ubuntu")
        docker = Docker("Docker")
        
        os >> docker
        
        with Cluster("Docker Services"):
            nginx = Nginx("NGINX")
            nextjs = Server("Next.js App")
            mysql = Mysql("MySQL")
            certbot = Server("Certbot")
            
            docker >> nginx
            
            nginx >> nextjs
            nextjs >> mysql
            certbot >> nginx

    dns >> os
广告
将在 10 秒后关闭
bannerAds