您也可以将 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;
}