我有一个在生产环境中的 Nginx 和 Puma 上运行的 Rails 应用程序。
网页加载出现问题(TTBF 延迟),我正在尝试找出原因。
在 Production.log 的后端,我看到我的网页在134 毫秒内渲染得足够快:
Completed 200 OK in 134ms (Views: 49.9ms | ActiveRecord: 29.3ms)
Run Code Online (Sandbox Code Playgroud)
但在浏览器中我看到 TTFB 是311.49ms:
我知道设置中可能存在问题,或者进程计数可能不是最佳的,但找不到约 177 毫秒延迟的原因。.将不胜感激。
下面列出了我的 VPS 属性和配置。
环境
VPS 属性
nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 8096;
multi_accept on;
use epoll;
}
http {
# Basic Settings
sendfile on; …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的新机器上安装 Rails,但在捆绑时不断收到此错误。
An error occurred while installing puma (4.3.5), and Bundler cannot
continue.
Make sure that `gem install puma -v '4.3.5' --source 'https://rubygems.org/'`
succeeds before bundling.
In Gemfile:
puma
Run Code Online (Sandbox Code Playgroud)
当我运行时gem install puma -v '4.3.5' --source 'https://rubygems.org/,我收到此错误:
Building native extensions. This could take a while...
ERROR: Error installing puma:
ERROR: Failed to build gem native extension.
current directory: /Users/christopherdavis/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/puma-4.3.5/ext/puma_http11
/Users/christopherdavis/.rbenv/versions/2.7.1/bin/ruby -I /Users/christopherdavis/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0 -r ./siteconf20200829-23175-2h0q0u.rb extconf.rb
checking for BIO_read() in -lcrypto... yes
checking for SSL_CTX_new() in -lssl... yes
checking for …Run Code Online (Sandbox Code Playgroud) 我的 Prod 服务器上偶尔会出现此错误。
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds
我发现数据库的 CPU 使用率不高,但这个错误仍然每天发生一次,也许两次。
美洲狮.rb
threads 2, 100
workers 2
Run Code Online (Sandbox Code Playgroud)
数据库.yml
pool: 15
Run Code Online (Sandbox Code Playgroud)
红宝石红宝石:2.3
美洲狮
puma (3.11.2)
Run Code Online (Sandbox Code Playgroud)
数据库大小
db.m5.large
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来保留 Ruby on Rails“默认信息页面”。在 Rails 7 中,该页面在中间显示 Rails 徽标,在底部显示 Ruby、Rails 等的版本号。将路由添加到 config/routes.rb 文件后,默认页面将不再显示。我希望它成为我在家进行简单实验项目的索引页。有任何想法吗?也许它与 Puma 网络服务器有关?谢谢!
我做了一个小的Sinatra应用程序.在我的Gemfile中添加gem 'puma'生产组
group :production do
gem 'puma'
gem 'dm-postgres-adapter'
end
Run Code Online (Sandbox Code Playgroud)
我设置了生产模式 config.ru
set :environment, :production
Run Code Online (Sandbox Code Playgroud)
但是在我运行之后,运行backup默认的webrick Web服务器.我怎么解决这个问题?
作为一种学习体验,我正在尝试为Android和iOS构建一个聊天应用程序,允许群聊(如Whatsapp)和Rails中的聊天服务器.经过一番研究后,我决定和Faye一起去,因为它似乎很容易实现.我正在按照这些教程来做到这一点:
对于我的工作栈,我想建立的Nginx有Thin或Puma,但我不明白这将是更好,这将是"正确"的方式建立生产聊天服务器.
我知道这个问题可能有点主观,但谷歌搜索/研究过去一周这让我更加矛盾,因为大多数例子都在使用,Thin但大多数文章都喜欢Puma.
如果您能提供您的答案的参考和示例,我将不胜感激.谢谢.
我正在尝试使用 Capistrano 部署 Rails 应用程序。我有一个问题bundler: command not found: pumactl,我似乎已经通过将 puma gem 添加到:development组外的 Gemfile 中解决了这个问题。
文件
source 'https://rubygems.org'
gem 'rails', '4.2.0'
gem 'sass-rails', '~> 5.0'
gem 'semantic-ui-sass', github: 'doabit/semantic-ui-sass'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'mongoid'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'prawn-rails', '0.1.1'
gem 'fastimage', '1.6.6'
gem 'mini_magick', '4.0.4'
gem 'carrierwave', '0.10.0'
gem 'puma', '2.11.1'
group :development, :test do
gem 'capistrano', '3.3.5'
gem 'capistrano-rvm', …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的网站从http迁移到https。该体系结构是:在Nginx服务器(侦听端口80)上运行的angularJS Webapp前端,它将请求发送到在Puma服务器(侦听端口8080)上运行的Rails API应用。两台服务器都一起位于Amazon EC2实例中。
这是我第一次迁移到HTTPS,我一点也不熟练。读了很多书,我取得了一些进步,但现在我陷入了困境。
我想确认我是正确的方法还是错误的方法。
在这一刻:
现在(这仅在开发中,而不是在AWS实例中工作)为了保护后端Puma服务器,我采用了一种非常简单的方法:由于Rails API是私有的,因此我创建了一个自签名SSL证书,并仅使用它来启动这样的Puma服务器:
捆绑执行程序puma -b'ssl://127.0.0.1:3000?key = puma.server.key&cert = puma.server.crt'-e开发-S〜/ puma -C config / puma / development.rb
如前所述,这正在开发中。我的Nginx服务器正在侦听443,并将请求发送到在端口3000侦听的Puma。
因此,在这一点上,我想知道我是否采用了正确的方法,但是我只是缺少了一些东西,否则,对于EC2实例来说这是错误的方法,我需要做一些真正不同的事情。注意:我已经阅读了一些有关如何配置Nginx服务器以代理https的内容,但目前还不太了解。我应该这样走吗?
@ffeast回答后的评论和问题:
我了解您的做法。我建议采用第二种方法。但是,我有一些问题:
我是否可以解决通过这种方法获得的blocked:mixed-content错误?为什么?我的意思是,Rails API请求是否应该更改?注意:目前,在Angular中,我有一些资源可以发送请求,例如:// domain-name:8080 / action,而Puma服务器正在侦听该端口中的请求。我目前没有任何代理通行证。
我认为您包括连接到Puma套接字的de Nginx配置,我想我需要创建此Puma套接字,我将需要检查如何做。如果您知道包含示例将有帮助。如果使用此套接字配置Puma,是否需要在特定端口中启动Puma?
我试图理解整个图片,但我仍然困惑:3.1对API的请求(来自Angular Nginx)应该是什么样的?3.2是否应该在特定端口上启动Puma?我不知道套接字方法是否需要... 3.3以及代理传递配置应如何匹配这些请求。
您能否澄清一下可能会更新您的示例?假设目前的请求就像// domain-name:8080 / action
更新 我正在尝试配置Ningx以将请求传递给PUMA套接字(目前正在开发中)。我遇到了错误,请查看一篇新文章以保持此整洁:Nginx代理传递给Rails API
更新2 它正在工作!我的网站安全无误!这是我的配置。
upstream api.development {
# Path to Puma SOCK file, as defined previously
server unix:/tmp/puma.sock fail_timeout=0;
}
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /keys/ssl/development.server.crt;
ssl_certificate_key /keys/ssl/development.server.key;
# ssl_session_cache shared:SSL:1m; …Run Code Online (Sandbox Code Playgroud) 我似乎无法弄清楚如何杀死这个过程.
我已经知道,我可以,并且一直只是在不同的端口上运行服务器,但这让我感到烦恼,我无法弄清楚这一点.
下面你将首先看到我尝试运行rails时遇到的错误然后我尝试找到PID并杀死所有的错误.
// ? rails s
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.6.2 (ruby 2.2.3-p173), codename: Sleepy Sunday Serenity
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Exiting
/Users/jrogers2/.rvm/gems/ruby-2.2.3/gems/puma-3.6.2/lib/puma/binder.rb:266:in `initialize': Address already in use - bind(2) for "::1" port 3000 (Errno::EADDRINUSE)
from /Users/jrogers2/.rvm/gems/ruby-2.2.3/gems/puma-3.6.2/lib/puma/binder.rb:266:in `new'
from /Users/jrogers2/.rvm/gems/ruby-2.2.3/gems/puma-3.6.2/lib/puma/binder.rb:266:in `add_tcp_listener'
from /Users/jrogers2/.rvm/gems/ruby-2.2.3/gems/puma-3.6.2/lib/puma/binder.rb:260:in `block in …Run Code Online (Sandbox Code Playgroud) puma ×10
nginx ×3
ruby ×3
amazon-ec2 ×1
bash ×1
capistrano ×1
capistrano3 ×1
faye ×1
https ×1
macos ×1
performance ×1
puma-dev ×1
rack ×1
rbenv ×1
rubygems ×1
sinatra ×1
ssl ×1
thin ×1
unix ×1