我从一位无法再联系的开发人员那里继承了一个项目。这是一个 Ruby on Rails 项目,托管在 Linode 上,以 SVN 作为 vcs。
我可以通过 SFTP 进入服务器并更改文件,但更改不会显示在网站上,直到我 ssh 进入并重新启动服务器。这些不是对配置文件的更改,只是对一些 erb.html 视图的简单更改。
在我之前使用 git 和 Linode 的经验中,我只需推送,更改就会实时显示。也许老开发人员使用 svn hook 设置了一些东西?
答案1
我能想到两种可能导致这种情况的可能性:
- 缓存。如果您使用的是 PHP,那么我会假设这是 APC,并将
stat
设置切换为Off
。由于对 Ruby 不够熟悉,我只能猜测它内置了一个 OpCode 缓存,并且重新启动整个服务器会刷新缓存。您可能只需重新启动 HTTP 守护程序即可。 - 启动脚本。可能有一个启动脚本,用于运行 Subversion 存储库的签出或可能直接从一个目录复制到另一个目录。这也可能是现有脚本的一部分,例如启动 HTTP 守护程序的脚本。同样,找到并运行该脚本可能会为您省去重新启动整个服务器的麻烦。
当然,可以使用 SVN 提交后钩子来完成此处所做的一切,甚至包括重新启动服务器,但我要提醒大家不要这样做。将代码部署到生产服务器是您应该拥有一定程度的控制权的事情,并且应该与开发过程分开。开发人员提交某些内容并自动立即部署的想法让我感到毛骨悚然。
答案2
您实际上不需要重启服务器,尤其是 Rails 项目。最坏的情况下,您可能需要重新加载所选的 Apache/Nginx/Webserver,但实际上,您只需在内部重启项目即可。
您可以做以下两件事之一。假设您的项目由 Phusion Passenger 提供服务,您可以在服务器上的存储库中添加提交钩子以重新加载应用程序...
cd /wherever/your/svn/repository/is/hooks
touch post-commit
chmod 755 post-commit
进而
#!/bin/sh
#post-commit hook. This will force Phusion to reload your RoR project
echo "Some message. Just letting you know I'm doing my job"
/bin/touch /wherever/your/project/is/tmp/restart.txt
或者重新加载网络服务器(您需要确保您具有无密码 sudo 权限,否则将失败。即使您没有使用 Phusion,这也会强制刷新)
#!/bin/sh
#post-commit hook. This will reload the webserver, forcing everything to reload.
echo "Some message. Just letting you know I'm doing my job"
sudo /sbin/service whatever-your-webserver-init-is reload
瞧!提交后,您的项目就会重新加载,您应该能够立即看到您的更改*(重新加载页面后)。
*不过这些钩子适用于 SVN。它们可能适用于 Git,除非你尝试过,否则谁知道呢。有人可能想检查一下我,以防我弄错了