Flask Full-stack + Flask-SocketIO + Nginx + Gunicorn[1/2]


1.入る前に


Flask SocketIOに触れ、Full Stackとして開発され、リアルタイムの公告事項などのアラームを表示してほしいとの研究が始まった.Flashを初めて開発する場合は、Apache 2をリバースエージェントとして使用します.しかし、Apache 2では、WebSocketヘッダのアップグレードを要求するコマンドに関する明確なデータがなく、これらはすべて失敗した.

1.1開発環境の構成と問題


Webソケットについては概念的な理解が乏しいため,HTTPSを用いて接続要求を継続することは問題ないと考えられる.このとき様々な問題が発生し,ストレステストの必要性が最も感じられる.開発環境と問題の内容は以下の通りです.

開発環境

  • Flash Workers WSDI構成のプロセス(20)x線(20)設定
  • 100名様
  • Settings Python Flask + Flask-SocketIO + Apache2 + mod_wsgi
  • CommentsはFlask SocketIOを介してWebソケット通信を実現しているが、Webソケットが101 Upgradeパケットに接続できず、持続的なHTTPSパケットで接続されているという現象がある.
  • に質問


  • クライアントの継続ソケット接続要求Webソケット接続が正しくないため、各クライアントのHTTPSは引き続きWebソケット接続要求を発行する.これにより,要求に適切に応答できず,内部論理が混乱する.最も重要なのは、クライアントごとにWebソケットリクエストを繰り返すと、負荷が大きすぎたり、プロセスの占有率が異常に増加したりすることです.
  • プロセス占有状態がWebソケット接続を要求すると、クライアントがタイムアウト状態に入る前にプロセスを占有する現象が発生することがあります.適切な応答が提供されないためです.
  • Flask SocketIOをより深く研究するために、NginxおよびGuncornドライバサービスの使用方法、およびその研究の手順について説明します.

    1.2参考資料


    Flask SocketIO研究では、主にDocsリクエストとUpgradeパケットの処理の設定を参照し、他の複数のブログ資料を参照した.

  • Flask-SocketIO Official Docs
    Flask-SocketIO

  • Webソケットとsocket.io
    Webソケットとsocket。io - peterkimzz

  • 4つの最新のLet's Encrypt SSL証明書の発行方法をまとめます
    最新のLet's Encrypt SSL証明書発行方法4つのまとめ|夢の島

  • [Nginx]Let's encryptを使用してHTTPSを適用
    [Nginx]Let's encryptを使用してHTTPSを適用

  • RTCSリアルタイムWebサービスの課題
    NAVER D2

  • WebSocketとSocket.io
    NAVER D2
  • 2. Socket IO & Web Socket


    2.1 Webソケットの概要


    Webソケットサービスの開発方法を理解する前に、Webソケットを理解する必要があります.WebソケットはW 3 Cが管理する標準であり、プロトコルはIETF(Internet Engineering Task Force)が管理する.WebソケットはHTTPリクエストと同様に80번 포트를 통해 웹 서버에 연결,HTTPバージョンは1.1である.ただし、要求ヘッダを表示する場合は、Upgradeヘッダを使用してWebサーバに要求が発行され、クライアントのブラウザでWebソケット機能がサポートされている場合にのみ、機能が正常に提供されます.
    GET /... HTTP/1.1  
    Upgrade: WebSocket  
    Connection: Upgrade
    Webソケットを使用する通信方法:PollingとWebSocketについて説明します.

    配達方式


    クライアントが一定時間ごとにリクエストを送信すると、サーバはすぐに現在のステータスに応答します.この場合、重要なサービスに適していないことをリアルタイムで反映します.サーバに変化がなくても、各リクエストに応答し、不要なトラフィックが発生します.

    WebSocketメソッド


    Web Socketは、WebサーバとWebブラウザのリアルタイム双方向通信環境を提供するリアルタイム通信技術である.Polingとは異なり、必要に応じて要求を双方向に送信することができ、ステータスのないHTTPに比べてオーバーヘッドが少ないため、非常に役立ちます.

    2.2 WebSocketとSocketIOの違い


    上記の概念を理解してWebソケットを実装しようとすると,WebソケットとSocket IOの区別が困難になる可能性がある.Webソケット機能を実現するには2つの側面を区別する必要があると思います.そこで、この文章を書くとき、参考にした資料と理解した内容を説明します.

    WebSocket


    Webソケットは双方向通信プロトコルであり、서로 다른 컴퓨터끼리 소통하기 위한 약속と理解できる.
  • HTML 5 Web標準技術
  • 運転速度が非常に速く、通信時のデータ量が少ない
  • イベント
  • のみのリスニングと送信

    Socket.io


    socket.io 웹 소켓 기술을 활용하는 라이브러리は双方向通信に不便である.JavascriptやjQueryとの関係は似ていると言え、速度はやや遅いが、より多くの利便性を提供することができる.
  • 標準技術;ライブラリ
  • スロットの接続に失敗した場合、ロールバックによりクライアントとの接続を試みる
  • .
  • ルームコンセプトブロードキャストは、一部のクライアントにのみデータを送信することができる
  • .

    3. Flask SocketIO


    Flask-SocketIO
    flask socketioモジュールは、Flash内またはFlashを使用してWebソケット通信を実現するライブラリです.そしてSocketioライブラリを使用して実装することで、Webソケット通信機能を実現する上でより高い生産性を提供できます.

    3.1 install & Getting Started


    フラスコが取り付けられている場合は、以下の追加モジュールを取り付けて実行できます.
    $ pip3 install flask-socketio
    上記のように、Flask SocketIOを簡単に駆動する例を見てみましょう.
    Flask-SocketIO
    flaskを使用してsocketioを使用する簡単な例を次に示します.しかし,以下のソースコードは簡略化されたコードであり,それだけではうまく動作しにくい.したがって,我々は構造を理解する観点からのみ見る.

    init.py

    from flask import Flask, render_template
    from flask_socketio import SocketIO
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'secret!'
    socketio = SocketIO(app)
    
    if __name__ == '__main__':
        socketio.run(app)

    javascript

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
    <script type="text/javascript" charset="utf-8">
        var socket = io();
        socket.on('connect', function() {
            socket.emit('my event', {data: 'I\'m connected!'});
        });
    </script>

    3.2 Flask full stack + Flask SocketIO


    flaskをfull stackとして使用する場合、flask socketioを使用する場合、上記の方法には一定の限界がある.flaskを実行するときはsocketio.run(app)と実行方法は使用できません.また、リバースエージェントを使用するには、create_app()内で機能を実装する必要があるため、異なる初期化形式を採用する必要がある.そこで、create app()関数内でフラスコとともに初期化する方法について説明します.

    FlashでFlash SocketIOを実行する


    flask socketioを使用するには、ファイルを次のように分割します.
    # file : app/sockets/__init__.py
    from flask_socketio import SocketIO
    
    socketio = SocketIO()
    ここで,重点的に検討する必要がある部分はsocketioである.Init app(app)部分.フラスコを起動すると同時に、app内で初期化する方法としてsocketioを用いることもできる.
    # file : app/__init__.py
    from flask import Flask
    from app.sockets import socketio # app/sockets/__init__.py에 선언된 socketio 변수
    
    def create_app():
        app = Flask(__name__)
    
        # Socket.IO
        socketio.init_app(app) # socketio 변수를 이용하여 app을 초기화
    
        return app
    flaskを簡単に実行するには、以下に示すようにrun.pyファイルを作成します.ただし、Flask SocketIOを正常にテストしたい場合は、以下のコードでテストすることはできません.任意のGuncornやUWSGIなどのライブラリで実行する必要があります.
    # file : run.py
    from app import create_app
    
    app = create_app()
    
    if __name__ == "__main__":
        app.run(debug=True,
                threaded=True,
                host="0.0.0.0",
                port=8080)
    記事は長くなりますので、Nginx+Guncorn+Flask-SocketIOの構成方法とクライアントの構成、およびFlaskテストコードについては、次の記事で説明します.