sudo apt updatesudo apt install python3-pippip install gunicorngunicorn --bind 0:8000 main:app --worker-class uvicorn.workers.UvicornWorkersudo vi /etc/systemd/system/gunicorn.socket[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target공식 문서에서 권장하는 worker와 thread의 개수 : 2 * $NUM_CPU + 1
sudo vi /etc/systemd/system/gunicorn.service[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/[Project file path]
ExecStart=/usr/bin/gunicorn(구니콘 설치 경로) \
--workers 1 --thread 1 \
--worker-class uvicorn.workers.UvicornWorker \
--bind unix:/tmp/myapi.sock \
main:app \
--log-config /home/ubuntu/logs/log_format.ini
[Install]
WantedBy=multi-user.targetsudo vi /home/ubuntu/logs/log_format.ini[loggers]
keys=root
[handlers]
keys=access_logfile,error_logfile
[formatters]
keys=logfileformatter
[logger_root]
level=INFO
handlers=access_logfile
[formatter_logfileformatter]
format=[%(asctime)s] %(levelname)s [%(thread)d] - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
suffix=%Y-%m-%d.log
class=logging.Formatter
[handler_access_logfile]
class=handlers.TimedRotatingFileHandler
level=INFO
args=('/home/ubuntu/logs/gunicorn/gunicorn_access.log','midnight')
formatter=logfileformatter
[handler_error_logfile]
class=handlers.TimedRotatingFileHandler
level=WARNING
args=('/home/ubuntu/logs/gunicorn/gunicorn_error.log','midnight')
formatter=logfileformattersudo systemctl daemon-reloadsudo systemctl enable gunicorn.service gunicorn.socketsudo systemctl restart gunicorn.service gunicorn.socketsudo systemctl status gunicorn.service gunicorn.socket