使用插件在 Redmine 中极慢的 PUT 请求

Extremely slow PUT request in Redmine with plugins

我有以下技术栈:

Agile 插件和 Easy Gantt 插件都包含拖放可视化 UI,拖放项目会导致 PUT 请求。我不知道除了这些插件之外,Redmine 是否在任何地方使用 PUT 请求。

问题是,这些 PUT 请求无缘无故地非常慢。他们需要大约 120000 毫秒(120 秒,2 分钟)才能完成。

这是来自 log/production.log 的日志:

Started PUT "/agile/board" for 127.0.0.1 at 2016-10-23 20:08:03 +0300
Processing by AgileBoardsController#update as */*
  Parameters: {"issue"=>{"status_id"=>"3"}, "positions"=>{"2"=>{"position"=>"0"}}, "id"=>"2"}
  Current user: admin (id=1)
  Rendered mailer/_issue.text.erb (4.8ms)
  Rendered mailer/issue_edit.text.erb within layouts/mailer (8.2ms)
  Rendered mailer/_issue.html.erb (1.3ms)
  Rendered mailer/issue_edit.html.erb within layouts/mailer (4.3ms)
  Rendered plugins/redmine_agile/app/views/agile_boards/_issue_card.html.erb (35.0ms)
Completed 200 OK in 120519ms (Views: 33.0ms | ActiveRecord: 41.0ms)

这里的日期是发起PUT请求的时刻。那么,RoR 在这 2 分钟内做了什么,如果它在 33 毫秒内呈现视图并在 41 毫秒内使用 ActiveRecords?它还能执行哪些 activity 我可以查看的内容?

这是来自 Firebug 的请求 headers:

Host: redmine.local
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: */*
Accept-Language: ru,ru-RU;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
X-CSRF-Token: ZKCHb1NeenfN6EVttTPHMiGItsTsKWDJPm5Q2VqaiYRRn420TH67pnwfRpWo/mQdDOWDhZNe1snDy+eP327PfQ==
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://redmine.local/projects/myproject/agile/board
Content-Length: 60
Cookie: _redmine_session=MjI1Q <... lots of data ...>f
X-Compress: 1
Proxy-Authorization: c7f14568a48248797f198ea6e3c7d7c4f39185ce12aeac08439a9d6726a4cfd5612d4cef98c0ca43
Connection: keep-alive

服务器回复如下:

Cache-Control: max-age=0, private, must-revalidate
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Sun, 23 Oct 2016 17:10:03 GMT
Etag: W/"0ec2e6c508ed9d99f224fc23e1fd3dbf"
Server: nginx/1.10.1 + Phusion Passenger 5.0.30
Set-Cookie: _redmine_session=VlZkakNTT <... lots of data ...>1f08a39ea5c63; path=/; HttpOnly
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: 30b3a5f8-edb0-419a-b5f1-c6603439438a
X-Runtime: 120.523361
X-XSS-Protection: 1; mode=block
status: 200 OK
x-powered-by: Phusion Passenger 5.0.30

在服务器 "Date" 的回答中,字段显示从开始 PUT 请求的那一刻起 2 分钟,所以我猜服务器在这 2 分钟后开始构建这个答案......什么?

在Firebug的时间面板中,DNS解析、连接和发送(我在同一台机器上连接到我的本地服务器)有三个零,120525ms等待和8ms接收。

这是来自 Nginx access.log 的此请求的日志记录:

127.0.0.1 - - [23/Oct/2016:20:10:03 +0300] "PUT /agile/board HTTP/1.1" 200 920 "http://redmine.local/projects/myproject/agile/board" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"

我尝试将 Nginx+Passenger 堆栈替换为 Apache2+Passenger 堆栈,但问题仍然存在。即使当我启动 Webrick 时,也有 2 分钟的超时,所以我相信这要么是 RoR 的问题,而不是 Web 服务器的问题。

我之前没有在 Rails 应用程序上编写 Ruby 的经验,只是安装它们。

问题是 after_save 正在通过 sendmail 发送电子邮件,而 sendmail 卡在了相对知名的错误 "My unqualified host name (your hostname here) unknown; sleeping for retry" 上。在我用谷歌搜索这个错误并确保我的主机名的正确 FQN 在 /etc/hosts 中之后,2 分钟的延迟变成了 2 秒的延迟。

127.0.0.1 localhost localhost.localdomain my-host-name