如何在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_namesource ~/.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块中添加日志输出变量:
重启Nginx后查看日志,确认变量是否存在。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"';
内容的提问来源于stack exchange,提问作者vidur punj
相关产品推荐
相关产品推荐

