将 Rails + Puma + Postgres 应用程序部署到 Elastic beanstalk 的正确方法是什么?

2024-03-07

我有一个 Rails 5 API,我正在尝试在 Elastic Beanstalk 上(正确地)部署它。

这是我的初始config/puma.rb我使用的文件:

threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count

# Specifies the `port` that Puma will listen on to receive requests, default is 3000.
port        ENV.fetch("PORT") { 3000 }

# Specifies the `environment` that Puma will run in.
environment ENV.fetch("RAILS_ENV") { "development" }

# Allow puma to be restarted by `rails restart` command.

plugin :tmp_restart

我收到以下套接字错误:

2015/11/24 06:44:12 [crit] 2689#0: *4719 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream

为了解决这个问题,我尝试添加以下行并使其正常工作:

rails_env = ENV['RAILS_ENV'] || "production"
if rails_env == "production"
  bind "unix:///var/run/puma/my_app.sock"
  pidfile "/var/run/puma/my_app.sock"
end

我真正的问题是,这是正确的方法吗?如果有人以前做过,你能指点我吗?有没有办法通过 docker 容器来做到这一点?


您也可以将 Rails 应用程序作为 Rails - Puma 应用程序部署到 Elastic Beanstalk 或 Docker。答案会更笼统,更具体从哪儿开始比提供完整的解决方案。

红宝石 - 彪马

这可能相当棘手:如果您通过控制台(在 Web 浏览器中)为 Ruby 创建新的 Elastic Beanstalk 环境,它可以默认设置 Passenger 平台,而不是 Puma 平台。也许你无法在控制台中更改它:

要使用 Puma 创建新环境,请使用eb cli。不错的攻略here http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html。然而,在你跑步之前eb create,你还要做一件事——选择平台:

$ eb platform select

It appears you are using Python. Is this correct?
(y/n): n

Select a platform.
1) Go
2) Node.js
3) PHP
4) Python
5) Ruby
6) Tomcat
7) IIS
8) Docker
9) Multi-container Docker
10) GlassFish
11) Java
(default is 1): 5

Select a platform version.
1) Ruby 2.3 (Puma)
2) Ruby 2.2 (Puma)
3) Ruby 2.1 (Puma)
4) Ruby 2.0 (Puma)
5) Ruby 2.3 (Passenger Standalone)
6) Ruby 2.2 (Passenger Standalone)
7) Ruby 2.1 (Passenger Standalone)
8) Ruby 2.0 (Passenger Standalone)
9) Ruby 1.9.3
(default is 1):

如果您想创建 Elastic Beanstalk 的 Worker 而不是 Web Server,请运行:

 $ eb create -t worker

您可以使用控制台(Web 浏览器)或eb cli (docs http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-create.html) 设置其他配置。

Docker

以下帖子可能对如何设置 Rails + Puma + Nginx + Docker 有用:

http://codepany.com/blog/rails-5-and-docker-puma-nginx/ http://codepany.com/blog/rails-5-and-docker-puma-nginx/

这是多容器配置,其中 Nginx 绑定到端口 80 并通过套接字将请求流式传输到 puma。在你的情况下,它将是:"unix:///var/run/puma/my_app.sock"

要上传 Docker,您可以使用 AWS ECR 来存储 Docker 映像。您必须创建 Dockerrun.aws.json 文件(与 docker-compose.yml 文件非常相似),然后您可以通过 AWS 控制台(Web 浏览器)将其部署到您的环境中。

EDIT

这里是puma.rb配置文件:

threads_count = ENV.fetch('RAILS_MAX_THREADS') { 5 }
threads threads_count, threads_count

bind "unix:///var/run/puma.sock?umask=0000"

stdout_redirect "/var/log/puma.stdout.log", "/var/log/puma.stderr.log", true

# Specifies the `environment` that Puma will run in.
#
environment ENV.fetch('RAILS_ENV') { 'development' }

# Allow puma to be restarted by `rails restart` command.
plugin :tmp_restart

有些设置可能会有所不同,但重点是我将 puma 服务器绑定到 unix 套接字,并与 NGINX 连接。 NGINX 配置文件:

user  root;

error_log  /var/log/app-nginx-error.log;
pid        /var/run/app-nginx.pid;

events {
    worker_connections  8096;
    multi_accept        on;
    use                 epoll;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/app-nginx-access.log  main;

    sendfile           on;
    tcp_nopush         on;
    tcp_nodelay        on;
    keepalive_timeout  10;

    upstream appserver {
      server unix:///var/run/puma.sock;
    }

    server {
      listen 80 default_server;
      root /var/www/public;
      client_max_body_size  16m;

      location ^~ /assets/ {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
      }

      try_files $uri/index.html $uri @appserver;
      location @appserver {
        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-Host $server_name;
        proxy_set_header  Client-IP $remote_addr;
        proxy_pass        http://appserver;
      }

      access_log    /var/log/app-nginx-access.log;
      error_log     /var/log/app-nginx-error.log debug;
      error_page    500 502 503 504 /500.html;
    }
}

NGINX 配置文件中最重要的部分是:

