웹사이트 검색

Ubuntu 22.04에서 uWSGI 및 Nginx로 Flask 애플리케이션을 제공하는 방법


소개

이 가이드에서는 Nginx를 사용하여 프런트 엔드 리버스 프록시 역할을 하는 Python 애플리케이션을 빌드합니다.

전제 조건

이 가이드를 시작하기 전에 다음이 있어야 합니다.

  • Ubuntu 22.04가 설치된 서버와 sudo 권한이 있는 루트가 아닌 사용자. 지침은 초기 서버 설정 가이드를 따르십시오.
  • Ubuntu 22.04에 Nginx를 설치하는 방법의 1~3단계에 따라 Nginx가 설치되었습니다.\n
  • 서버를 가리키도록 구성된 도메인 이름. 도메인 및 DNS에 대한 문서에서 구매할 수 있습니다. 이 자습서에서는 다음 DNS 레코드를 만들었다고 가정합니다.\n
    • 서버의 공용 IP 주소를 가리키는 your_domain이 있는 A 레코드
    • 서버의 공개 IP 주소를 가리키는 www.your_domain이 있는 A 레코드

    또한 uWSGI, 이 가이드에서 설정할 응용 프로그램 서버 및 WSGI 사양에 대해 어느 정도 알고 있으면 도움이 될 수 있습니다. 정의와 개념에 대한 이 논의는 두 가지 모두에 대해 자세히 설명합니다.

    1단계 — Ubuntu 리포지토리에서 구성 요소 설치

    첫 번째 단계는 Ubuntu 리포지토리에서 필요한 모든 부분을 설치하는 것입니다. 설치해야 하는 패키지에는 Python 구성 요소를 관리하기 위한 Python 패키지 관리자인 pip가 포함됩니다. 또한 uWSGI를 빌드하는 데 필요한 Python 개발 파일도 얻을 수 있습니다.

    먼저 로컬 패키지 색인을 업데이트합니다.

    1. sudo apt update

    그런 다음 Python 환경을 구축할 수 있는 패키지를 설치합니다. 여기에는 강력한 프로그래밍 환경에 필요한 몇 가지 추가 패키지 및 개발 도구와 함께 python3-pip가 포함됩니다.

    1. sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

    이러한 패키지가 준비되면 프로젝트를 위한 가상 환경을 만들 준비가 된 것입니다.

    2단계 — Python 가상 환경 만들기

    Python 가상 환경은 지정된 프로젝트에 필요한 특정 버전의 PythonPython 모듈을 포함하는 독립형 프로젝트 디렉터리입니다. 이는 각 애플리케이션의 종속성을 개별적으로 관리하여 동일한 시스템에서 한 애플리케이션을 다른 애플리케이션과 분리하는 데 유용합니다. 이 단계에서는 Flask 애플리케이션을 실행할 Python 가상 환경을 설정합니다.

    venv 모듈을 설치할 python3-venv 패키지를 설치하여 시작합니다.

    1. sudo apt install python3-venv

    다음으로 Flask 프로젝트의 상위 디렉터리를 만듭니다.

    1. mkdir ~/myproject

    만든 후 디렉터리로 이동합니다.

    1. cd ~/myproject

    다음을 입력하여 Flask 프로젝트의 Python 요구 사항을 저장할 가상 환경을 만듭니다.

    1. python3.10 -m venv myprojectenv

    이렇게 하면 프로젝트 디렉터리 내의 myprojectenv라는 디렉터리에 Pythonpip의 로컬 복사본이 설치됩니다.

    가상 환경에 애플리케이션을 설치하기 전에 활성화해야 합니다. 다음을 입력하여 수행하십시오.

    1. source myprojectenv/bin/activate

    이제 가상 환경 내에서 작업 중임을 나타내도록 프롬프트가 변경됩니다. 다음과 같이 표시됩니다. (myprojectenv)user@host:~/myproject$.

    3단계 — Flask 애플리케이션 설정

    이제 가상 환경에 있으므로 Flask 및 uWSGI를 설치한 다음 애플리케이션 설계를 시작할 수 있습니다.

    먼저 pip의 로컬 인스턴스와 함께 wheel을 설치하여 휠 아카이브가 없는 경우에도 패키지가 설치되도록 합니다.

    1. pip install wheel

    참고: 사용 중인 Python 버전에 관계없이 가상 환경이 활성화되면 pip 명령(pip3 아님)을 사용해야 합니다.

    다음으로 Flask 및 uWSGI를 설치합니다.

    1. pip install uwsgi flask

    샘플 앱 만들기

    이제 Flask를 사용할 수 있으므로 샘플 애플리케이션을 만들 수 있습니다. 플라스크는 마이크로프레임워크입니다. 완전한 기능을 갖춘 프레임워크가 제공할 수 있는 많은 도구를 포함하지 않으며 주로 웹 애플리케이션 초기화를 지원하기 위해 프로젝트로 가져올 수 있는 모듈로 존재합니다.

    애플리케이션이 더 복잡할 수 있지만 이 예에서는 myproject.py라는 단일 파일에 Flask 앱을 만듭니다. nano 또는 선호하는 텍스트 편집기를 사용하여 myproject.py를 엽니다.

    1. nano ~/myproject/myproject.py

    애플리케이션 코드는 이 파일에 있습니다. Flask를 가져오고 Flask 개체를 인스턴스화합니다. 이를 사용하여 특정 경로가 요청될 때 실행할 기능을 정의할 수 있습니다.

    from flask import Flask
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "<h1 style='color:blue'>Hello There!</h1>"
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0')
    

    기본적으로 이것은 루트 도메인에 액세스하는 사람에게 제공할 콘텐츠를 정의합니다. 완료되면 파일을 저장하고 닫습니다. 이전 예에서와 같이 nano를 사용하여 파일을 편집한 경우 CTRL + X, Y를 누른 다음 입력.

    초기 서버 설정 가이드를 따랐다면 UFW 방화벽을 활성화해야 합니다. 애플리케이션을 테스트하려면 포트 5000에 대한 액세스를 허용해야 합니다.

    1. sudo ufw allow 5000

    이제 다음을 입력하여 Flask 앱을 테스트할 수 있습니다.

    1. python myproject.py

    프로덕션에서 이 서버 설정을 사용하지 않도록 상기시키는 유용한 경고를 포함하여 다음과 같은 출력이 표시됩니다.

    Output
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Serving Flask app 'myproject' * Debug mode: off * Running on all addresses (0.0.0.0) WARNING: This is a development server. Do not use it in a production deployment. * Running on http://127.0.0.1:5000 * Running on http://your_server:5000 (Press CTRL+C to quit)

    웹 브라우저에서 서버의 IP 주소 다음에 :5000을 방문하십시오.

    http://your_server_ip:5000
    

    다음과 같은 내용이 표시됩니다.

    완료되면 터미널 창에서 CTRL + C를 눌러 Flask 개발 서버를 중지합니다.

    WSGI 진입점 생성

    다음으로 애플리케이션의 진입점 역할을 할 파일을 만듭니다. 이것은 uWSGI 서버와 상호 작용하는 방법을 알려줍니다.

    wsgi.py 파일을 호출합니다.

    1. nano ~/myproject/wsgi.py

    이 파일에서 애플리케이션의 Flask 인스턴스를 가져온 다음 실행합니다.

    from myproject import app
    
    if __name__ == "__main__":
        app.run()
    

    완료되면 파일을 저장하고 닫습니다.

    4단계 — uWSGI 구성

    이제 애플리케이션이 설정된 진입점으로 작성되었습니다. uWSGI 구성으로 이동할 수 있습니다.

    uWSGI가 애플리케이션을 제공할 수 있는지 여부 테스트

    첫 번째 단계로 uWSGI가 진입점의 이름을 전달하여 애플리케이션을 올바르게 제공할 수 있는지 테스트합니다. 이것은 모듈 이름(.py 확장자 제외)과 애플리케이션 내에서 호출 가능한 이름으로 구성됩니다. 이 자습서의 컨텍스트에서 진입점의 이름은 wsgi:app입니다.

    또한 uwsgi 바이너리 프로토콜 대신 HTTP를 사용하도록 프로토콜뿐만 아니라 공개적으로 사용 가능한 인터페이스에서 시작되도록 소켓을 지정합니다. 이전에 열었던 동일한 포트 번호 5000을 사용합니다.

    1. uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app

    웹 브라우저에서 다시 :5000이 추가된 서버의 IP 주소를 방문하십시오.

    http://your_server_ip:5000
    

    애플리케이션의 출력이 다시 표시됩니다.

    제대로 작동하는지 확인했으면 터미널 창에서 CTRL + C를 누릅니다.

    이제 가상 환경이 완료되었으므로 비활성화할 수 있습니다.

    1. deactivate

    모든 Python 명령은 이제 시스템의 Python 환경을 다시 사용합니다.

    uWSGI 구성 파일 생성

    당신은 uWSGI가 당신의 애플리케이션을 제공할 수 있다는 것을 테스트했지만, 장기간 사용을 위해 더 강력한 것을 원할 것입니다. 이에 대한 관련 옵션을 사용하여 uWSGI 구성 파일을 생성할 수 있습니다.

    해당 파일을 프로젝트 디렉터리에 넣고 이름을 myproject.ini로 지정합니다.

    1. nano ~/myproject/myproject.ini

    내부에서 uWSGI가 설정 적용을 알 수 있도록 [uwsgi] 헤더로 파일을 시작합니다. 그 아래에서 확장자를 제외한 wsgi.py 파일을 참조하여 모듈 자체와 app 파일 내의 호출 가능 항목을 지정합니다.

    [uwsgi]
    module = wsgi:app
    

    다음으로 마스터 모드에서 시작하고 실제 요청을 처리하기 위해 5개의 작업자 프로세스를 생성하도록 uWSGI에 지시합니다.

    [uwsgi]
    module = wsgi:app
    
    master = true
    processes = 5
    

    테스트할 때 네트워크 포트에 uWSGI를 노출했습니다. 그러나 Nginx를 사용하여 실제 클라이언트 연결을 처리한 다음 요청을 uWSGI로 전달할 것입니다. 이러한 구성 요소는 동일한 컴퓨터에서 작동하므로 Unix 소켓이 더 빠르고 안전하기 때문에 선호됩니다. 소켓 myproject.sock을 호출하고 이 디렉토리에 배치합니다.

    다음으로 소켓에 대한 권한을 변경합니다. 나중에 uWSGI 프로세스의 Nginx 그룹 소유권을 부여할 것이므로 소켓의 그룹 소유자가 여기에서 정보를 읽고 쓸 수 있는지 확인해야 합니다. 또한 vacuum 옵션을 추가하고 true로 설정합니다. 프로세스가 중지되면 소켓을 정리합니다.

    [uwsgi]
    module = wsgi:app
    
    master = true
    processes = 5
    
    socket = myproject.sock
    chmod-socket = 660
    vacuum = true
    

    마지막으로 할 일은 die-on-term 옵션을 설정하는 것입니다. 이는 초기화 시스템과 uWSGI가 각 프로세스 신호의 의미에 대해 동일한 가정을 갖도록 하는 데 도움이 될 수 있습니다. 이를 설정하면 두 시스템 구성 요소가 정렬되어 예상되는 동작을 구현합니다.

    [uwsgi]
    module = wsgi:app
    
    master = true
    processes = 5
    
    socket = myproject.sock
    chmod-socket = 660
    vacuum = true
    
    die-on-term = true
    

    이 줄은 명령줄에서 했던 것처럼 프로토콜을 지정하지 않는다는 것을 알아차렸을 것입니다. 기본적으로 uWSGI는 다른 서버와 통신하도록 설계된 빠른 바이너리 프로토콜인 uwsgi 프로토콜을 사용하여 말하기 때문입니다. Nginx는 기본적으로 이 프로토콜을 말할 수 있으므로 HTTP로 통신을 강제하는 것보다 이것을 사용하는 것이 좋습니다.

    완료되면 파일을 저장하고 닫습니다.

    이를 통해 uWSGI가 시스템에 구성됩니다. Flask 애플리케이션을 관리하는 방법에 더 많은 유연성을 제공하기 위해 이제 시스템 서비스로 실행되도록 구성할 수 있습니다.

    5단계 - 시스템 유닛 파일 생성

    Systemd는 시스템 서비스 관리를 위한 빠르고 유연한 초기 모델을 제공하는 도구 모음입니다. systemd 단위 파일을 생성하면 Ubuntu의 init 시스템이 자동으로 uWSGI를 시작하고 서버가 부팅될 때마다 Flask 애플리케이션을 제공할 수 있습니다.

    시작할 /etc/systemd/system 디렉토리 내에 .service로 끝나는 단위 파일을 생성합니다.

    1. sudo nano /etc/systemd/system/myproject.service

    내부에서 메타데이터 및 종속성을 지정하는 데 사용되는 [Unit] 섹션으로 시작합니다. 그런 다음 여기에 서비스에 대한 설명을 입력하고 네트워킹 대상에 도달한 후에만 서비스를 시작하도록 init 시스템에 지시합니다.

    [Unit]
    Description=uWSGI instance to serve myproject
    After=network.target
    

    다음으로 [Service] 섹션을 만듭니다. 프로세스를 실행할 사용자 및 그룹을 지정합니다. 모든 관련 파일을 소유하고 있으므로 프로세스의 일반 사용자 계정 소유권을 부여하십시오. 그런 다음 Nginx가 uWSGI 프로세스와 통신할 수 있도록 www-data 그룹에 그룹 소유권을 부여합니다(Nginx가 Ubuntu에서 기본적으로 실행되는 그룹임). 여기서 사용자 이름을 자신의 사용자 이름으로 바꿔야 합니다.

    [Unit]
    Description=uWSGI instance to serve myproject
    After=network.target
    
    [Service]
    User=sammy
    Group=www-data
    

    다음으로 작업 디렉토리를 매핑하고 PATH 환경 변수를 설정하여 init 시스템이 프로세스의 실행 파일이 가상 환경 내에 있음을 알 수 있도록 합니다. 또한 서비스를 시작하는 명령을 지정하십시오. Systemd에서는 가상 환경에 설치된 uWSGI 실행 파일의 전체 경로를 제공해야 합니다. 여기에서 프로젝트 디렉토리에 생성한 .ini 구성 파일의 이름을 전달합니다.

    사용자 이름과 프로젝트 경로를 자신의 정보로 바꾸는 것을 잊지 마십시오.

    [Unit]
    Description=uWSGI instance to serve myproject
    After=network.target
    
    [Service]
    User=sammy
    Group=www-data
    WorkingDirectory=/home/sammy/myproject
    Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
    ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
    

    마지막으로 [Install] 섹션을 추가합니다. 이것은 부팅 시 시작하도록 활성화한 경우 이 서비스를 연결할 항목을 systemd에 알려줍니다. 이 경우 일반 다중 사용자 시스템이 실행 중일 때 시작하도록 서비스를 설정합니다.

    [Unit]
    Description=uWSGI instance to serve myproject
    After=network.target
    
    [Service]
    User=sammy
    Group=www-data
    WorkingDirectory=/home/sammy/myproject
    Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
    ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
    
    [Install]
    WantedBy=multi-user.target
    

    이것으로 systemd 서비스 파일이 완성되었습니다. 지금 저장하고 닫습니다.

    uWSGI 서비스를 시작하기 전에 권한을 변경해야 합니다. Nginx www-data 사용자는 기본적으로 Ubuntu 22.04 이상에서 홈 디렉토리의 파일을 읽을 수 없기 때문입니다. 이렇게 하면 홈 디렉터리 외부에서 웹 응용 프로그램을 제공하지 못할 수 있습니다. 빠른 수정은 chgrp를 사용하여 홈 디렉터리와 연결된 그룹을 변경하는 것입니다.

    1. sudo chgrp www-data /home/sammy

    이렇게 하면 Nginx가 소켓 파일에 액세스하기 위해 필요한 홈 디렉토리의 내용을 볼 수 있습니다. 홈 디렉토리에 있는 파일을 웹에 노출하지 않습니다.

    이제 생성한 uWSGI 서비스를 시작할 수 있습니다.

    1. sudo systemctl start myproject

    그런 다음 부팅 시 시작되도록 활성화합니다.

    1. sudo systemctl enable myproject

    상태 확인:

    1. sudo systemctl status myproject

    다음과 같은 출력이 표시됩니다.

    Output
    ● myproject.service - uWSGI instance to serve myproject Loaded: loaded (/etc/systemd/system/myproject.service; enabled; vendor preset: ena> Active: active (running) since Fri 2022-08-05 17:22:05 UTC; 6s ago Main PID: 4953 (uwsgi) Tasks: 6 (limit: 2327) Memory: 20.9M CPU: 241ms CGroup: /system.slice/myproject.service ├─4953 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini ├─4954 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini ├─4955 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini ├─4956 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini ├─4957 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini └─4958 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini

    오류가 표시되면 자습서를 계속하기 전에 오류를 해결해야 합니다. 그렇지 않으면 요청을 myproject.sock 소켓으로 전달하도록 Nginx 설치 구성으로 이동할 수 있습니다.

    6단계 - 요청을 프록시하도록 Nginx 구성

    이제 uWSGI 애플리케이션 서버가 실행되어 프로젝트 디렉토리의 소켓 파일에 대한 요청을 기다리고 있습니다. 이 단계에서는 uwsgi 프로토콜을 사용하여 해당 소켓에 웹 요청을 전달하도록 Nginx를 구성합니다.

    Nginx의 sites-available 디렉터리에 새 서버 블록 구성 파일을 생성하여 시작합니다. 가이드의 나머지 부분과 일치하도록 다음 예제에서는 이를 myproject라고 합니다.

    1. sudo nano /etc/nginx/sites-available/myproject

    서버 블록을 열고 Nginx에게 기본 포트 80에서 수신하도록 지시합니다. 또한 서버의 도메인 이름 요청에 이 블록을 사용하도록 지시하십시오.

    server {
        listen 80;
        server_name your_domain www.your_domain;
    }
    

    다음으로 모든 요청과 일치하는 위치 블록을 추가합니다. 이 블록 내에 설정해야 하는 일반적인 uWSGI 매개변수를 지정하는 uwsgi_params 파일을 포함합니다. 그런 다음 uwsgi_pass 지시문을 사용하여 정의한 소켓에 요청을 전달합니다.

    server {
        listen 80;
        server_name your_domain www.your_domain;
    
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
        }
    }
    

    완료되면 파일을 저장하고 닫습니다.

    방금 만든 Nginx 서버 블록 구성을 활성화하려면 파일을 sites-enabled 디렉터리에 연결합니다.

    1. sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

    Nginx를 설치하면 프로세스가 sites-available 디렉토리에 default라는 서버 블록 구성 파일을 자동으로 설정한 다음 해당 파일과 <sites-enabled 디렉토리. 이 심볼릭 링크를 그대로 두면 기본 구성이 사이트 로드를 차단합니다. 다음 명령을 사용하여 링크를 제거할 수 있습니다.

    1. sudo unlink /etc/nginx/sites-enabled/default

    그런 다음 다음을 입력하여 구문 오류를 테스트할 수 있습니다.

    1. sudo nginx -t

    문제를 나타내지 않고 반환되면 Nginx 프로세스를 다시 시작하여 새 구성을 읽습니다.

    1. sudo systemctl restart nginx

    마지막으로 방화벽을 다시 한 번 조정하십시오. 더 이상 포트 5000을 통해 액세스할 필요가 없으므로 해당 규칙을 제거할 수 있습니다. 그런 다음 Nginx 서버에 대한 액세스를 허용할 수 있습니다.

    1. sudo ufw delete allow 5000
    2. sudo ufw allow 'Nginx Full'

    이제 웹 브라우저에서 서버의 도메인 이름으로 이동할 수 있습니다.

    http://your_domain
    

    애플리케이션 출력이 표시됩니다.

    오류가 발생하면 다음을 확인하십시오.

    • sudo less /var/log/nginx/error.log: Nginx 오류 로그를 확인합니다.
    • sudo less /var/log/nginx/access.log: Nginx 액세스 로그를 확인합니다.
    • sudo journalctl -u nginx: Nginx 프로세스 로그를 확인합니다.
    • sudo journalctl -u myproject: Flask 앱의 uWSGI 로그를 확인합니다.

    7단계 - 애플리케이션 보안

    서버에 대한 트래픽을 안전하게 유지하려면 도메인에 대한 SSL 인증서를 받으십시오. 이를 수행하는 방법에는 Let’s Encrypt에서 무료 인증서 받기, 자체 서명된 인증서 생성 또는 상용 공급자로부터 구입하는 등 여러 가지 방법이 있습니다. 편의를 위해 이 자습서에서는 Let’s Encrypt에서 무료 인증서를 얻는 방법을 설명합니다.

    먼저 apt를 사용하여 Certbot 및 해당 Nginx 플러그인을 설치합니다.

    1. sudo apt install certbot python3-certbot-nginx

    Certbot은 플러그인을 통해 SSL 인증서를 얻는 다양한 방법을 제공합니다. Nginx 플러그인은 필요할 때마다 Nginx를 재구성하고 구성을 다시 로드합니다. 이 플러그인을 사용하려면 다음을 입력하십시오.

    1. sudo certbot --nginx -d your_domain -d www.your_domain

    이것은 --nginx 플러그인과 함께 certbot을 실행하고 -d를 사용하여 인증서를 유효하게 할 이름을 지정합니다.

    이 서버에서 certbot을 처음 실행하는 경우 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 표시됩니다. 이렇게 하면 certbot이 Let’s Encrypt 서버와 통신한 다음 인증서를 요청하는 도메인을 제어하는지 확인하기 위해 챌린지를 실행합니다.

    구성이 업데이트되고 Nginx가 다시 로드하여 새 설정을 선택합니다. certbot은 프로세스가 성공했고 인증서가 어디에 저장되었는지 알려주는 메시지로 마무리됩니다.

    Output
    Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-11-03. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/sites-enabled/myproject Successfully deployed certificate for your_domain to /etc/nginx/sites-enabled/myproject Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    필수 구성 요소의 Nginx 설치 지침을 따랐다면 더 이상 중복 HTTP 프로필 허용이 필요하지 않습니다.

    1. sudo ufw delete allow 'Nginx HTTP'

    구성을 확인하려면 https://를 사용하여 도메인으로 다시 한 번 이동합니다.

    https://your_domain
    

    사이트가 안전하다는 것을 나타내는 브라우저의 보안 표시기와 함께 애플리케이션 출력이 다시 한 번 표시됩니다.

    결론

    이 가이드에서는 Python 가상 환경 내에서 Flask 애플리케이션을 만들고 보호했습니다. 그런 다음 WSGI 지원 애플리케이션 서버가 인터페이스할 수 있도록 WSGI 진입점을 생성한 다음 이 기능을 제공하도록 uWSGI 앱 서버를 구성했습니다. 그런 다음 시스템 서비스 파일을 생성하여 부팅 시 애플리케이션 서버를 자동으로 시작했습니다. 또한 웹 클라이언트 트래픽을 애플리케이션 서버로 전달하는 Nginx 서버 블록을 생성하여 외부 요청을 릴레이하고 Let’s Encrypt를 사용하여 트래픽을 서버로 보호했습니다.

    Flask는 구조나 디자인에 대해 지나치게 제한하지 않고 응용 프로그램에 기능을 제공하기 위한 유연한 프레임워크입니다. 이 가이드에 설명된 일반 스택을 사용하여 설계한 플라스크 애플리케이션을 제공할 수 있습니다.