You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ubuntu中设置环境变量,使Nginx、Sidekiq和Rails应用在开发与生产环境均能访问

在Ubuntu中设置环境变量,让Nginx、Sidekiq、Rails跨环境访问

一、开发环境配置

1. Rails与Sidekiq共享变量

  • 直接修改用户shell配置文件(比如~/.bashrc或~/.zshrc,取决于你用的shell),添加环境变量:
    export RAILS_ENV=development
    export REDIS_URL=redis://localhost:6379
    export DATABASE_URL=postgresql://user:pass@localhost/db_name
    
    保存后执行source ~/.bashrc(或对应文件)生效,重启终端后变量会自动加载。
  • 更规范的方式是用Rails的dotenv gem:在项目根目录创建.env.development文件,写入变量:
    RAILS_ENV=development
    REDIS_URL=redis://localhost:6379
    
    记得把.env.development加入.gitignore,避免敏感信息提交到仓库。

2. 开发环境下的Nginx配置

如果开发中用Nginx反向代理Rails服务,需要让Nginx读取环境变量:

  • 打开Nginx主配置/etc/nginx/nginx.conf,在最顶部添加要读取的变量:
    env REDIS_URL;
    
  • 重启Nginx生效:sudo systemctl restart nginx,之后在Nginx配置中可以用$REDIS_URL引用该变量。

二、生产环境配置

生产环境需要确保变量安全且所有服务都能读取,推荐以下几种方式:

1. 系统级全局变量(所有服务通用)

修改/etc/environment文件,直接写入变量(不需要export):

RAILS_ENV=production
REDIS_URL=redis://your-redis-host:6379
DATABASE_URL=postgresql://prod-user:prod-pass@db-host/prod-db
SECRET_KEY_BASE=your-rails-secret-key

保存后,需要重启所有相关服务才能生效:

sudo systemctl restart nginx
sudo systemctl restart sidekiq
sudo systemctl restart puma  # 假设Rails用puma作为服务器

所有登录用户和systemd管理的服务都会自动加载这些变量。

2. 针对单个服务的变量配置

如果某些变量只需要特定服务访问,可以在对应的systemd服务配置中添加:

Rails(以Puma为例)

  • 编辑Puma的systemd服务文件(比如/etc/systemd/system/puma.service),在[Service]块下添加:
    Environment="SECRET_KEY_BASE=your-secret-key"
    Environment="RAILS_ENV=production"
    
  • 或者创建单独的配置文件覆盖:
    sudo mkdir -p /etc/systemd/system/puma.service.d
    sudo nano /etc/systemd/system/puma.service.d/env.conf
    
    写入:
    [Service]
    EnvironmentFile=/etc/puma/env
    
    然后在/etc/puma/env文件中写入变量(格式同/etc/environment)。
  • 重载systemd并重启服务:
    sudo systemctl daemon-reload
    sudo systemctl restart puma
    

Sidekiq

和Rails服务配置类似:

  • 编辑Sidekiq的systemd服务文件(比如/etc/systemd/system/sidekiq.service),在[Service]块添加:
    Environment="REDIS_URL=redis://your-redis-host:6379"
    Environment="RAILS_ENV=production"
    
  • 或者用EnvironmentFile引用单独的变量文件,之后重载systemd并重启Sidekiq:
    sudo systemctl daemon-reload
    sudo systemctl restart sidekiq
    

Nginx

Nginx默认不会自动读取系统环境变量,需要手动指定:

  • 打开/etc/nginx/nginx.conf,在顶部添加要读取的变量:
    env SECRET_KEY_BASE;
    env RAILS_ENV;
    
  • 重启Nginx:sudo systemctl restart nginx
  • 在Nginx配置中可以直接用$SECRET_KEY_BASE引用变量,比如在反向代理配置里传递给Rails:
    location / {
      proxy_pass http://localhost:3000;
      proxy_set_header X-RAILS-ENV $RAILS_ENV;
    }
    

三、验证变量是否生效

  • Rails:登录服务器,进入项目目录执行rails c production,输入ENV['VAR_NAME']查看是否返回正确值。
  • Sidekiq:可以在Sidekiq的日志中添加打印ENV的代码,或者执行sidekiqctl status后查看进程的环境变量(用ps eww [pid])。
  • Nginx:在Nginx配置的server块中添加日志输出变量:
    access_log /var/log/nginx/access.log combined;
    log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$RAILS_ENV"';
    
    重启Nginx后查看日志,确认变量是否存在。

内容的提问来源于stack exchange,提问作者vidur punj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:42:24