Waitress 및 NGINX를 사용하여 HTTPS를 통해 Flask 앱을 ​​실행하는 방법. 2022년에 업데이트되었습니다.

Waitress 및 NGINX를 사용하여 HTTPS를 통해 Flask 앱을 ​​실행하는 방법. 2022년에 업데이트되었습니다.

2022-10-01 last update

5 minutes reading ssl python flask nginx
HTTPS를 통해 Flask 앱을 ​​실행하는 것은 간단한 연습인 것처럼 보이지만 이 주제를 다루는 최신 가이드는 많지 않습니다. 다음은 HTTPS를 통해 Flask 앱을 ​​실행하기 위해 취한 단계입니다.

다음은 기본 단계입니다.
  • Flask 앱을 ​​설정합니다.
  • 웨이트리스와 함께 실행하십시오.
  • NGINX에서 역방향 프록시를 사용합니다.
  • SSL을 설정하십시오(업데이트됨).
  • NGINX 서버 규칙을 구성합니다.

  • 이 가이드에서는 이미 Flask 앱이 실행되고 있다고 가정합니다. 여기에 없으면 간단한 Flask 앱이 있습니다.

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


    이것을 실행하면 다음이 제공됩니다.



    자, Flask 앱이 실행 중입니다. 이 서버를 사용하지 않는 이유는 무엇입니까? 플라스크 문서당:

    '가볍고 사용하기 쉽지만 Flask의 내장 서버는 확장성이 좋지 않아 프로덕션에 적합하지 않습니다. 프로덕션에서 Flask를 올바르게 실행하는 데 사용할 수 있는 몇 가지 옵션이 여기에 문서화되어 있습니다.'

    이에 대한 가장 간단한 해결책 중 하나는 Waitress를 사용하는 것입니다. 공식 가이드를 직접 읽어보십시오. 그러나 이 예에서는 약간만 변경하면 됩니다. 먼저 웨이트리스를 설치합니다.

    $ pip install waitress
    


    다음으로 우리는 우리가 Waitress를 사용하고 있음을 알리기 위해 Flask 앱을 ​​약간 변경해야 합니다.

    
    from flask import Flask
    #we import waitress here. 
    from waitress import serve
    
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "<h1 style='color:blue'> A very simple flask server !</h1>"
    
    if __name__ == "__main__":
        #app.run(host='0.0.0.0')
        #We now use this syntax to server our app. 
        serve(app, host='0.0.0.0', port=5000)
    
    


    이제 프로덕션 준비 서버에서 실행 중인 Flask 앱이 있습니다. 그러나 여전히 SSL이 필요합니다. 아직 없는 경우 Certbot 또는 자체 서명Cert을 사용할 수 있습니다.

    (업데이트: Ömer Faruk Sancak 덕분에)

    이 명령을 실행하여 SSL을 얻거나 건너뛰고 자체 프로세스를 수행하십시오.

    
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update
    sudo apt-get install python3-certbot-nginx
    
    
    sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
    
    letsencrypt certonly -a webroot --webroot-path=/var/www/yourdomain.com/html/ -d yourdomain.com -d www.yourdomain.com
    
    
    


    Flask 앱을 ​​마지막으로 변경합니다. 웨이트리스에게 https를 사용할 것임을 알려야 합니다. Documentation . 앱에 url_scheme='https'를 추가합니다.

    from flask import Flask
    from waitress import serve
    
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "<h1 style='color:blue'> A very simple flask server !</h1>"
    
    if __name__ == "__main__":
        #app.run(host='0.0.0.0')
        serve(app, host='0.0.0.0', port=5000, url_scheme='https')
    


    이제 SSL이 있고 NGINX를 사용할 준비가 되었습니다. 아직 설치하지 않은 경우here 설정하는 방법입니다.

    웹 서버 규칙은 다음과 같습니다.

    etc/nginx/sites-available/default
    


    거기에 CD를 넣고 예제를 삭제하십시오.

    이것이 우리의 규칙이 될 것입니다. 메모
    example.com & your.ip
    이것은 자신의 도메인/서버 주소를 사용하는 예일 뿐입니다.

    server {
        listen 443 ssl;
    
    
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    
    
    
    
    
        server_name example.com;
    
    
    
     location / {
    
                proxy_pass http://your.ip.adress:5000;
                proxy_set_header X-Real-IP $remote_addr;
    
    
            }
    
    
    }
    
    
    
    server {
        listen 80;
    
        server_name example.com;
    
        return 302 https://$server_name$request_uri;
    }
    
    
    
    


    이 줄에 유의하십시오.
    proxy_pass http://your.ip.adress:5000;
    다른 포트에서 앱을 실행하는 경우 이러한 포트가 일치하는지 확인해야 합니다. 예를 들어 포트 3000을 사용하는 경우
    proxy_pass http://your.ip.adress:3000;
    자, 모든 설정이 끝났습니다. 하지만 NGINX에 알려야 하므로 서버를 다시 시작해야 합니다.
    sudo systemctl status nginx
    새로 고침하면 SSL로 실행되는 새 서버가 표시됩니다.