带有thinking_sphinx 3.1.1的rails 3.2.18正在从开发模式传递到生产模式。 在此过程中,同时执行以下任何工作:
bundle exec rake ts:rebuild
bundle exec rake ts:index
bundle exec rake ts:stop
bundle exec rake ts:start
搜索最终以
结束ActionView::Template::Error (unknown local index [...]
我最初意识到我在应用程序上运行了2个搜索pid,因为开发有一个shared
目录,其中放置了sphinx标记和tmp / pid文件。这是继续进行的,因此创建了两个pid:一个来自共享文件夹,另一个来自应用程序发布的共享文件夹。杜!
仍然是ps aux | grep searchd
正在返回两个进程
/fna/shared/config/development.sphinx.conf
pids 不匹配共享文件夹中的那些,并且他们调用开发
另一个仍在开发中的应用程序(!)也有两个进程
1)有两个过程是正常的吗? 2)如何让pids为production.shpinx.conf启动(并摆脱偶然的污染)?
我意识到这也可能受到capistrano部署的影响,并欢迎提出正确完成问题的建议。
更新
ps ax | grep "searchd"
为
kill 99335
然
RAILS_ENV=production bundle exec rake ts:rebuild
[...]
Started searchd successfully (pid: 7086)
现在两个pid用于适当的环境
shared/config/production.sphinx.conf
并重新部署。成功。所以剩下的疑问是在capistrano部署。 鉴于索引是每晚运行的(并且可以接受),deploy.rb文件是否应包含:
invoke_command "cd #{release_path} && RAILS_ENV=#{rails_env} bundle exec rake ts:rebuild"
答案 0 :(得分:1)
您不需要在每次部署后运行ts:rebuild
- 它就像db:migrate
一样,只有在您更改索引的结构时才需要它,或者添加/删除索引。如果您只想更新索引中的数据,请使用ts:index
任务(因为您已经定期执行)。
值得确保您的paths are set up correctly确保所有生产Sphinx文件都在特定版本目录之外 - 最好将它们放在共享目录或类似内容中(而不是依赖于符号链接文件) 。如果全部设置完毕,则不需要在部署过程中运行TS任务。
另外:思考Sphinx v3使用Sphinx的threaded工作人员,所以总是至少有两个进程 - 一个是主进程,一个是等待第一个连接。如果有更多的并发连接,则会有更多的搜索进程。