ratanon.com - infrastructure

nginx+odbc+flask+gunicorn

วันนี้จะพามาทำ web api ที่ใช้ python ทำแบบ 100% พร้อมต่อ odbc เซตระบบให้พร้อมใช้งานจริงบน prod ด้วย nginx+odbc+flask+gunicorn ใน ubuntu


### คู่มือการติดตั้งและตั้งค่า

#### ขั้นตอนที่ 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`



0
68