fastapi บน nginx บน post 80 ใช่ร่วมกับเว็บ OS ubuntu 20

อ่านหัวข้อแล้วอาจจะงง  เพราะไม่รู้จะใช้คำอย่างไรให้เข้าใจง่ายๆ

พอดีไปเจอปัญหามาว่า ลูกค้าให้ใช้แต่ port 80 อย่างเดียว

แต่ fastapi ที่เคยทำมาผมใช้ port 8000 เลยทำให้ต้องหาวิธี

เลยไปเจอว่า nginx สามารถ proxy ไป ได้ โดยใช้ url path

ยกตัวอย่างเช่น หาก ใส่เป็น http://192.168.1.3/api ผมจะให้ nginx proxy ไปที่ http://127.0.0.1:8000

เลยมีผลทำให้ เว็บไม่สามารถใช้ /api ได้ เพราะผมใช้ให้ nginx proxy ไปแล้ว

แต่ก็ทำให้ผมส่งงานได้ และสาเหตุที่ใช้เป็น ubuntu เนื่องจาก centos ไม่ support แล้ว เพราะอะไรเล่าไปจะยาวไปหาอ่านกันเอาเองนะ

หากที่กล่าวมาไม่ถูกอย่างไรบอกได้นะครับ

โดยวิธีการผมอาจจะอธิบายตั้งแต่ติดตั้ง โดยมีดังต่อไปนี้

*อาจจะไม่ครบทุกคำสั่ง เนื่องจาก มาบันทึกไว้หลังทำเสร็จ

*ผมจะไม่ได้อธิบายการ เปิด post ของเครื่องนะครับ

*เช็ค apache2 ก่อนว่ามีอยู่ไหมหากมีก็ stop และ disable ไปก่อน

ติดตั้ง nginx + php

*ที่ลง php เพราะต้องการใช้ตัวจัดการ db

apt install nginx

จากนั้น start  service และ ตั้ง start up  service

systemctl start nginx

systemctl enable nginx

Nginx default page

จากนั้นลองเปิดเว็บตาม ip เครื่องดูน่าจะได้แบบนี้

ลง php ต่อ (php-pgsql คือส่วนต่อกับ db postgres)

apt install php-fpm php-pgsql

จากนั้นไปตั้งค่า php บน nginx ที่ /etc/nginx/sites-available/default

ใน

server { 
 location / {
 try_files $uri $uri/ /index.html;
 index index.html index.php index.htm index.nginx-debian.html;  <<< เคยอยู่นอก location ให้ # ที่นั้นไปแล้วใส่ที่นี้ เพื่อแก้ปัญหา refresh เว็บไม่ขึ้น
 }
 location ~ \.php$ {
 include snippets/fastcgi-php.conf;
 fastcgi_pass unix:/run/php/php7.4-fpm.sock;
 }
}
อธิบาย
 index index.html index.php index.htm index.nginx-debian.html;  <<< เคยอยู่นอก location ให้ # ที่นั้นไปแล้วใส่ที่นี้ เพื่อแก้ปัญหา refresh เว็บไม่ขึ้น
fastcgi_pass unix:/run/php/php7.4-fpm.sock;  << address อาจจะต่างออกไปตาม รุ่น ubuntu ลองเช็คก่อนใส่
 จากนั้น
systemctl restart nginx
อาจจะลองทดสอบ โดยอาจจะทำ infophp(); ดูว่าได้ไหม
ที่อยู่เว็บคือ /var/www/html/
หากไม่ติดอะไร nginx ก็เรียนร้อย

ติดตั้ง postgres
apt install postgresql postgresql-contrib
จากนั้น start  service และ ตั้ง start up  service
systemctl start postgresql.service
systemctl enable postgresql.service
ตั้งค่า sudo passwd postgres su - postgres
psql -d template1 -c "ALTER USER postgres WITH PASSWORD 'newpassword';" สิทธิ์ ip ที่ไฟล์ นี้ vi /var/lib/pgsql/data/postgresql.conf แก้ที่ listen_addresses = '*'  สิทธิ์ user ที่ไฟล์ นี้ vi /var/lib/pgsql/data/pg_hba.conf 


