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

推薦する

Vueはグラフィック検証コードを実装する

この記事の例では、グラフィック検証コードを実装するためのVueの具体的なコードを参考までに共有してい...

Docker ベースの Etcd 分散デプロイメントの方法と手順

1. 環境整備1.1 基本環境NTP設定: 省略 #時間の一貫性を確保するためにNTPサービスを設定...

VueプロジェクトでReactを書く方法の詳細

jsx/tsxファイルを直接作成できます今回のプロジェクト構成は以下のとおりです。 vueファイルで...

長いデータを HTML で表示するときに処理する方法

HTML で長いデータを表示する場合、マウスをその上に移動するとデータを切り捨てて完全なデータを表示...

高度な JavaScript フロントエンド開発でよく使用されるいくつかの API の例の詳細な説明

目次ミューテーションオブザーバーAPI特徴インターセクションオブザーバーAPI例えば画像の遅延読み込...

Nginx アクセス ログとエラー ログ パラメータの説明

例: nginx ログには、アクセス ログとエラー ログの 2 つの主な種類があります。アクセス ロ...

WMLタグの概要

構造関連タグ--------------------------------------------...

MySQL ツリー構造テーブルの設計と最適化に関する簡単な説明

序文多くの管理・オフィスシステムでは、ツリー構造がいたるところで見られます。たとえば、「部門」や「機...

Nginx プロセス管理とリロードの原則の詳細な説明

プロセス構造図Nginx はマルチプロセス構造です。マルチプロセス構造は、次のような Nginx の...

自作メニューをクリックする効果を実現するJavaScript

この記事では、自作メニューをクリックする効果を実現するためのJavaScriptの具体的なコードを参...

docker cp ファイルをコピーしてコンテナに入る

実行中のコンテナに入る # コンテナに入り、新しいターミナルを開きます# docker exec -...

K8S クラスターを構築し、Hyper-V で Docker をインストールする方法

Win10 システムをインストールしていて、k8s クラスターを構築する場合、Win10 に付属する...

10 種類のモダンなレイアウトを実現するための CSS コード

序文日曜日に自宅で web.dev の 2020 3 日間ライブを視聴したところ、興味深い点がたくさ...

JavaScript が Xiaomi のカルーセル効果を模倣

この記事は、透明度を変えてカルーセルにするXiaomiカルーセルを真似て書いたものです。初心者なので...

IE をフリーズさせる HTML コード

任意のテキスト エディターを開き、次のコードをコピーして、たとえば SomeFilename.htm...