【Python3】FastAPI+Uvicorn+Nginxで環境構築を行う方法
おはこんばんにちは、せなです。
今回は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です。
docker-composeで構築する方法(おまけ)
構造
- app
- main.py
- Dockerfile
- requirements.txt
- log
- nginx
- access.log
- error.log
- nginx
- 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サーバーを構築する方法を紹介させて頂きました。
最近は広く浅くをメインに勉強しているので、色々な技術の表面的な(駆け出しあたりの)ことは理解できるようになりました。
まだまだ、知りたいことがたくさんあって興味が尽きませんので、もっと勉強していきます!
ではでは〜
ディスカッション
コメント一覧
まだ、コメントがありません