Docker は Python Flask+ nginx+uwsgi コンテナを構築します

Docker は Python Flask+ nginx+uwsgi コンテナを構築します

Nginxをインストールする

まずcentosイメージをプルしますdocker pull centos centos

最新のnginx1.19バージョンをインストールします: ダウンロードアドレス

Centos イメージを実行し、次のように入力します。

docker run --name ver -d -p 8051:80 -it nginx_start

nginx-1.19.0.tar.gz パッケージをコンテナに配置します。

docker cp nginx-1.19.0.tar.gz 10e87af84c05:/root (10e87af84c05 は Centos コンテナ ID です)

nginx をインストールする前に、いくつかの依存関係をインストールします。

yum -y gccをインストール gcc-c++ autoconf automake make
yum -y インストール zlib zlib-devel openssl openssl-devel pcre pcre-devel

解凍:

tar -zxvf nginx-1.19.0.tar.gz
#nginx-1.10.1を入力してnginxを設定します
 nginx-1.19.0をインストールします
 #nginx を設定する
 #--prefix はインストール ディレクトリを指定します#/usr/local/nginx はインストール ディレクトリであり、ダウンロードしたファイルのディレクトリと同じにすることはできません#./configure --prefix=/usr/local/nginx
 
 #ssl stub_status モジュールで strem モジュール –with-stream を追加して、tcp プロトコルを送信できるようにします #http_stub_status_module ステータス監視 #http_ssl_module https を構成します
 #stream を転送するように tcp を設定します #http_gzip_static_module 圧縮 #http_sub_module リクエストを置き換えます ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream

注記:

ここで、pcre と zlib が見つからないというエラーが発生します。yum yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-develコマンドを使用して、すべての依存関係をインストールできます。

次にmake & make install実行してコンパイルとインストールを行います。

インストールが成功すると、 ./configure --prefix=/usr/local/nginxで指定されたディレクトリに 4 つのファイルが生成されます。nginx サービスを開始するには、 /usr/local/nginx/sbin/nginxと入力するだけです。

成功を確認するには、 curl localhostと入力して、正常に起動されているかどうかを確認します。

画像を生成する

10. Centos コンテナをミラーとして nginx とともにパッケージ化しますdocker commit ba5ba0d81912 nginx_centos (ba5ba0d81912 はコンテナ ID で、nginx_centos に名前が変更されます)
11. 新しいイメージを再実行します: docker run --name ver -d -p 8051:80 -it nginx_centos
12. この時点で、イメージには nginx がインストールされているので、これを使用して必要な操作やその他の高度な操作を実行できます。

Python 2.7環境をインストールする

yum インストール gcc openssl-devel bzip2-devel

wgetでPython 2.7をダウンロードし、解凍します。

yum -y wget をインストールします 

/usr/srcディレクトリに入り、wgetを使用してpython 2.7をダウンロードします。

/usr/src に移動します
https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz を取得します。

python2.7を再度解凍する

tar -zxvf Python-2.7.15.tgz

Python 2.7をインストールする

上記で解凍したPython-2.7.15を入力し、以下のコマンドラインを使用して解凍したファイルにインストールします。

Python-2.7.15をインストール
./configure --enable-optimizations
altinstall を実行する

PIPをインストールする

カール "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python2.7 取得pip.py

バージョンが2.7であり、requirements.txtにMYSQL-pythonライブラリがあるため、 libmysqlclient-devが見つからないというエラーが報告されます。これはyum install mysql-develを実行することで解決できます。

UWSGIをインストールする

pip install uwsgi次のエラーが報告されます:

plugins/python/uwsgi_python.h:2:20: 致命的なエラー: Python.h: そのようなファイルまたはディレクトリはありません
#include <Python.h>


問題を解決するには、 yum install python-devel.x86_64を実行し、再度 pip install を実行してダウンロードします。

uWSGIサーバーを構成する

関連するuwsgi.iniファイルの内容は次のとおりです。

[uwsgi]
ソケット = /tmp/uwsgi.sock
chown-socket = nginx:nginx
chmod-ソケット = 664
# SIGTERM での正常なシャットダウンについては、https://github.com/unbit/uwsgi/issues/849#issuecomment-118869386 を参照してください。
フックマスター開始 = unix_signal:15 gracefully_kill_them_all

プロジェクト ディレクトリ /app/ にuwsgi.iniファイルを作成します。

[uwsgi]