upstream appserver {
  server unix:///var/run/puma.sock;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Rails + Puma + Postgres 应用程序部署到 Elastic beanstalk 的正确方法是什么? 的相关文章

随机推荐

  • 使用 graph api 获取用户所属的所有租户

    我有一个应用程序 它使用 AUTH v2 身份验证提供程序和公共租户 login microsoftonline com common v2 0 进行身份验证 现在 由于我的用户可以属于任何 AAD 租户 并且我希望我的用户能够选择他们正在
  • 在 UNIX 中比较两个文件

    我想比较两个文件 未排序 文件 1 和文件 2 我想执行 file2 file1 差异 而不管行号如何 差异不工作 我通过使用 comm 得到了解决方案 comm 23 file1 file2 会给你想要的输出 无论如何 首先需要对文件进行
  • Javascript将对象推送到全局数组会覆盖以前的值吗?

    我在 Javascript 中遇到这个问题 我想从对象数组中获取经度和纬度值 这一切都工作正常 但是当我尝试将其保存到全局数组中时 它会覆盖以前的每个值 结果是一个数组 其中包含最后推送的对象的 8 倍 全局数组 var coordinat
  • IIS Express (WebMatrix) 对外部连接开放

    我已经在端口 80 和 2012 上启用了 IIS Express HTTP 流量输入 和 IIS Express HTTPS 流量输入 的防火墙规则 此端口用于 WebMatrix 但我无法从 LAN 连接到服务器 WebMatrix 在
  • 如何在 weblogic 10.3 上的 MDB 中设置最大池大小

    我需要在 weblogic 10 3 上的 MDB 上设置最大池大小 我直接在MDB上插入这个注解 ActivationConfigProperty propertyName MaxPoolSize propertyValue 1 但它似乎
  • 使用 cronjob 运行 php 文件中的函数

    我的 php 文件 file1 php 中有一个函数 我正在尝试使用 cronjob 来调用此函数 我的 cron 作业命令是 php home name public html file1 php mail1 作为参考 函数代码如下 当直
  • 是否可以根据标准输入 git-diff 文件?

    假设我正在编辑一个文件 如果我保存文件 git diff会给我它相对于索引的变化 我想在不先保存文件的情况下获取相对于索引的更改 以获得 实时 差异 一种解决方案是将未保存的更改写入临时文件 即将文件保存在其他地方 将暂存文件写入另一个临时
  • OS X 10.10.2 与“__mpf_struct”相关的未定义符号错误

    我正在尝试编译一个程序 https github com davidsd sdpb https github com davidsd sdpb 在 OS X 10 10 2 上使用 gcc 4 9 boost 1 57 0 gmp 6 0
  • Code::Blocks:CMake 生成的 Makefile 表示“无需执行任何操作”。

    我刚刚在我的 Win7 64 Box 上安装了带有 MinGW 的 Code Blocks 并尝试编译 CMake 生成的项目 即 openclonk Clean all in clonk Cleaned clonk all Build a
  • 如何获取执行的.jar文件的路径?

    在 Java 中如何获取已执行的 jar 文件的路径 我尝试使用System getProperty user dir 但这只给了我当前的工作目录 这是错误的 我需要 jar 文件直接位于的目录路径 而不是 pwd 您能具体说明为什么需要该
  • 一种用于膨胀/收缩(偏移、缓冲)多边形的算法

    我如何 膨胀 多边形 也就是说 我想做类似的事情 要求是新 膨胀 多边形的边 点与旧 原始 多边形的边 点都处于相同的恒定距离 在示例图片上它们不是 因为那时它必须使用弧来膨胀顶点 但是让我们暂时忘记这一点 我正在寻找的数学术语实际上是向内
  • Vue cli 3 在构建后执行一些任务

    我在用vue cli 3这是我的vue config js const path require path const webpack require webpack const publicDir public const isProdu
  • Three.js 中“THREE.OrbitControls”中的相机位置发生变化

    The THREE OrbitControls当加载初始相机位置时工作正常 但是当使用按钮单击更改相机位置和相机旋转时 相机的位置发生变化 但是单击画布在新视图上旋转相机时 相机的位置突然发生变化 Camera Camera new THR
  • 将 SID 存储在变量中

    我需要一种方法将当前用户的 SID 存储在变量中 我尝试了很多变体 setlocal enableextensions for f tokens a in wmic path win32 useraccount where name Use
  • Web API 中的每个请求 DependencyResolver

    在 MVC 中 一个ModelValidatorProvider被实例化并调用以验证每个请求的模型 这意味着在 DI 环境中 它可以依赖于单个请求范围内的对象 例如工作单元或数据库上下文 在 Web API 中 这似乎已经发生了重大变化 不
  • 需要哪种算法来做到这一点?

    我有这种形式的数据 对于 x 1 y 是 1 4 6 7 9 18 16 19 之一 对于 x 2 y 是 1 5 7 4 之一 对于 x 3 y 是 2 6 4 8 2 之一 对于 x 100 y 是 2 7 89 4 5 之一 每组中只
  • 断言 __init__ 是用正确的参数调用的

    我使用 python 模拟来断言特定对象是使用正确的参数创建的 这就是我的代码的样子 class Installer def init foo bar version Init stuff pass def enter self retur
  • Spring MVC 请求中断钩子

    spring mvc 中是否有注释或其他内容可以让我在客户端关闭连接或以任何方式取消请求时立即调用某些内容 我得到了一个休息服务 通常非常快 但可能取决于用户输入几秒钟 我想在客户端断开连接后立即取消服务器端的处理 我可以实现客户端必须不时
  • 使两个不同长度的向量长度相等

    我有两个不同长度的向量 我怎样才能开始这两个系列 让它们的结局重合 x lt c 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 y lt c 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3
  • 将 Rails + Puma + Postgres 应用程序部署到 Elastic beanstalk 的正确方法是什么?

    我有一个 Rails 5 API 我正在尝试在 Elastic Beanstalk 上 正确地 部署它 这是我的初始config puma rb我使用的文件 threads count ENV fetch RAILS MAX THREADS