【Python3】FastAPI+Uvicorn+Nginxで環境構築を行う方法

2022年4月11日

おはこんばんにちは、せなです。
今回はFastAPI+Uvicorn+Nginxで環境を構築する方法を解説していきたいと思います。

環境

  • Python3.9
  • fastapi
  • uvicorn
  • nginx

FastAPIとは

FastAPIは2016年にリリースされたマイクロWebフレームワークの一種です。
簡単直感的高速な開発ができるのが特徴です。

よく比較されるフレームワークにはFlaskがありますね。
Flaskが小規模なWebアプリに向いているのに対して、FastAPIは簡単なAPIを開発する際に向いています。

個人的にはフロントとバックエンド両方をサッと開発する際にはFlask
フロントにReactとかVueを使用して、バックエンドにAPIを作りたいときにはFastAPI
で使い分けていますね。

記述方法自体もかなり似ているので、簡単に移行することができます。

例えば「Hello World」を表示させたいときには以下のように書きます。

FastAPI

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
   return {"Hello": "World!"}

if __name__ == "__main__":
    uvicorn.run("main:app")

Flask

from flask import Flask

app = Flask(__name__)

@app.route("/")
def root():
   return {"Hello": "World!"}

if __name__ == "__main__":
     app.run()

環境構築について

ライブラリのインストール

まずは、pipを使用して必要なライブラリをインストールしましょう。

pip3 install fastapi
pip3 install uvicorn

次にNginxをインストールします。(Linux系の場合)

apt install nginx

Nginxの設定

nginxの設定ファイルは「/etc/nginx/conf.d」配下にあります。
以下のファイルに追加しましょう。

vi /etc/nginx/conf.d/default.conf
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    location / {
        proxy_pass http://localhost:8000/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
}

FastAPI

FastAPIのPGについては上記で記載したHelloWorldとほぼ同じです。(ポートを指定しています。)

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get(“/")
def root():
return {“Hello": “World!"}

if __name__ == “__main__":
uvicorn.run(“main:app", port=8000)

Nginx起動

Nginxを起動しましょう。
Linuxであればサービス化されているはずですので、以下のコマンドで起動です。

sudo systemctl start nginx

http://localhost:80に接続してみましょう。
以下のような画面が表示されていればOKです。

HelloWorld

docker-composeで構築する方法(おまけ)

構造

  • app
    • main.py
    • Dockerfile
    • requirements.txt
  • log
    • nginx
      • access.log
      • error.log
  • nginx
    • Dockerfile
    • nginx.conf
  • docker-compose.yml

コード

docker-compose.yml

version: '3'
services:
  app:
    container_name: FastAPI
    build: ./app
    volumes:
      - ./app:/app
      - ./log:/var/log
    expose:
      - 5050
    environment:
      TZ: "Asia/Tokyo"

  web:
    container_name: Nginx
    build: ./nginx
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./log:/var/log
    ports:
      - "80:80"
    environment:
      TZ: "Asia/Tokyo"

app/main.py

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
   return {"Hello": "World!"}

if __name__ == "__main__":
    uvicorn.run("main:app", port=5050)

app/Dockerfile

FROM python:3

WORKDIR /app

COPY code ./
COPY requirements.txt ./

RUN pip install --upgrade pip
RUN pip3 install -r requirements.txt

CMD ["python3", "main.py"]

app/requirements.txt

fastapi
uvicorn

nginx/Dockerfile

FROM nginx

nginx/nginx.conf

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    location / {
        proxy_pass http://FastAPI:5050/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
}

最後に

FastAPIとUvicornとNginxでWebサーバーを構築する方法を紹介させて頂きました。

最近は広く浅くをメインに勉強しているので、色々な技術の表面的な(駆け出しあたりの)ことは理解できるようになりました。

まだまだ、知りたいことがたくさんあって興味が尽きませんので、もっと勉強していきます!
ではでは〜

FastAPI,Python

Posted by sena