Rails(通过Ansible使用Nginx/Passenger)无法看到我的RAILS_MASTER_KEY环境变量

51次阅读
没有评论

问题描述

正在使用Ansible编写Playbooks来为Ubuntu 18.04服务器提供服务。他的目标是使用Passenger和Nginx为一个Rails应用程序配置服务器。他使用了Ansible Galaxy中的geerlingguy.passenger角色来配置Passenger和Nginx。此外,他还使用了zzet.rbenv来安装Ruby 2.5.3。尽管Ansible Playbooks似乎已经成功执行,并且在通过SSH登录服务器时一切都正常(rbenv已在路径上,RAILS_MASTER_KEY环境变量已定义),但当他尝试访问首页时,他遇到了Passenger错误:”无法通过Phusion Passenger应用程序服务器启动Web应用程序”。在查看/var/log/nginx/error.log时,他看到以下内容:

Missing encryption key to decrypt file with. Ask your team for your master key and write it to /var/www/releases/20191230212823/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].

尽管他使用weareinteractive.environment角色配置了持久的环境变量,但他不确定为什么会出现上述错误。检查了/etc/environment,确认RAILS_MASTER_KEY已定义,而且在手动登录deploy用户时也可以看到它。然而,/etc/nginx/nginx.conf显示默认用户是www-data

user www-data;

他认为这应该是可以的,因为环境变量的配置方式与用户帐户无关。那么为什么Rails在通过SSH登录时能看到这个环境变量,但在Nginx/Passenger启动Rails时却无法看到呢?

解决方案

请注意以下操作可能存在版本差异,建议做好备份。

方案

根据最佳回答,问题出在Nginx/Passenger没有从/etc/environment中加载环境变量。一种标准的方法是在Nginx配置中使用passenger_env_var,这是用户joshaidan所建议的。下面是通过Ansible配置Passenger环境变量的步骤:

  1. 打开Nginx的配置文件,通常位于/etc/nginx/nginx.conf/etc/nginx/sites-available/default
  2. 在Nginx配置中的server块中添加以下内容,以设置RAILS_MASTER_KEY环境变量:
    server {
    # 其他配置...
    passenger_env_var RAILS_MASTER_KEY your_master_key;
    }

    请将your_master_key替换为实际的Rails主密钥。

以上步骤会在Nginx配置中添加一个名为RAILS_MASTER_KEY的环境变量,并将其设置为你提供的主密钥。这将确保Passenger能够正确读取该环境变量。

验证

重新启动Nginx以使配置生效,并确保Passenger可以访问并正确读取RAILS_MASTER_KEY环境变量。你可以访问应用程序的网页并确保不再出现关于缺少主密钥的错误。如果问题仍然存在,请检查Nginx和Passenger的日志以获取更多详细信息,可能还需要检查你的Ansible Playbooks中是否正确配置了passenger_env_var

备注

在Nginx配置中使用passenger_env_var可以让你明确地告诉Passenger要设置哪些环境变量。这在使用Passenger时经常需要注意,因为Passenger运行在Nginx之内,有一些环境变量可能不会自动传递到Passenger进程。

正文完