You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AWS EC2上存储Next.js环境变量与敏感密钥的最优方案咨询

在AWS EC2上管理Next.js应用的环境变量与敏感信息

先解决你当前配置不生效的问题

你代码里调用变量时写了processs.env.NEXT_PUBLIC_BASE_URL,这里多了一个s,正确写法是process.env.NEXT_PUBLIC_BASE_URL,这是导致变量读取失败的直接原因。

另外,Next.js 9.4+版本更推荐用.env系列文件(比如.env.production)管理环境变量,而非在next.config.js的env字段中配置。但要注意:.env文件绝对不能提交到代码仓库,尤其是包含敏感信息的文件。

EC2上存储变量与敏感信息的最佳方式

1. 直接在EC2实例中设置环境变量(适合非敏感或低敏感配置)

  • 若用shell脚本启动应用,可在启动脚本中先导出变量:
    export NEXT_PUBLIC_BASE_URL="https://djangobackend.com/api/articles/"
    export SECRET_API_KEY="your-sensitive-key-here"
    npm start
    
  • 若用systemd管理应用服务,可在服务配置文件(比如/etc/systemd/system/nextjs.service)中添加Environment字段:
    [Service]
    Environment="NEXT_PUBLIC_BASE_URL=https://djangobackend.com/api/articles/"
    Environment="SECRET_API_KEY=your-sensitive-key-here"
    ExecStart=/usr/bin/npm start
    WorkingDirectory=/path/to/your/nextjs/app
    
    配置后重新加载服务:
    sudo systemctl daemon-reload
    sudo systemctl restart nextjs
    

2. 使用AWS Secrets Manager(高敏感信息首选)

对于数据库密码、第三方服务API密钥这类高敏感信息,建议存在AWS Secrets Manager:

  • 在AWS控制台创建密钥,以JSON格式存储多个敏感信息
  • 给EC2实例的IAM角色添加secretsmanager:GetSecretValue权限,允许实例访问该密钥
  • 在Next.js后端代码中通过AWS SDK拉取密钥:
    const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager");
    const client = new SecretsManagerClient({ region: "your-region" });
    
    async function getSecret() {
      const command = new GetSecretValueCommand({ SecretId: "your-secret-name" });
      const response = await client.send(command);
      const secret = JSON.parse(response.SecretString);
      return secret;
    }
    
    // 在API路由或getServerSideProps中使用
    export async function getServerSideProps() {
      const secret = await getSecret();
      return { props: { apiKey: secret.SECRET_API_KEY } };
    }
    

3. 使用AWS Parameter Store(适合配置类变量)

如果是API地址、端口这类需要统一管理的配置参数,可使用AWS Parameter Store:

  • 在AWS控制台创建参数并存储变量值
  • 给EC2实例的IAM角色添加ssm:GetParameter权限
  • 在应用中通过AWS SDK拉取参数:
    const { SSMClient, GetParameterCommand } = require("@aws-sdk/client-ssm");
    const client = new SSMClient({ region: "your-region" });
    
    async function getParameter() {
      const command = new GetParameterCommand({ Name: "/nextjs/base-url", WithDecryption: false });
      const response = await client.send(command);
      return response.Parameter.Value;
    }
    

关键注意事项

  • 区分前端与后端变量:带NEXT_PUBLIC_前缀的变量会被打包到前端代码中,绝对不能用来存储敏感信息;敏感信息只能在后端代码中使用,禁止暴露给前端。
  • 禁止硬编码敏感信息:无论next.config.js还是.env文件,都不能将敏感信息写入后提交到代码仓库,必须通过外部方式注入。

内容的提问来源于stack exchange,提问作者DevolamiTech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:02:23