在京东云服务器(ECS)上快速搭建 Ruby on Rails 环境,推荐使用 RVM + Nginx + Puma/Passenger + PostgreSQL 的组合。以下是高效、可复用的步骤指南:
✅ 前置准备
-
登录京东云控制台
- 创建 ECS 实例(推荐 CentOS 7/8 或 Ubuntu 20.04+;Ubuntu 更友好)
- 安全组开放端口:
22(SSH)、80(HTTP)、443(HTTPS)、3000(开发调试,可选) - 安装 SSH 密钥并绑定到实例
-
连接服务器
ssh -i your-key.pem root@<your-ecs-ip> # 若使用密码登录,请确保已设置强密码
🚀 快速搭建流程(以 Ubuntu 22.04 为例)
1️⃣ 更新系统 & 安装基础依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git wget build-essential libssl-dev
libreadline-dev zlib1g-dev libyaml-dev libpq-dev
postgresql postgresql-contrib nginx
💡
libpq-dev是 Rails 连接 PostgreSQL 所必需的 C 头文件。
2️⃣ 安装 RVM(Ruby Version Manager)
curl -sSL https://rvm.io/mpapis.asc | gpg --import -
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -
curl -L https://get.rvm.io | bash -s stable --ruby=3.2.2
✅ 添加 RVM 到当前 shell:
source ~/.rvm/scripts/rvm
🔔 若提示
command not found: rvm,重启终端或手动 source。
验证 Ruby 版本:
ruby -v # 应显示 3.2.2
gem -v
3️⃣ 安装 Bundler & 创建 Rails 项目
gem install bundler
bundle config set --local without 'development test' # 生产环境优化
新建 Rails 应用(替换 <app_name>):
rails new <app_name> --database=postgresql --skip-test --skip-system-test
cd <app_name>
⚠️ 注意:
--skip-*选项可减少非必需组件,加快部署;生产环境建议保留测试框架。
4️⃣ 配置 PostgreSQL
sudo -u postgres psql
CREATE DATABASE <app_name>_production OWNER rails_user;
GRANT ALL PRIVILEGES ON DATABASE <app_name>_production TO rails_user;
q
📝 实际使用时请替换为真实用户名/数据库名。
编辑 config/database.yml,将 production 段改为:
production:
adapter: postgresql
encoding: unicode
database: <app_name>_production
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: rails_user
password: <your_db_password>
host: localhost
生成迁移并执行:
bin/rails db:create
bin/rails db:migrate
5️⃣ 安装 Puma(推荐生产服务器)& 编译 native extensions
bundle install
✅ 自动编译
pg、nokogiri等 gem 的 C 扩展。
6️⃣ 启动服务(开发模式测试)
bin/rails server -b 0.0.0.0 -p 3000
访问 http://<your-ecs-ip>:3000 确认运行正常。
7️⃣ 配置 Nginx + Puma(生产环境)
▶ 安装 systemd 管理 Puma
sudo apt install -y ruby-puma
创建 /etc/systemd/system/puma.service:
[Unit]
Description=Puma HTTP Server for <app_name>
After=network.target
[Service]
Type=simple
User=<your-user>
WorkingDirectory=/path/to/<app_name>
ExecStart=/usr/bin/bundle exec puma -C config/puma.rb
Restart=always
Environment=RAILS_ENV=production
[Install]
WantedBy=multi-user.target
启用并启动:
sudo systemctl daemon-reload
sudo systemctl enable puma
sudo systemctl start puma
sudo systemctl status puma
▶ 配置 Nginx
创建 /etc/nginx/sites-available/<app_name>:
server {
listen 80;
server_name your-domain.com; # 或 IP
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用站点:
sudo ln -s /etc/nginx/sites-available/<app_name> /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
🔐 可选增强项
| 功能 | 命令/操作 |
|---|---|
| HTTPS(Let’s Encrypt) | sudo certbot --nginx -d your-domain.com |
| 日志轮转 | logrotate 配置 /var/log/<app_name>/ |
| 备份数据库 | pg_dump -U rails_user <db_name> > backup.sql |
| 监控 | 安装 htop, netstat, 或接入京东云监控 |
🛠️ 故障排查速查
| 问题 | 解决方案 |
|---|---|
bundle install 报错 pg 编译失败 |
检查是否安装了 libpq-dev |
puma 无法启动 |
journalctl -u puma -f 查看日志 |
| 数据库连接拒绝 | 检查 pg_hba.conf 和 listen_addresses |
| Nginx 502 Bad Gateway | 确认 Puma 正在运行且监听 3000 |
需要我提供:
- 自动化脚本(Ansible / Shell 一键部署)?
- Docker 化部署方案?
- 针对 CentOS 版本的适配步骤?
欢迎告诉我你的具体需求,我可进一步定制!
CLOUD云计算