我有一个以 varnish+nginx 为前端的 Ruby on Rails 应用程序。由于除非您是登录用户,否则大多数站点内容都是静态的,因此我想在用户注销时使用清漆大量缓存站点,但仅在用户登录时缓存静态资产。
当用户登录时,他们的 Cookie: 标头中会出现 cookie 'user_credentials',此外我需要跳过缓存 /login 和 /sessions 以便用户可以首先获得他们的 'user_credentials' cookie .
默认情况下,Rails 不会设置缓存友好的 Cache-control 标头,但是当用户未登录时,我的应用程序会设置一个“public,s-max-age=60”标头。Nginx 设置为返回“远未来”过期标头对于所有静态资产。
我目前的配置在登录时完全绕过缓存,包括静态资产 - 并在注销时为所有内容返回缓存 MISS。我花了几个小时绕圈子,这是我目前的 default.vcl
director rails_director round-robin {
{
.backend = {
.host = "xxx.xxx.xxx.xxx";
.port = "http";
.probe = {
.url = "/lbcheck/lbuptest";
.timeout = 0.3 s;
.window = 8;
.threshold = 3;
}
}
}
}
sub vcl_recv {
if (req.url ~ "^/login") {
pipe;
}
if (req.url ~ "^/sessions") {
pipe;
} …Run Code Online (Sandbox Code Playgroud) 好吧,这是在融化我的大脑。这可能与我不太了解 Upstart 的事实有关。很抱歉,这个问题很长。
我正在尝试使用 Upstart 来管理 Rails 应用程序的 Unicorn 主进程。这是我的当前/etc/init/app.conf:
description "app"
start on runlevel [2]
stop on runlevel [016]
console owner
# expect daemon
script
APP_ROOT=/home/deploy/app
PATH=/home/deploy/.rbenv/shims:/home/deploy/.rbenv/bin:$PATH
$APP_ROOT/bin/unicorn -c $APP_ROOT/config/unicorn.rb -E production # >> /tmp/upstart.log 2>&1
end script
# respawn
Run Code Online (Sandbox Code Playgroud)
这工作得很好 - 独角兽开始很棒。不好的是,检测到的 PID 不是 Unicorn master 的,而是一个sh进程。这本身也不是那么糟糕 - 如果我没有使用自动独角兽零停机部署策略。因为在我发送-USR2给我的独角兽主人后不久,一个新主人出现了,而旧主人死了……这个sh过程也是如此。所以 Upstart 认为我的工作已经死了,如果我愿意,我不能再用它重新启动restart或停止它stop。
我玩过配置文件,尝试将 -D 添加到 Unicorn 行(如下所示$APP_ROOT/bin/unicorn -c $APP_ROOT/config/unicorn.rb -E production -D:)来守护 Unicorn,然后我添加了该expect daemon …
我目前正在研究 Ruby/Ruby on Rails 作为 Python/Django 的替代品。我的主要问题是,在 Linux 上安装 Ruby gems 和/或 Ruby on Rails 项目时,特别是一般的 dist 或 Gentoo 的最佳实践是什么还不清楚。
在 Gentoo 中,开发人员倾向于打包 gem。这是通过 portage 而不是 gem 安装它们的首选方式。但是我不知道这是否是正确的方法,因为您将始终缺少主要项目及其依赖项,您要么必须为其编写自己的 ebuild(没什么大不了的)并对其进行维护。那时我看不到任何更多优势,因为一旦我编写了自己的 ebuild,我就必须密切关注包以进行新的开发,因为包不会有任何神奇的颠簸。:-) 此外,Ruby 世界是一个快速移动的目标,并不是 dist 树中的所有打包 gem 都真正跟上速度。
另一方面,直接通过 Bundler 或直接通过 gem 包管理器安装似乎也有点不稳定。如果您不小心,您会绕过 diss 包管理器并有两个相互竞争的管理器。例如,dist 更新到 Ruby 1.9.4 并引入了一些特定于 dist 的特性和一些 gems 意外损坏。然而,他们为它修补了自己的包装宝石。或者,如果您使用 Bundler,项目在其依赖项的版本方面往往相当严格,因此,即使某个依赖项的安全更新可用,您也可能无法获得它,因为该项目明确指定了一个版本。所以你必须再次手动跳入。
现在,我很感激社区对处理此类事情的正确方法 (TM) 以及如何在生产服务器上正确维护 Ruby/Ruby on Rails 基础和多个项目(包括第三方项目)的意见。
请注意,这不是关于如何部署项目/应用程序。这是关于维护的最佳实践...
我在连接到我的 Ruby on Rails 开发服务器时遇到问题:
当我在不同的网络浏览器中输入 192.168.0.10:3000 时,连接就会超时。
我怀疑问题出在我的防火墙配置上,但我尝试打开所有内容,但似乎不起作用。
服务器在我的本地网络上,有一个静态 IP 并且配置正确 - 我可以通过 SSH 连接到盒子,它可以连接到互联网进行更新。它运行 CentOS 6.3,我按照以下说明安装了 Rails:http : //itekblog.com/ruby-on-rails-on-centos-6-3-is-easy/
服务器正在运行:我可以使用 wget localhost:3000 下载“Welcome Aboard”页面
我认为它应该监听所有接口:
[sandy@pops testproject4]$ rails server
=> Booting WEBrick
=> Rails 3.2.8 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-08-18 18:29:04] INFO WEBrick 1.3.1
[2012-08-18 18:29:04] INFO ruby 1.8.7 (2011-06-30) [i386-linux]
[2012-08-18 18:29:04] INFO WEBrick::HTTPServer#start: pid=9881 port=3000
Run Code Online (Sandbox Code Playgroud)
我想我已经打开了所有端口
[sandy@pops testproject4]$ sudo iptables -L
Chain …Run Code Online (Sandbox Code Playgroud) 我主要按照本指南在 Ubuntu (Amazon EC2) 上创建了一个 nginx/unicorn/capistrato 设置。我想一切都设置得像它应该的那样,但是当我启动 Unicorn 时,我在日志中收到(很多)这个错误:
E, [2012-09-08T08:57:20.658092 #12356] ERROR -- : Operation not permitted (Errno::EPERM)
/home/deployer/apps/bridgekalenderen.no/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/worker.rb:82:in `initgroups'
Run Code Online (Sandbox Code Playgroud)
我看到它与用户的权限有关,但我无法弄清楚我遗漏了什么。如果我使用 sudo(或 rvmsudo,真的)启动服务器,它会很好地启动。
用户具有 sudo 功能,我已经多次修改了该应用程序,因此那里的文件权限应该没问题。/tmp 中的独角兽套接字归部署者用户所有,因此这也不应该是问题。
有没有人知道在哪里看?
更新:
经过一番挖掘,我发现它归结为一个Process.initgroups抛出 EPERM的调用。我已经在 irb 中验证了这一点。我无法弄清楚导致错误的原因。用户可以阅读/etc/group。
我需要增加在乘客上运行的 Rails 应用程序的passenger_max_pool_size。我已经使用 Elastic beanstalk 进行部署。任何想法,如何解决这个问题?是否有选项设置或容器命令来执行此操作
我通过这个问题尝试了我在谷歌中找到的所有内容,但是 - 什么都没有。无论如何都行不通。
我的 NGINX 默认:
upstream app {
server unix:/tmp/unicorn.rails.sock fail_timeout=0;
}
server {
listen 80;
root /home/rails/public;
server_name _;
index index.htm index.html;
location / {
try_files $uri/index.html $uri.html $uri @app;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
try_files $uri @app;
}
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
}
Run Code Online (Sandbox Code Playgroud)
NGINX 错误日志:
*12 connect() to unix:/tmp/unicorn.myapp.sock failed (2: No such file or directory) while connecting to upstream, client: 46.228.180.65, server: _, request: "GET / …Run Code Online (Sandbox Code Playgroud) 最近我为我的局域网安装了 gitlab。当我的用户尝试创建他们的帐户时,他们会收到电子邮件确认消息。现在我的问题是我想禁用整个电子邮件确认功能和一切。为此,我必须在 gitlab 配置文件中配置什么文件,该怎么做?我必须更改哪些选项我在 ruby 方面很差,请详细解释。
我正在使用乘客/Apache 2.2 在我的服务器上运行 redmine(一个 RoR 应用程序)。乘客和红宝石使用太多内存。
有没有更有效的内存方式来运行 redmine/ruby?
我只需要支持六个 redmine 用户。我想继续使用 Apache,但我愿意接受所有不是“使用 nginx/lighttpd”的建议。
(以下数据来自 512MB VPS,所以 Ruby 使用超过 128MB 仅用于 redmine)
user ....... %mem ....... process
-----------------------------------
www-data ... 13.6 0:00.65 ruby1.8
www-data ... 12.2 0:04.86 ruby1.8
www-data ... 9.4 0:04.15 apache2
www-data ... 9.0 0:13.94 apache2
www-data ... 3.2 0:00.27 apache2
root ... 2.5 0:00.23 apache2
root ... 1.9 0:01.19 ruby1.8
Run Code Online (Sandbox Code Playgroud)
那么,有什么比乘客更好的呢?
谢谢你的想法!!
我有多个 Web 应用程序在它们自己的 http 服务器上运行,例如端口 8080 上的 ruby/rails 应用程序和 8081 端口上的 python/cherrypy 应用程序。
是否可以通过单个端口地址使这些透明可用?也许通过添加转换所有请求的第三个 http 服务器(例如http://localhost/app1和http://localhost/app2)。我选择的平台是 Linux