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

推薦する

詳細なLinuxインストールチュートリアル

(Win7 システム) VMware 仮想マシンのインストール チュートリアルVMware は仮想マ...

CSS の 4 つのインポート方法と優先順位の簡単な分析

第一に: CSSを導入する4つの方法CSS を導入する方法には、インライン スタイル、埋め込みスタイ...

MySQL接続クエリにおけるととwhereの違いの簡単な分析

1. テーブルを作成する テーブル「学生」を作成( `id` int(11) NULLではない、 `...

Docker ベースの Redis クラスターの構築方法

Redisイメージをダウンロードする docker pull yyyyttttwww/redis を...

jsは水平および垂直スライダーを実現します

最近、練習プロジェクトをしていたときにスライダーを使う必要があったので、調べてみました。まず、水平ス...

Dockerがコンテナを起動するたびに、IPとホストが指定した操作が実行されます。

序文Dockerを使ってHadoopクラスタを起動するたびに、ネットワークカードの再バインド、IPの...

WeChatアプレット開発の章:落とし穴の記録

最近、会社初のミニプログラムの開発に参加しました。開発経験は基本的にWebViewをベースとしたハイ...

Linux のごみ箱メカニズムの実装プロセスと使用方法の詳細な説明

序文: Linux システムでの rm は元に戻せません。コマンドの設計自体に問題はありません。問題...

nginx+uwsgi で Django プロジェクトを開始するための詳細な手順

Django で Web プロジェクトを開発する場合、開発およびテストのプロセスでは Django ...

Windows での MySQL のダウンロード、インストール、設定、使用に関するチュートリアル

MySQLの概要MySQL はリレーショナル データベース管理システムです。データベースは構造化され...

Unicode における CJK (中国語、日本語、韓国語の統合表意文字) 文字の概要

CJK は CJK Unified Ideographs の略称で、「中国語、日本語、韓国語の統一表...

LinuxでのMySQLのインストール手順

1. mysql tar ファイルをダウンロードします。参考: 2. インストールパッケージがあるデ...

6つのレイアウトでのFrameLayoutの使用

序文前回はLinearLayoutについて説明しました。今回はFrameLayoutの使い方を説明し...

Web デザイナーにはどのような知識体系が必要ですか?

製品設計者は、複雑で大規模な製造システムと多様な市場に直面しているため、知識体系には幅広さと深さの両...

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

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