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

推薦する

JS で単一ファイルコンポーネントを実装する方法

目次概要単一ファイルコンポーネント基本概念シンプルなローダーコンポーネントコンテンツの解析コンポーネ...

シンプルな計算機を実装する JavaScript コード

この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...

webpack-dev-server のコア概念とケースの詳細な説明

webpack-dev-server コアコンセプトWebpack の ContentBase と ...

border-radiusは要素に丸い境界線を追加する方法です

border-radius:10px; /* すべての角は半径 10px で丸められます*/ bor...

Docker ファイルの保存パス、コンテナの起動コマンド操作の取得

コンテナはすでに作成されていますが、その起動パラメータ(データがマウントされる場所)を知る方法 #コ...

MySQLでページングクエリを実装する方法

SQL ページング クエリ:背景会社のシステムには、構成管理用のプラットフォーム、いわゆる CRUD...

Docker を使用した RabbitMQ 環境のデプロイの詳細な紹介

前提条件: Dockerはすでにインストールされています1. 画像を見つける(方法は2つあります) ...

MySQL 5.7.10 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

MySQL は比較的使いやすいリレーショナル データベースです。今日は、win10 システムを再イ...

Raspberry Pi 4b ubuntu19 サーバーへの docker-ce のインストール手順

Raspberry Pi モデルは 4b、1G RAM です。システムはubuntu19.10サーバ...

JavaScript で判決文をエレガントに記述する例

目次序文1. モナドの判断1.1 例1.2 オブジェクトに入れる1.3 マップに載せる2. 複数の判...

ウェブサイトのパフォーマンスを向上させるために画像を最適化する方法

目次概要画像圧縮とはJPEG/JPG JPGの利点JPGの使用シナリオJPGの欠点MozJPEG を...

CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します

1. CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します1. 一般的なスタ...

Vueはコードのハイライトを実現するためにモナコを使用しています

Vue 言語と要素コンポーネントを使用して、コード コンテンツの入力を必要とし、ハイライト表示が可能...

MySQL ビューの一貫性を確保する方法の詳細な説明 (チェック オプション付き)

この記事では、例を使用して、MySQL ビューの一貫性を確保する方法 (チェック オプションを使用)...

Tomcat は親の委任メカニズムを破壊して Web アプリケーションの分離を実現します。

目次Tomcat クラスローダー階層WebAppクラスローダー共有クラスローダーカタリナクラスローダ...