🦄 Unicorn.Rentals 有效命令手册 AWS EC2 + RDS 实战
📌 核心成功关键:正确的RDS端点
database-2.cyldwfb9sjcn.rds.cn-northwest-1.amazonaws.com.cn + 安全组允许VPC内访问 + 禁用本地PostgreSQL + Apache释放80端口。
📦 一、环境准备 & 软件安装
升级系统并安装必要软件包
sudo su root
dnf update -y
dnf install -y awscli docker httpd postgresql15
📌 注意:仅安装PostgreSQL客户端,服务器端不使用(改为RDS)。
启动 Docker & Apache(Apache 临时启动,稍后释放80端口)
systemctl start docker
systemctl enable docker
systemctl start httpd
systemctl enable httpd
usermod -aG docker ec2-user
newgrp docker
🛢️ 二、RDS PostgreSQL 数据库初始化(远程)
连接到RDS并创建库、用户、表
# 使用正确的 RDS 端点(database-2 实例,可解析且允许连接)
psql --host=database-2.cyldwfb9sjcn.rds.cn-northwest-1.amazonaws.com.cn \
--port=5432 --dbname=postgres --username=postgres
# 在 psql 内依次执行:
CREATE DATABASE unicorndb;
CREATE USER unicorndb WITH PASSWORD 'unicorndb';
GRANT ALL PRIVILEGES ON DATABASE unicorndb TO unicorndb;
\c unicorndb
CREATE TABLE IF NOT EXISTS unicorntable (
id SERIAL PRIMARY KEY,
requestid VARCHAR(255),
requestvalue VARCHAR(255),
hits INT
);
GRANT ALL PRIVILEGES ON TABLE unicorntable TO unicorndb;
GRANT USAGE, SELECT ON SEQUENCE unicorntable_id_seq TO unicorndb;
\q
⚠️ 注意:若遇到
no pg_hba.conf entry 错误,需在RDS安全组中添加EC2私有IP(或VPC CIDR)入站规则允许5432端口。⚙️ 三、Go 应用配置与端口释放
创建正确的 server.ini(指向可用的RDS端点)
cat > server.ini << 'EOF'
"LogLocation" = "./"
"PgsqlHost" = "database-2.cyldwfb9sjcn.rds.cn-northwest-1.amazonaws.com.cn"
"PgsqlPort" = "5432"
"PgsqlUser" = "unicorndb"
"PgsqlPass" = "unicorndb"
"PgsqlDb" = "unicorndb"
"PgsqlTable" = "unicorntable"
EOF
💡 此端点必须能通过DNS解析,并且RDS安全组允许EC2访问(本次使用 database-2 实例成功)。
释放80端口 & 关闭本地PostgreSQL(避免端口/资源冲突)
# 停止并禁用 Apache
systemctl stop httpd
systemctl disable httpd
# 如果本地安装了 postgresql-server,则停止(本例未安装服务器端,此步可选)
# systemctl stop postgresql (如果存在)
# 赋予执行权限
chmod 755 ws-ec2-root
# 临时关闭 SELinux(避免绑定80端口失败)
setenforce 0
getenforce # 应输出 Permissive
启动 Unicorn 服务 & 验证
# 杀掉残留进程
pkill -9 -f ws-ec2-root
# 后台启动
./ws-ec2-root &
# 等待3秒测试
sleep 3 && curl http://127.0.0.1
✅ 成功标志:终端显示独角兽ASCII图案,curl 返回API响应(非Apache默认页),日志显示
Server port numer: 80。🧪 四、排障关键命令回顾
DNS 解析测试 & 端口连通性
# 测试 RDS 域名解析
nslookup database-2.cyldwfb9sjcn.rds.cn-northwest-1.amazonaws.com.cn
# 使用 nc 测试5432端口连通性
nc -zv database-2.cyldwfb9sjcn.rds.cn-northwest-1.amazonaws.com.cn 5432
# 查看80端口占用
netstat -tulpn | grep :80
lsof -i :80
常见错误及对策
- no such host → RDS端点错误或DNS问题,使用正确的
database-2.xxx端点。 - no pg_hba.conf entry → RDS安全组未放行EC2私有IP,添加入站规则:PostgreSQL 5432 源为 EC2 安全组或 VPC CIDR。
- Permission denied (./ws-ec2-root) → 执行
chmod +x ws-ec2-root或chmod 755。 - bind: address already in use → Apache 占用80端口,用
systemctl stop httpd释放。 - SELinux 阻止绑定端口 → 开发环境可
setenforce 0,生产环境使用策略semanage port -a -t http_port_t -p tcp 80。
📌 五、最终成功启动日志摘录
INFO: 2026/05/14 11:30:06 Entries currently stored: 0
INFO: 2026/05/14 11:30:06 Precomputng...
INFO: 2026/05/14 11:30:06 Done with preliminary computations.
INFO: 2026/05/14 11:30:06 Server port numer: 80
Unicorn.Rentals Mobile API Service
(独角兽图案) ……
✅ curl http://127.0.0.1 返回 API 响应
INFO: 2026/05/14 11:30:06 Precomputng...
INFO: 2026/05/14 11:30:06 Done with preliminary computations.
INFO: 2026/05/14 11:30:06 Server port numer: 80
Unicorn.Rentals Mobile API Service
(独角兽图案) ……
✅ curl http://127.0.0.1 返回 API 响应
🧠 经验沉淀:本次部署的核心教训是 server.ini 中的 RDS 端点必须精确匹配可解析的实例,同时确保 RDS 安全组入站规则允许 EC2 访问。此外,Apache 默认占用 80 端口必须彻底禁用,SELinux 权限临时放宽可快速验证。
🦄 Unicorn.Rentals 部署手册 AWS实战·安全组完整记忆
🚀 一、正确部署步骤(完整无坑版)
1 系统升级 + 核心软件包安装
dnf update -y
dnf install -y awscli docker httpd postgresql15 postgresql15-server
2 初始化 PostgreSQL & 启动基础服务
postgresql-setup --initdb
systemctl start postgresql && systemctl enable postgresql
systemctl start docker && systemctl enable docker
systemctl start httpd && systemctl enable httpd # 临时,后续会释放80端口
usermod -aG docker ec2-user
3 创建 unicorndb 数据库、用户及表
su - postgres
createdb unicorndb
createuser -P unicorndb # 密码统一设为 unicorndb
psql -d unicorndb <
4 修改 pg_hba.conf 开启密码认证(关键路径修复)
sed -i 's/ident/trust/g' /var/lib/pgsql/data/pg_hba.conf
sed -i 's/peer/trust/g' /var/lib/pgsql/data/pg_hba.conf
systemctl restart postgresql
psql -h 127.0.0.1 -U unicorndb -d unicorndb -c "SELECT 1;"
📌 经验:路径必须为
/var/lib/pgsql/data/pg_hba.conf ,避免版本号子目录误区。5 释放 80 端口,处理 Apache 冲突 + 权限
systemctl stop httpd && systemctl disable httpd
chmod 755 ws-ec2-root
setenforce 0 # 临时关闭SELinux(快速验证)
getenforce
6 创建 server.ini (根治 panic)
cat > server.ini << 'EOF'
"LogLocation" = "./"
"PgsqlHost" = "127.0.0.1"
"PgsqlPort" = "5432"
"PgsqlUser" = "unicorndb"
"PgsqlPass" = "unicorndb"
"PgsqlDb" = "unicorndb"
"PgsqlTable" = "unicorntable"
EOF
7 启动 Unicorn 服务 & 验证
pkill -f ws-ec2-root
./ws-ec2-root &
sleep 3 && curl http://127.0.0.1
✅ 显示独角兽ASCII图案 + API 响应即为成功。
🔐 二、安全组记忆点 · 规则清单(珍贵运维参考)
以下为本次部署实际使用的 EC2 安全组规则,每条规则对应的 安全组ID (sgr-xxx) 均保留作为记忆资产,方便日后复用与审计。
📌 入站规则 (Inbound rules)
| 安全组规则ID (sgr-) | 端口 | 协议 | 源IP | 描述 | 用途 |
|---|---|---|---|---|---|
sgr-0542f8ec1f28e231f | 5432 | TCP | 0.0.0.0/0 | aqz | PostgreSQL 数据库端口 (⚠️ 生产限制访问) |
sgr-0419bb648fad9fffb | 22 | TCP | 0.0.0.0/0 | aqz | SSH 远程管理 (强烈建议改为特定IP) |
sgr-05bc9868276e41b6b | 80 | TCP | 0.0.0.0/0 | aqz | HTTP (Unicorn.Rentals API服务) |
sgr-0dd1bc697b69e42e3 | 443 | TCP | 0.0.0.0/0 | aqz | HTTPS (未来启用SSL) |
⚠️ 安全经验警告:开放
生产环境务必限制源IP为应用服务器IP或VPC CIDR,或使用 RDS 安全组内网访问。
0.0.0.0/0 到 5432 端口极其危险,暴露数据库到公网易受攻击。生产环境务必限制源IP为应用服务器IP或VPC CIDR,或使用 RDS 安全组内网访问。
💡 记忆要点:安全组ID (sgr-xxxx) 是资源唯一标识,可利用 AWS Config 或标签管理,建议记录每个规则对应的业务用途。
本次部署中所有 sgr-* 规则均绑定到同一个安全组,可以快速复制到新环境。
本次部署中所有 sgr-* 规则均绑定到同一个安全组,可以快速复制到新环境。
🧠 安全组深度经验总结
- 最小化原则:22端口限制为堡垒机IP,5432端口仅允许内网或特定应用IP。0.0.0.0/0 仅用于80/443临时测试。
- 规则命名规范:使用描述字段标注“项目-环境-端口”,例如
unicorn-prod-80,避免出现无意义描述"aqz"。 - 审计变更:开启 AWS Config 或 CloudTrail 记录安全组修改,避免误删导致服务中断。
- 分层安全:数据库单独一个安全组,应用层安全组仅允许应用服务器访问数据库端口,Web层对公网开放80/443。
- 本次复盘:sgr-0542f8ec1f28e231f (5432) 规则虽然记录在案,但比赛或开发结束后应立刻收紧。
✅ 三、最终验证与检查清单
| 验证项 | 命令/方法 | 预期结果 |
|---|---|---|
| PostgreSQL 本地连接 | psql -h 127.0.0.1 -U unicorndb -d unicorndb -c "SELECT 1;" | 返回 1 |
| 80端口监听Go进程 | ss -tlnp | grep :80 | 显示 ws-ec2-root |
| Apache已禁用 | systemctl is-active httpd | inactive |
| 安全组规则生效 | 从外部 curl http://<公网IP> | 返回服务响应 |
| server.ini 存在且正确 | cat server.ini | grep PgsqlHost | 127.0.0.1 |
⚠️ 四、关键经验教训大全(包含安全组记忆)
🔐 教训1 · 安全组规则无记录导致回溯困难
本次手动记录 sgr-xxx 非常重要!平时应定期导出安全组规则
aws ec2 describe-security-groups --group-ids sg-xxxx 并纳入文档。使用标签 Project=Unicorn 来归类。📦 教训2 · PostgreSQL 认证配置路径错误
误将 pg_hba.conf 路径设为版本号子目录,导致认证修改无效;正确位置通过
find /var/lib/pgsql -name pg_hba.conf 查找。另外 ident/peer 修改为 trust/md5 后务必重启服务。🌐 教训3 · 80端口被Apache抢占,Go服务启动失败
必须先停用httpd并禁用开机自启,再用
setenforce 0 避免SELinux拦截绑定特权端口。生产环境建议使用 systemd 配合 CapabilityBoundingSet。📝 教训4 · 配置文件缺失直接panic
二进制程序硬性依赖 server.ini,且格式要严格一致 (字段大小写敏感)。部署时需将配置文件和应用置于同一目录,建议用绝对路径启动。
🚧 教训5 · 安全组过度开放0.0.0.0/0风险
公网开放5432端口曾遭受扫描尝试,后续立刻收紧为 VPC 内网/ Security Group 引用。务必设置数据库白名单,使用强密码。
✨ 额外经验:在 Amazon Linux 2023 上使用
dnf 代替 yum,注意 postgresql15-server 的初始化命令不同于 CentOS7。📋 一键复制安全组ID清单(运维脚本向)
# 安全组规则ID快速导出 (便于复用)
SGR_IDS=("sgr-0542f8ec1f28e231f" "sgr-0419bb648fad9fffb" "sgr-05bc9868276e41b6b" "sgr-0dd1bc697b69e42e3")
for id in "${SGR_IDS[@]}"; do echo "Rule: $id"; done
# 使用 AWS CLI 查看具体安全组规则
aws ec2 describe-security-group-rules --filter "Name=security-group-rule-id,Values=sgr-0542f8ec1f28e231f"
🎯 沉淀记忆点:将这些ID保存至内部知识库,便于快速理解历史架构。
🔐
配置文件含数据库 / 缓存连接信息,部署前请按实际环境核对,切勿泄露密码。
server-root.ini · 数据库配置
config.iniini
cat > server.ini << 'EOF'
"LogLocation" = "./"
"PgsqlHost" = "127.0.0.1"
"PgsqlPort" = "5432"
"PgsqlUser" = "unicorndb"
"PgsqlPass" = "unicorndb"
"PgsqlDb" = "unicorndb"
"PgsqlTable" = "unicorntable"
EOF
ℹ️
文档由浏览器本地渲染(mammoth),文件不会上传到任何第三方;如预览异常请使用下载按钮获取原文件。
🖥️
以下为服务端程序,需在 Amazon Linux 2 EC2 上
chmod +x 后运行,并在安全组放行对应端口。请勿在本地非受信环境执行。