With few or no explanations, on Debian 10:
sudo apt install nginx python3-venv curl cd mkdir resttest cd resttest python3 -m venv venv . venv/bin/activate pip install wheel pip install flask flask-restplus gunicorn deactivate
The actual API app, in ~/resttest/resttest.py:
from flask import Flask
from flask_restplus import Api, Resource
app = Flask(__name__)
api = Api(app)
@api.route("/test/<int:id>")
class Test(Resource):
    def get(self, id):
        return {"result":"get {} ok".format(id)}, 200
# For testing without the external runner:
if __name__ == "__main__":
    app.run(host="0.0.0.0")
~/resttest/wsgi.py:
from resttest import app
if __name__ == "__main__":
    app.run()
/etc/systemd/system/resttest.service:
[Unit] Description=My REST test app, run by Gunicorn After=network.target [Service] User=markku Group=www-data WorkingDirectory=/home/markku/resttest Environment="PATH=/home/markku/resttest/venv/bin" ExecStart=/home/markku/resttest/venv/bin/gunicorn --workers 3 --bind unix:resttest.sock --umask 007 wsgi:app [Install] WantedBy=multi-user.target
/etc/nginx/sites-available/resttest:
server {
    listen 80;
    server_name my.server.name;
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/markku/resttest/resttest.sock;
    }
}
Final setup steps:
sudo ln -s /etc/nginx/sites-available/resttest /etc/nginx/sites-enabled sudo nginx -t sudo systemctl start resttest sudo systemctl enable resttest sudo systemctl restart nginx
Testing results:
$ curl http://my.server.name/test/555
{"result": "get 555 ok"}
Also note that the Swagger UI is automatically accessible in http://my.server.name/:

Some future considerations:
- TLS encryption (= reconfiguring NGINX)
- Authentication for the API
- Disabling/customizing the Swagger UI
Links:
The post was inspired by: How To Serve Flask Applications with Gunicorn and Nginx on Ubuntu 18.04 (digitalocean.com)