生产环境下Rails环境变量配置问题咨询
嗨,我明白你在生产环境配置Figaro时的困惑了——别慌,咱们一步步来搞定,其实和开发环境的逻辑是通的,只是部署到VPS时需要注意几个关键点,确保环境变量能正确加载到Rails应用里。
1. 先确保Figaro在生产服务器上能正常加载配置
Figaro的核心是帮你把config/application.yml里的配置注入到环境变量中,所以首先要让生产服务器上的Rails应用能访问到这个文件:
上传application.yml到生产服务器:
因为这个文件没进Git仓库,你需要手动把它传到VPS的Rails应用目录下。比如用scp命令:scp config/application.yml your-ssh-user@your-vps-ip:/path/to/your/rails-app/config/如果用Capistrano部署的话更省心,在
deploy.rb里添加一行,让Capistrano把这个文件设为共享文件:append :linked_files, "config/application.yml"然后在服务器的
shared/config目录下放一份application.yml,以后每次部署都会自动软链接到这个文件,不用重复上传。确保Gemfile包含Figaro:
确认你的Gemfile里Figaro不是只在开发环境,最好放在全局(或者至少包含生产环境):gem 'figaro'部署时运行
bundle install --without development test(根据你的环境调整),确保生产环境安装了Figaro。
2. 配置生产环境的database.yml
这一步和开发环境几乎一样,直接用ENV['变量名']来引用Figaro加载的环境变量就行。比如你的database.yml生产段可以这么写:
production: adapter: postgresql # 换成你实际用的数据库,比如mysql2 database: your_production_database_name username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %> host: <%= ENV['DATABASE_HOST'] %> # 如果数据库不在本地服务器就填实际地址,本地的话写localhost pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> encoding: unicode
对应的application.yml里要包含生产环境的这些配置(可以分环境写,也可以全局写,分环境的优先级更高):
production: DATABASE_USERNAME: your_prod_db_username DATABASE_PASSWORD: your_secure_production_db_password DATABASE_HOST: localhost
3. 验证配置是否生效
登录到你的VPS,进入Rails应用根目录,启动生产环境的控制台:
rails c production
然后输入ENV['DATABASE_PASSWORD'],如果能输出你在application.yml里设置的密码,说明Figaro已经成功把配置注入到环境变量里了,database.yml也能正确读取到。
4. 额外的安全小提示
- 给生产服务器上的
application.yml设置严格的权限,避免其他用户读取:chmod 600 config/application.yml - 如果你用systemd或者其他进程管理器(比如Puma、Unicorn)启动Rails服务器,不需要额外配置环境变量——Figaro会在Rails启动时自动加载
application.yml的内容,直接就能用。
内容的提问来源于stack exchange,提问作者catmal