uwsgi-ソケット = /tmp/uwsgi.sock
chmod-ソケット = 777
呼び出し可能 = アプリ
wsgi ファイル = main.py
バッファサイズ = 65535
プロセス = %(%k * 2)
スレッド = %(%k * 20

各パラメータの意味は次のとおりです。

uwsgi-socket: uwsgi-socket 構成項目は、Unix ソケットであるファイル、つまり、ネットワーク アドレスではなくファイル システムを介してアドレス指定され、アクセスされるソケットを指定します。 uwsgi-socket を設定した後、chmod-socket も設定する必要があります。
Unix ソケットはファイルなので、Unix システムの権限の対象となり、660 または 777 に設定できます。
ここでは 777 として設定されているこの Unix ソケット ファイルに uwsgi クライアントがアクセスできるようにします。

callable: リクエストを受信したときに、uwsgi によってロードされたモジュール内のどの変数が呼び出されるか設定します。デフォルトは、「application」という名前の変数です。

wsgi-file: 指定された wsgi ファイルをロードします。

buffer-size: uwsgi パケット解析に使用される内部バッファ サイズを設定します。デフォルトは4kです。

プロセスとスレッドはそれぞれ開かれているプロセスとスレッドの数であり、%kはCPUコアの数を表すマジックナンバー変数です。デュアルコアCPUの場合、
ここでのプロセスとスレッドはそれぞれ 4 と 40 です。つまり、プロセスは 4 つあり、各プロセスには 40 のスレッドがあります。

スーパーバイザーをインストールする(オプション)

直接 yum インストールを行うと、「 No package supervisor available.これは、CentOS が RedHat Enterprise Edition からコンパイルされ、著作権の問題がすべて削除されているためです。問題を解決するには、 yum install epel-releaseを実行するだけです。インストール後、次のディレクトリが生成されます。


ここで、スーパーバイザーが nginx および uwsgi サービスをリッスンするように設定します。

まず、 /etcディレクトリにsupervisorファイルを作成し、次にsupervisord.confファイルと conf.d ディレクトリを作成します。


supervisord.conf ディレクトリは次のように構成されています。

; スーパーバイザー設定ファイル

[unix_http_サーバー]
file=/var/run/supervisor/supervisor.sock ; (ソケットファイルへのパス)
chmod=0700 ; sockef ファイル モード (デフォルト 0700)

[監督者]
logfile=/var/log/supervisor/supervisord.log; (メインログファイル; デフォルト $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid; (supervisord pidfile; デフォルト supervisord.pid)
childlogdir=/var/log/supervisor; ('AUTO' 子ログディレクトリ、デフォルト $TEMP)

; 以下のセクションはRPCの設定ファイルに残しておく必要があります
; (supervisorctl/webインターフェース)が機能するには、追加のインターフェースが必要になる場合があります。
; 別々の rpcinterface: セクションで定義することで追加されます
[rpcインターフェース:スーパーバイザ]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[スーパーバイザーctl]
serverurl=unix:///var/run/supervisor.sock ; unix ソケットの場合は unix:// URL を使用します

; [include]セクションには「files」設定のみを含めることができます。
; 設定では複数のファイルをリストできます(空白または
; 改行) ワイルドカードも使用できます。ファイル名は
; このファイルからの相対として解釈されます。インクルードされたファイルは*できません*
; ファイル自体を含めます。

[含む]
ファイル = /etc/supervisor/conf.d/*.conf

次に、conf.d ディレクトリにsupervisord.confファイルを作成し、編集します。

[監督者]
ノーデーモン=true

[プログラム:uwsgi]
コマンド=/usr/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini --die-on-term --need-app
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[プログラム:nginx]
コマンド=/usr/local/nginx/sbin/nginx
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
# 正常な停止については、http://nginx.org/en/docs/control.html を参照してください。
ストップシグナル=QUIT

上記のパスはすべて実際のディレクトリ構成です。異なる場合は変更する必要があります。

次にスーパーバイザーを起動します。


上記の構成が完了したら、コンテナを再パッケージ化してbase_v3として記録された新しいイメージを生成し、Docker アプリケーションをパッケージ化する Dockerfile を作成します。

base_v3から
 
# 作業ディレクトリを作成する RUN mkdir /app
 
# コンテナの起動時に実行されるすべてのコマンドがアプリディレクトリWORKDIR /appで実行されることを指定します
 
# nginx の設定を置き換える COPY nginx.conf /etc/nginx/nginx.conf
 
# ローカルアプリディレクトリの内容をコンテナのアプリディレクトリにコピーします COPY ./app/ /app/

ここで、Dockerfile およびアプリと同じディレクトリに別の nginx.conf ファイルを作成し、nginx.conf の内容を次のように変更します。

ユーザー nginx;
ワーカープロセス 1;
error_log /usr/local/nginx/logs/error.log 警告;
pid /usr/local/nginx/logs/nginx.pid;
ワーカー_rlimit_nofile 20480;


イベント {
 epoll を使用します。
 ワーカー接続数 20480;
 multi_accept オン;
}


http {
  /usr/local/nginx/conf/mime.types をインクルードします。
  デフォルトタイプ アプリケーション/オクテットストリーム;

  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for"';
  #リクエスト量が多い場合は、access_logを閉じることをお勧めします
  #access_log /var/log/nginx/access.log メイン;

  ファイル送信オン;
  #tcp_nopush オン;

  keepalive_timeout 300秒;
  client_header_timeout 300秒;
  client_body_timeout 300秒;

  gzip オン;
  gzip_min_length 1k;
  gzip_バッファ 4 16k;
  gzip_types テキスト/html アプリケーション/javascript アプリケーション/json;

  /usr/local/nginx/conf.d/*.conf をインクルードします。

  サーバー{
   聞く 6666;
   文字セット utf-8;
   クライアントの最大ボディサイズ 75M;
   位置 / {
    uwsgi_params を含めます。
    uwsgi_pass unix:///tmp/uwsgi.sock;
    uwsgi_send_timeout 300;
    uwsgi_connect_timeout 300;
    uwsgi_read_timeout 300;
   }
  }
}

次に、 docker build -t new_project .docker run --name test -d -p 8055:6666 -v /root/web/mim_backend/data:/app/static -v /root/logs/mim_backend:/app/log -it new_project実行するだけです。
もちろん、この時点では nginx と uwsgi は自動的に起動されず、手動で起動する必要があります。サービスを自動的に起動したい場合は、supervisor を使用するか、 ENTRYPOINT nginx -g "daemon on;" && uwsgi --ini /app/uwsgi.iniを追加することができます。

次に、インターフェース テストをランダムに実行します。

これで、Docker を使用した python Flask + nginx + uwsgi コンテナーの構築に関するこの記事は終了です。Docker を使用した Flask + nginx + uwsgi の構築に関する関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Python wsgiref ソースコード分析
  • Python WSGI仕様の紹介
  • WSGI インターフェースと Python での WSGI サービスの操作の簡単な分析
  • Pythonは、Flask UWSGIがグローバル変数を取得できない問題を解決します
  • Python ウェブフレームワーク Django WSGI 原理分析
  • VPS CENTOS で python、mysql、nginx、uwsgi、django を設定する方法の詳細な説明
  • Python 開発 Nginx+uWSGI+virtualenv マルチプロジェクト デプロイメント チュートリアル
  • CentOS7 デプロイメント Flask (Apache、mod_wsgi、Python36、venv)
  • ApacheでPython WSGIアプリケーションを実行する方法
  • Python 組み込みライブラリ wsgiref の使用 (WSGI の基礎)

<<:  MySQL のソートとページング (order by と limit) と既存の落とし穴

>>:  床スクロール効果を実現する js

推薦する

MySQL 5.6.23 のインストールと設定環境変数のチュートリアル

この記事では、MySQL 5.6.23のインストールと設定のチュートリアルを参考までに紹介します。具...

リクエスト数を制限するために Ajax 同時リクエストを実装するために js を使用するサンプル コード

問題の説明: 非同期リクエストの数が不確定な場合、数百の http リクエストが瞬時に発生したときに...

MySQL トリガーの追加、削除、変更、クエリ操作の例

この記事では、例を使用して、MySQL トリガーの追加、削除、変更、およびクエリ操作について説明しま...

LeetCode の SQL 実装 (183. 注文をしたことがない顧客)

[LeetCode] 183.注文しない顧客Web サイトに、Customers テーブルと Or...

MySQL ロック制御同時実行方法

目次序文1. 楽観的ロックバージョンフィールドを追加する2. 悲観的ロック読み取りロック完全なテーブ...

VMware Esxi のルート パスワードを忘れた後に正常に取得する方法

CentOS6 インストール ディスク (任意のバージョン) を準備するか、別の pnux インスト...

MySQL データのバックアップと復元のサンプル コード

1. データのバックアップ1. mysqldumpコマンドを使用してバックアップするmysqldum...

MySQLデータベースのトランザクションとロックの詳細な分析

目次1. 基本概念酸3.自動コミット4. トランザクション分離レベル5. 同時実行の一貫性の問題6....

MySQL 同期遅延が発生したときに Seconds_Behind_Master が 0 のままになる理由

目次問題の説明原理分析問題分析拡大する総括する問題の説明ユーザーはプライマリ データベースに対して変...

ボタンの権限判定を実装するためのVueカスタムv-has命令

アプリケーションシナリオバックグラウンド管理システムを例にとると、各ユーザーには異なるボタン権限があ...

WeChatミニプログラムは同時通訳を利用して音声認識を実装します

私は同時通訳音声認識機能を使用して、WeChatアプレットのホームページの音声検索機能を実現しました...

MySQL マスタースレーブ遅延問題の解決方法

今日は、マスタースレーブ遅延が発生する理由とその対処方法について説明します。しっかり座って出発の準備...

MySQL 8.0 のユーザーとロールの管理原則と使用方法の詳細

この記事では、MySQL 8.0 のユーザーとロールの管理について例を挙げて説明します。ご参考までに...

Sublime TextがUbuntuで中国語を入力できない問題の最も簡単な解決策

崇高なSublime Text はコード エディター (Sublime Text2 は有料ソフトウェ...

a タグをクリックして入力ファイルのアップロードダイアログボックスを表示する方法

htmlコードをコピーコードは次のとおりです。 <SPAN class=tag><...