nginx+odbc+flask+gunicorn
วันนี้จะพามาทำ web api ที่ใช้ python ทำแบบ 100% พร้อมต่อ odbc เซตระบบให้พร้อมใช้งานจริงบน prod ด้วย nginx+odbc+flask+gunicorn ใน ubuntu
2024-05-26 17:03:06 - @ratanon
### คู่มือการติดตั้งและตั้งค่า
#### ขั้นตอนที่ 1: การติดตั้งและตั้งค่า Nginx
```sh
sudo apt update sudo apt upgrade -y sudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx sudo systemctl status nginx
```
#### ตั้งค่า Nginx
เปิดไฟล์ตั้งค่า Nginx:
```sh
sudo nano /etc/nginx/sites-available/default
```
ใส่การตั้งค่าดังนี้:
```nginx
server { listen 80; server_name ec2-54-255-247-90.ap-southeast-1.compute.amazonaws.com; location / { proxy_pass http://unix:/home/ubuntu/erp/app.sock; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
```
ทดสอบและรีสตาร์ท Nginx:
```sh
sudo nginx -t sudo systemctl restart nginx
```
#### ขั้นตอนที่ 2: การเตรียมสภาพแวดล้อมสำหรับ Python และติดตั้ง Gunicorn
```sh
sudo apt install python3 python3-pip -y sudo apt install python3-venv -y python3 -m venv venv source venv/bin/activate pip install Flask gunicorn mkdir erp cd erp
```
#### สร้างไฟล์ `app.py`
```sh
nano app.py
```
ใส่โค้ดดังนี้:
```python
from flask import Flask, request, jsonify import subprocess app = Flask(__name__) @app.route('/ncs/erp/ar/<int:param>', methods=['GET']) def ar(param): result = subprocess.run(['python3', 'batch-ar.py', str(param)], capture_output=True, text=True) return jsonify({ 'status': 'success', 'output': result.stdout, 'error': result.stderr }) @app.route('/ncs/erp/ap/<int:param>', methods=['GET']) def ap(param): result = subprocess.run(['python3', 'batch-ap.py', str(param)], capture_output=True, text=True) return jsonify({ 'status': 'success', 'output': result.stdout, 'error': result.stderr }) @app.route('/ncs/erp/fah/<int:param>', methods=['GET']) def fah(param): result = subprocess.run(['python3', 'batch-fah.py', str(param)], capture_output=True, text=True) return jsonify({ 'status': 'success', 'output': result.stdout, 'error': result.stderr }) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
```
#### สร้างไฟล์ batch scripts
สร้างไฟล์ `batch-ar.py`:
```sh
nano batch-ar.py
```
ใส่โค้ดดังนี้:
```python
import sys def main(param): print(f"Processing AR with param: {param}") if __name__ == "__main__": main(sys.argv[1])
```
สร้างไฟล์ `batch-ap.py`:
```sh
nano batch-ap.py
```
ใส่โค้ดดังนี้:
```python
import sys def main(param): print(f"Processing AP with param: {param}") if __name__ == "__main__": main(sys.argv[1])
```
สร้างไฟล์ `batch-fah.py`:
```sh
nano batch-fah.py
```
ใส่โค้ดดังนี้:
```python
import sys def main(param): print(f"Processing FAH with param: {param}") if __name__ == "__main__": main(sys.argv[1])
```
#### สร้างไฟล์ `wsgi.py`
```sh
nano wsgi.py
```
ใส่โค้ดดังนี้:
```python
from app import app if __name__ == "__main__": app.run()
```
#### ขั้นตอนที่ 3: การตั้งค่า Gunicorn
สร้างไฟล์ service สำหรับ Gunicorn:
```sh
sudo nano /etc/systemd/system/gunicorn.service
```
ใส่เนื้อหาต่อไปนี้:
```ini
[Unit] Description=gunicorn daemon After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=/home/ubuntu/erp ExecStart=/home/ubuntu/venv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/erp/app.sock wsgi:app [Install] WantedBy=multi-user.target
```
รีโหลด systemd และเริ่ม Gunicorn:
```sh
sudo systemctl daemon-reload sudo systemctl start gunicorn sudo systemctl enable gunicorn
```
### ทดสอบการใช้งาน
ทดสอบการเรียก API ผ่านทาง URL:
- สำหรับ AR: `http://ec2-54-255-247-90.ap-southeast-1.compute.amazonaws.com/ncs/erp/ar/1`
- สำหรับ AP: `http://ec2-54-255-247-90.ap-southeast-1.compute.amazonaws.com/ncs/erp/ap/1`
- สำหรับ FAH: `http://ec2-54-255-247-90.ap-southeast-1.compute.amazonaws.com/ncs/erp/fah/1`