如何在 Elastic Beanstalk 上使用 Django 提供 React 应用程序?

Posted

技术标签:

【中文标题】如何在 Elastic Beanstalk 上使用 Django 提供 React 应用程序?【英文标题】:How to Serve a React App with Django on Elastic Beanstalk? 【发布时间】:2020-07-30 20:49:53 【问题描述】:

我曾经在 Heroku 上安装我的应用程序,它的工作方式是我有 2 个构建包。一个用于 NodeJS,一个用于 Python。 Heroku 运行 npm run build,然后 Django 提供 build 文件夹中的文件。

每当我的 GitHub 存储库有新推送时,我都会使用 AWS 上的 Code Pipeline 来部署我的应用程序的新版本。

由于我不知道如何在 EB 的 python 环境中运行 npm run build,所以我有一个解决方法。我运行 npm run build 并将其推送到我的存储库(从 .gitignore 中删除了 build 文件夹),然后 Django 在 EB 上提供文件。

但是,这不是最好的解决方案,我想知道是否有人知道如何运行 npm run build,就像 Heroku 可以使用他们的 NodeJS buildpack 在 EB 上运行 python 应用程序一样。

【问题讨论】:

【参考方案1】:

我不完全了解 Python,但我想你可以适应你的情况。

用于 Node.js 平台的 Elastic Beanstalk 默认使用 app.js,然后是 server.js,然后是 npm start(按此顺序)来启动您的应用程序。

您可以使用配置文件更改此行为。下面是使用 Node.js 完成的步骤:

    创建以下文件.ebextensions/<your-config-file-name>.config,内容如下:
    option_settings:
      aws:elasticbeanstalk:container:nodejs:
        NodeCommand: "npm run eb:prod"
    
    编辑您的package.json 以创建eb:prod 命令。例如:
    "scripts": 
      "start": "razzle start",
      "build": "razzle build",
      "test": "razzle test --env=jsdom",
      "start:prod": "NODE_ENV=production node build/server.js",
      "eb:prod": "npm run build && npm run start:prod"
    
    
    您可能会在构建过程中遇到权限被拒绝错误。要解决此问题,您可以创建具有以下内容的.npmrc 文件:
    # Force npm to run node-gyp also as root
    unsafe-perm=true
    

如果您需要更多详细信息,我写了一篇关于它的博文:I deployed a server-side React app with AWS Elastic Beanstalk. Here’s what I learned.

【讨论】:

感谢您的回答。我使用 Python 不仅为 react 应用程序提供服务,还为 API 和身份验证提供服务。为了使用 Python 和 Django 框架,我必须使用 EB for Python。所以我想知道是否可以在我的 pythonic EB 中构建我的 react 应用程序的生产版本。 我无法为您提供有关 python 的帮助,但概念仍然相同。您必须使用.ebextensions 自定义命令才能启动您的应用程序。让您了解如何编辑配置文件:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…【参考方案2】:

所以我想出了一个适合我的解决方案。

因为我想像 Heroku 使用 NodeJS buildpack 那样在服务器上创建我的应用程序的构建版本,所以我必须创建一个安装节点的命令,如下所示:

container_commands:
  01_install_node:
    command: "curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash - && sudo yum install nodejs"
    ignoreErrors: false

然后为了在 Python 环境 EB 上创建 react 应用的构建版本,我添加了以下命令:

container_commands:
  02_react:
    command: "npm install && npm run build"
    ignoreErrors: false

所以当然,在构建版本创建之后,你应该收集静态文件,所以这是我的工作配置文件最后的样子:

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: <project_name>/wsgi.py

  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: <project_name>.settings

  aws:elasticbeanstalk:container:python:staticfiles:
    /static/: staticfiles/

container_commands:
  01_install_node:
    command: "curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash - && sudo yum install nodejs"
    ignoreErrors: false

  02_react:
    command: "npm install && npm run build"
    ignoreErrors: false

  03_collectstatic:
    command: "django-admin.py collectstatic --noinput"

希望这对遇到相同情况的人有所帮助?

【讨论】:

以上是关于如何在 Elastic Beanstalk 上使用 Django 提供 React 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Elastic Beanstalk 上使用 virtualenv 系统站点包?

如何在 Elastic Beanstalk 上安装 matplotlib

如何在 AWS Elastic Beanstalk 上使用 Resque 运行 Rails 后台作业?

如何在 AWS Elastic Beanstalk 上运行 celery worker?

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

如何在 AWS Elastic Beanstalk 上设置 HTTPS