FastAPI在 Nginx 和 Docker 环境中的部署

目录

    • 实现示例
      • [1. 项目结构](#1. 项目结构)
      • [2. FastAPI 应用 (app/main.py)](#2. FastAPI 应用 (app/main.py))
      • [3. 依赖文件 (app/requirements.txt)](#3. 依赖文件 (app/requirements.txt))
      • [4. Dockerfile](#4. Dockerfile)
      • [5. Nginx 配置 (nginx/nginx.conf)](#5. Nginx 配置 (nginx/nginx.conf))
      • [6. Docker Compose 配置 (docker-compose.yml)](#6. Docker Compose 配置 (docker-compose.yml))
    • 使用方法
    • 修改代码后更新

实现示例

接下来创建一个简单的示例项目,展示如何使用 Docker 和 Nginx 部署 FastAPI 应用,并实现代码修改后的快速更新。

1. 项目结构

复制代码
fastapi_ngnix_docker/
├── app/
│   ├── main.py
│   └── requirements.txt
├── nginx/
│   └── nginx.conf
├── docker-compose.yml
└── Dockerfile

2. FastAPI 应用 (app/main.py)

python:d:\node_test\fastapi_ngnix_docker\app\main.py 复制代码
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello World"}

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

3. 依赖文件 (app/requirements.txt)

plaintext:d:\node_test\fastapi_ngnix_docker\app\requirements.txt 复制代码
fastapi>=0.68.0
uvicorn>=0.15.0

4. Dockerfile

dockerfile:d:\node_test\fastapi_ngnix_docker\Dockerfile 复制代码
FROM python:3.9

WORKDIR /app

COPY ./app/requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade -r requirements.txt

# 不复制代码,而是在运行时通过卷挂载
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

5. Nginx 配置 (nginx/nginx.conf)

nginx:d:\node_test\fastapi_ngnix_docker\nginx\nginx.conf 复制代码
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log  /var/log/nginx/access.log  main;
    
    sendfile        on;
    keepalive_timeout  65;
    
    server {
        listen 80;
        
        location / {
            proxy_pass http://fastapi: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;
        }
    }
}

6. Docker Compose 配置 (docker-compose.yml)

yaml:d:\node_test\fastapi_ngnix_docker\docker-compose.yml 复制代码
version: '3'

services:
  fastapi:
    build: .
    volumes:
      - ./app:/app
    ports:
      - "8000:8000"
  
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - fastapi

使用方法

  1. 创建上述文件结构
  2. 启动服务:
bash 复制代码
docker-compose up -d
  1. 现在您可以通过 http://localhost 访问您的 FastAPI 应用

修改代码后更新

当您修改 app/main.py 或其他 FastAPI 代码文件时:

  1. 由于使用了 --reload 选项和卷挂载,FastAPI 会自动检测到文件变化并重新加载
  2. 无需重新构建或重启容器,修改会立即生效
  3. 如果添加了新的依赖项,则需要重新构建容器:
bash 复制代码
docker-compose down
docker-compose up -d --build

修改前

修改后

相关推荐
万粉变现经纪人4 小时前
如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘tokenizers’ 问题
python·selenium·测试工具·scrapy·beautifulsoup·fastapi·pip
Lin_Aries_04219 小时前
容器化简单的 Java 应用程序
java·linux·运维·开发语言·docker·容器·rpc
岁岁种桃花儿9 小时前
详解 Kubernetes 命令:kubectl exec -it nginx -- bash 及实战场景
运维·nginx·kubernetes
VueVirtuoso9 小时前
前后端部署 + Nginx 配置 + Cloudflare 全攻略(通俗易懂版)
运维·nginx
小白银子9 小时前
零基础从头教学Linux(Day 42)
linux·运维·服务器·网络·nginx
初学者_xuan10 小时前
零基础新手小白快速了解掌握服务集群与自动化运维(七)Nginx模块--Nginx反向代理与缓存功能(二)
运维·nginx·自动化
看好多桂花树10 小时前
Nginx SSL/TLS 配置
网络·nginx·ssl
人逝花落空.10 小时前
docker容器的三大核心技术UnionFS(下)
运维·docker·容器
Insist75310 小时前
基于OpenEuler部署kafka消息队列
分布式·docker·kafka
岚天start10 小时前
Nginx配置中location和proxy_pass指令尾部是否带斜杠的区别
运维·nginx·centos·proxy_pass·location·uri·斜杠