云服务器搭建个人API服务,接口开发实践
云服务器搭建个人API服务,接口开发实践
适用场景:自用接口、小工具后端、数据中转、爬虫封装、博客/站点配套接口;不建议对外提供高并发、商用、涉及敏感数据的公开服务;下面一套完整流程:服务器选型 → 环境准备 → 接口开发 → 部署 → 反向代理HTTPS → 安全防护 → 接口文档、监控、排坑。
技术栈示例(轻量首选):Python FastAPI,也附带 Node.js / Go 说明;系统以 Ubuntu 22.04 为主,CentOS/Debian 差异点会标注。

一、前期规划与服务器选择https://act.tag.org.cn
- 配置推荐(个人API)
- 最低:1核1G,带宽1M,40G云盘(够用,适合自用、少量请求)
- 舒服配置:2核2G,带宽2M+,适合频繁调用、附带简单数据库
- 系统推荐:Ubuntu 22.04 LTS(包管理友好,文档多)
服务商:阿里云、腾讯云、华为云;记得选按量/学生机,测试完及时释放,避免扣费。
- 域名准备(可选但强烈建议)
- 有域名:解析A记录到服务器公网IP,后续配HTTPS
- 无域名:直接用公网IP+端口访问,只能HTTP,浏览器会拦截
⚠️ 重要提醒:国内服务器如果要公开对外提供服务,域名必须备案;仅自己内网/自己调用、不对外分发链接,可以先用IP测试。
- 整体架构简图
客户端 → Nginx(反向代理+HTTPS+限流) → API服务(FastAPI/Node/Go) → Redis/MySQL/SQLite
核心思路:业务程序不要直接暴露公网端口,交给Nginx收口。
二、服务器初始化(Ubuntu)
远程连接:ssh root@你的公网IP
更新系统
apt update && apt upgrade -y
基础工具
apt install -y vim curl wget git unzip htop
防火墙(ufw)配置
ufw allow 22/tcp SSH
ufw allow 80/tcp HTTP
ufw allow 443/tcp HTTPS
ufw enable
ufw status
云服务商控制台还有一层安全组!一定要放行 22、80、443,自定义端口不要随便全开。
创建普通用户(禁止长期root跑服务)
adduser apiuser
usermod -aG sudo apiuser
su - apiuser
三、环境安装(以 FastAPI Python 路线为主)
- Python + 虚拟环境
sudo apt install python3 python3-pip python3-venv -y
新建项目目录
mkdir ~/api-service && cd ~/api-service
创建虚拟环境
python3 -m venv venv
source venv/bin/activate
安装依赖
pip install fastapi uvicorn pydantic python-multipart
- 最小Demo接口 main.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(title="个人API服务", version="1.0")
简单GET接口
@app.get("/")
async def index():
return {"msg": "api service running", "time": "ok"}
@app.get("/api/hello")
async def hello(name: str = "访客"):
return {"data": f"你好 {name}"}
POST接口示例
class ReqData(BaseModel):
username: str
content: str
@app.post("/api/submit")
async def submit(data: ReqData):
return {"code": 200, "msg": "接收成功", "data": data.dict()}
本地测试启动(先测试程序本身能不能跑通)
uvicorn main:app --host 0.0.0.0 --port 8000
访问:http://IP:8000/docs → FastAPI自带Swagger文档页面,调试接口非常方便。
其他技术栈快速对比
- Node.js(Express/NestJS):适合JS前端配套,pm2托管
- Go(Gin/Echo):单二进制文件,无运行环境,内存占用极低,个人API高性能首选
- SpringBoot:太重,不推荐个人小API
四、进程托管:systemd 守护进程(生产推荐,替代nohup)
uvicorn直接前台运行断开ssh就停了,用systemd实现开机自启、崩溃自动重启。
新建服务文件:
sudo vim /etc/systemd/system/api.service
写入内容,注意路径改成你自己的:
[Unit]
Description=My Personal API Service
After=network.target
[Service]
User=apiuser
WorkingDirectory=/home/apiuser/api-service
ExecStart=/home/apiuser/api-service/venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000
Restart=always
RestartSec=3
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
重点:
--host 127.0.0.1,只监听本机,不直接暴露公网,由Nginx反向代理。
启动并设置开机自启
sudo systemctl daemon-reload
sudo systemctl start api
sudo systemctl enable api
查看日志
journalctl -u api -f
五、Nginx反向代理 + HTTPS(核心环节)
- 安装Nginx
sudo apt install nginx -y
- 站点配置
sudo vim /etc/nginx/sites-available/api
配置模板(先HTTP版本)
server {
listen 80;
server_name api.yourdomain.com; 换成你的域名,无域名就删掉这一行
location / {
proxy_pass [http://127.0.0.1:8000](http://127.0.0.1:8000);
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/api /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
现在访问 [http://api.yourdomain.com/docs](http://api.yourdomain.com/docs) 就能打开接口文档。
- 免费HTTPS证书(Certbot Let’s Encrypt)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d api.yourdomain.com
自动修改Nginx配置、配置自动续期,证书有效期90天,定时任务自动续。
成功后访问就是 [https://api.yourdomain.com](https://api.yourdomain.com)。
六、数据库选型(按需接入)
- SQLite:零服务,单文件,适合小数据量、自用接口,最简单
- MySQL/MariaDB:结构化数据、多表关联
- Redis:缓存、限流、临时token、计数器
示例:给FastAPI集成SQLite,用SQLAlchemy;如果只是简单接口,前期完全可以不用数据库。
七、接口鉴权、限流、安全加固(非常重要)
个人API最怕被爬虫薅、被扫描、被滥用。
- 简单Token鉴权方案(适合自用)
请求头携带Authorization: Bearer 自定义密钥,代码里校验,不通过直接401。
from fastapi import Header, HTTPException
API_TOKEN = "your-secret-key-here"
@app.get("/api/private")
async def private(authorization: str | None = Header(default=None)):
if not authorization or authorization != f"Bearer {API_TOKEN}":
raise HTTPException(status_code=401, detail="token无效")
return {"msg":"私有接口数据"}
不要把密钥硬编码提交到git,推荐放到环境变量。
- Nginx层限流(防刷)
在server块内添加:
limit_req_zone $binary_remote_addr zone=apilimit:10m rate=10r/s;
limit_req zone=apilimit burst=20 nodelay;
含义:单IP每秒最多10次请求,突发缓冲20。
- 其他安全要点
- 不要开放 0.0.0.0:8000 直接公网监听,全部走Nginx
- 禁止在接口中执行系统命令、文件读取(命令注入风险)
- 输入参数全部校验(Pydantic模型校验)
- 不要放敏感密钥、数据库密码在代码里,用
.env+ python-dotenv - 定期更新系统
apt update && apt upgrade - SSH关闭密码登录,改用密钥登录(长期服务器必做)
八、Docker版本备选方案(方便迁移、换服务器)
如果你喜欢容器化,一条Dockerfile打包FastAPI:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
搭配 docker-compose,一键拉起API+Redis/MySQL,迁移服务器只需要复制yml和代码。
九、接口文档、测试、日志
- FastAPI内置
/docs(swagger)、/redoc,开箱即用 - 测试工具:Postman、Apifox、curl命令
curl -H "Authorization: Bearer your-secret-key" [https://api.yourdomain.com/api/private](https://api.yourdomain.com/api/private)
- 日志:
- 程序日志:uvicorn输出,可以重定向到文件
- Nginx日志:
/var/log/nginx/ - systemd日志:
journalctl -u api -f
十、常见坑与排错清单
- 能ssh但是访问接口超时:安全组没放行80/443,很多人只配了系统防火墙
- uvicorn 127.0.0.1监听,外部无法直接IP:8000访问 → 正常,设计如此
- 证书申请失败:域名没解析、服务商封禁80端口、国内服务器未备案
- 重启服务器API不启动:systemd没enable,或者路径、用户权限写错
- 接口跨域:前端调用报CORS,FastAPI添加CORS中间件
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=[""], 生产不要写,指定你的前端域名
allow_credentials=True,
allow_methods=[""],
allow_headers=[""],
)
十一、拓展方向
- 增加JWT登录、用户管理
- 接入定时任务(APScheduler / Celery)做数据抓取
- 增加简单监控:Prometheus + Grafana 看接口QPS、错误率
- 接口版本控制:
/v1/api/xxx、/v2/api/xxx - 打包成Go二进制,部署零依赖,占用资源极低

浙公网安备 33010602011771号