前言
如果你的后端服务写好了如果部署到你的服务器呢,本次通过fastapi写的服务实例,示范如何部署到服务器,并做服务管理。
一、如何启动服务
首先将app文件放到服务器目录,实例app文件如下:
from fastapi import FastAPI, APIRouter
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
api_router = APIRouter()
app = FastAPI()
app.include_router(api_router)
# 添加跨域中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
__VERSION__ = '1.0.0'
@app.get("/version", status_code=201)
async def say_hi():
return {"message": 'connection is OK !',
"version": __VERSION__,
"success": True}
def start_sever():
uvicorn.run(app, host='127.0.0.1', port=8080)
if __name__ == '__main__':
start_sever()
在app目录执行
gunicorn -w 4 -k uvicorn.workers.UvicornWorker app.main:app --bind 0.0.0.0:8000
Gunicorn 和 Uvicorn 都是 Python Web 服务器的工具,uvicorn支持携程操作,gunicorn支持多核操作,两者搭配使用,通过-w
参数配置核心数。
注意:上面的app.main使用自己的项目名,如果显示端口被占用,可以更改另一个端口。
此时服务已经启动了,通过浏览器检查 http://127.0.0.1/docs
可以看到fastapi提公的api文档。
二、挂载和开机启动服务
1. 配置systemctl 服务
配置systemctl 服务文件:
/etc/systemd/system/your-serverr.service
[Unit]
Description= your server
After=network.target
[Service]
User=server_user
Group=server_user
WorkingDirectory=/opt/data-center-server/server
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONPATH=/opt/data-center-server/server"
# 使用您已验证成功的命令格式
ExecStart=/usr/bin/gunicorn \
-k uvicorn.workers.UvicornWorker \
server:app \
--bind 0.0.0.0:8080
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
2. 创建server用户
对于一个特定的服务应该需要配置要给用户,并基于当个文件目录的权限
sudo adduser --system --no-create-home --group fastapi_runtime
创建一个无登录权限的用户,配置用户权限
sudo chown -R fastapi_user:fastapi_user /path/to/your/project
sudo chmod 750 /path/to/your/project
测试用户运行
sudo -u server_user bash -c 'cd /opt/data-center-server/server && /usr/local/bin/gunicorn -w 1 app.main:app --bind 127.0.0.1:8000'
3. 启动服务
启动服务配置开机启动
systemctl daemon-reload
systemctl start your-server.service
systemctl enable your-server.service
通过浏览器应该能访问服务接口
如果上述失败,检查服务启动日志,看是哪一步的问题。
journalctl -u your-server.service -n 100
总结
以上就是如何通过systemctl挂载和启动服务,后续如果有多个服务,注意端口的重复占用,当然也可以通过Nginx来分配端口的环回。