ติดตั้ง python3 อาจจะไม่ได้บอกวิธีเชื่อ postgres เพราะเนื่องจากว่า ตัวเชื่อมของ python มีหลายตัว แล้วแต่คนใช้เลย 
ส่วนนี้ไม่ต้องติดตั้งนะเจอว่ามากับเครื่องอยู่แล้ว หากไม่มีให้ลอง 
apt update
apt -y upgrade
แต่หากมีก็ลองเช็คได้เลย
python3 -V จะขึ้นเป็นรุ่นออกมา จากนั้นติดตั้ง pip apt install -y python3-pip เท่านี้ก็ลง python เสร็จแล้ว ติดตั้ง fastapi pip3 install fastapi pip3 install "uvicorn[standard]" สร้างไฟล์ทดสอบ main.py from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("api/") def read_root():  return {"Hello": "World"} อธิบาย
api/ << ตรงนี้ต้องมี ทุก api เพราะว่า ที่ nginx เราจะไปตั้งค่าว่าหากมี url path นี้จะส่งมาที่ fastapi post 8000
จากนั้นลอง run ทดสอบ
uvicorn --host 0.0.0.0  main:app --reload --port 8000
จากนี้เราก็พัฒนา เว็บและ api เราไปจนเสร็จ หรือสักหน่อยก็ได้หากไม่มั่นใจอยากลองขึ้นจริงก่อน

ตั้งค่า fastapi บน nginx
ต่อมาถึงเนื้อหาหลักละ
โดยเราต้องทำให้  fastapi  เป็น service ของเครื่องก่อน 
จากที่อ่านมา เห็นมีวิธีทำเป็น socket ไรนี้ละลองทำแล้วให้ nginx มาดึงแต่ไม่ผ่านอะ
เลยทำเป็น python ไฟล์ไปก่อน โดยให้สร้างไฟล์นี้เพิ่มที่ โฟร์เดอร์เดียวกับ main.py 
สร้างไฟล์ทดสอบ fast_api_service.py
import uvicorn

if __name__ == "__main__":
 uvicorn.run("main:app", host="0.0.0.0", port=8000, log_level="info" )
 
จากนั้นอาจจะลอง run ดูก่อนว่า error อะไรไหมจากนั้นไปสร้างอีกไฟล์ที่ /etc/systemd/system/fastapi.service
[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle
ExecStart=python3 /home/fast_api_nmu/fast_api_service.py

[Install]
WantedBy=multi-user.target

อธิบาย
/home/fast_api_nmu/fast_api_service.py << คือที่อยู่ของไฟล์ที่เราสร้าง
จากนั้น start  service และ ตั้ง start up  service
systemctl start fastapi
systemctl enable fastapi
หากเจอ error ให้ systemctl daemon-reload แล้วลองใหม่

จากนั้นไปตั้งค่าที่ nginx อีกทีที่  /etc/nginx/sites-available/default
โดยเพิ่มส่วนนี้เข้าไปที่ server { }

server {
 location /api/ {
 include proxy_params;
 proxy_pass http://127.0.0.1:8000;
 }
}
อธิบาย
proxy_pass http://127.0.0.1:8000; << คือส่งไฟ fast api
จากนั้น 
systemctl restart nginx
จากนั้นทดสอบดู โดยเคยทดสอบผ่านหน้าเว็บแล้วไม่ได้ แต่ลองเอา angular มาทดสอบละได้ 
เลยจะแนะนำลอง 
curl http://localhost:8000/api
ดู 

*หลังทำเสร็จหมดแล้วลอง restart เครื่อง หรือ vm ดูนะว่า ขั้นมาละใช้ได้เลยไหมทั้งหมด

 

 

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *