云服务器搭建个人API服务,接口开发实践

云服务器搭建个人API服务,接口开发实践

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

QQ20261028-001711

一、前期规划与服务器选择https://act.tag.org.cn

  1. 配置推荐(个人API)
  • 最低:1核1G,带宽1M,40G云盘(够用,适合自用、少量请求)
  • 舒服配置:2核2G,带宽2M+,适合频繁调用、附带简单数据库
  • 系统推荐:Ubuntu 22.04 LTS(包管理友好,文档多)

服务商:阿里云、腾讯云、华为云;记得选按量/学生机,测试完及时释放,避免扣费。

  1. 域名准备(可选但强烈建议)
  • 有域名:解析A记录到服务器公网IP,后续配HTTPS
  • 无域名:直接用公网IP+端口访问,只能HTTP,浏览器会拦截

⚠️ 重要提醒:国内服务器如果要公开对外提供服务,域名必须备案;仅自己内网/自己调用、不对外分发链接,可以先用IP测试。

  1. 整体架构简图
客户端 → 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 路线为主)

  1. 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
  1. 最小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(核心环节)

  1. 安装Nginx
sudo apt install nginx -y
  1. 站点配置
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) 就能打开接口文档。

  1. 免费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最怕被爬虫薅、被扫描、被滥用。

  1. 简单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,推荐放到环境变量。

  1. Nginx层限流(防刷)
    在server块内添加:
limit_req_zone $binary_remote_addr zone=apilimit:10m rate=10r/s;
limit_req zone=apilimit burst=20 nodelay;

含义:单IP每秒最多10次请求,突发缓冲20。

  1. 其他安全要点
  2. 不要开放 0.0.0.0:8000 直接公网监听,全部走Nginx
  3. 禁止在接口中执行系统命令、文件读取(命令注入风险)
  4. 输入参数全部校验(Pydantic模型校验)
  5. 不要放敏感密钥、数据库密码在代码里,用 .env + python-dotenv
  6. 定期更新系统 apt update && apt upgrade
  7. 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和代码。

九、接口文档、测试、日志

  1. FastAPI内置 /docs(swagger)、/redoc,开箱即用
  2. 测试工具:Postman、Apifox、curl命令
curl -H "Authorization: Bearer your-secret-key" [https://api.yourdomain.com/api/private](https://api.yourdomain.com/api/private)
  1. 日志:
    • 程序日志:uvicorn输出,可以重定向到文件
    • Nginx日志:/var/log/nginx/
    • systemd日志:journalctl -u api -f

十、常见坑与排错清单

  1. 能ssh但是访问接口超时:安全组没放行80/443,很多人只配了系统防火墙
  2. uvicorn 127.0.0.1监听,外部无法直接IP:8000访问 → 正常,设计如此
  3. 证书申请失败:域名没解析、服务商封禁80端口、国内服务器未备案
  4. 重启服务器API不启动:systemd没enable,或者路径、用户权限写错
  5. 接口跨域:前端调用报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二进制,部署零依赖,占用资源极低
posted @ 2026-10-28 00:18  BLOGAME  阅读(22)  评论(0)    收藏  举报