Docker erstellt Python Flask+ Nginx+Uwsgi-Container

Docker erstellt Python Flask+ Nginx+Uwsgi-Container

Installieren Sie Nginx

Ziehen Sie zuerst das CentOS-Image. docker pull centos CentOS

Wir installieren die neueste Version von nginx1.19: Download-Adresse

Führen Sie das CentOS-Image aus und geben Sie ein:

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

Legen Sie das Paket nginx-1.19.0.tar.gz in den Container:

docker cp nginx-1.19.0.tar.gz 10e87af84c05:/root (10e87af84c05 ist die CentOS-Container-ID)

Installieren Sie vor der Installation von nginx einige Abhängigkeiten:

yum -y installiere gcc gcc-c++ autoconf automake make
yum -y installiere zlib zlib-devel openssl openssl-devel pcre pcre-devel

Entpacken:

tar -zxvf nginx-1.19.0.tar.gz
#Geben Sie nginx-1.10.1 ein und konfigurieren Sie nginx
 cd nginx-1.19.0
 #Nginx konfigurieren
 #--prefix gibt das Installationsverzeichnis an#/usr/local/nginx ist das Installationsverzeichnis und kann nicht mit dem Verzeichnis der heruntergeladenen Datei identisch sein#./configure --prefix=/usr/local/nginx
 
 #Mit dem SSL Stub_Status Modul das Strem Modul –with-stream hinzufügen, damit das TCP-Protokoll übertragen werden kann #http_stub_status_module Statusüberwachung #http_ssl_module https konfigurieren
 #stream TCP zum Weiterleiten konfigurieren #http_gzip_static_module Komprimierung #http_sub_module Anforderung ersetzen ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream

Notiz:

Hier habe ich den Fehler, dass pcre und zlib fehlen. Du kannst yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel verwenden, um alle Abhängigkeiten zu installieren.

Dann make & make install zum Kompilieren und Installieren

Nach erfolgreicher Installation werden vier Dateien im durch ./configure --prefix=/usr/local/nginx angegebenen Verzeichnis generiert. Wir müssen nur /usr/local/nginx/sbin/nginx eingeben, um den nginx-Dienst zu starten.

Um den Erfolg zu überprüfen, können Sie curl localhost eingeben, um zu sehen, ob es erfolgreich gestartet wurde.

Bild generieren

10. Verpacken Sie den CentOS-Container mit Nginx als Mirror- docker commit ba5ba0d81912 nginx_centos (ba5ba0d81912 ist die Container-ID, umbenannt in nginx_centos).
11. Führen Sie das neue Image erneut aus: docker run --name ver -d -p 8051:80 -it nginx_centos
12. Zu diesem Zeitpunkt ist unser nginx im Image installiert, sodass wir damit alles machen können, was wir wollen, und auch einige andere ausgefallene Vorgänge ausführen können.

Installieren Sie die Python 2.7-Umgebung

yum installiere gcc openssl-devel bzip2-devel

Laden Sie Python 2.7 mit wget herunter und entpacken Sie es

yum -y installiere wget 

Wechseln Sie in das Verzeichnis /usr/src und verwenden Sie wget, um Python 2.7 herunterzuladen.

cd /usr/src
wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz

Entpacken Sie python2.7 erneut

tar -zxvf Python-2.7.15.tgz

Installieren Sie Python 2.7

Geben Sie das oben entpackte Python-2.7.15 ein und verwenden Sie die folgende Befehlszeile, um es in die entpackte Datei zu installieren

cd Python-2.7.15
./configure --enable-optimizations
machen Sie Altinstall

Installieren von PIP

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python2.7 get-pip.py

Da die Version 2.7 ist und in requirements.txt eine MYSQL-python Bibliothek vorhanden ist, wird ein Fehler gemeldet, dass libmysqlclient-dev nicht gefunden werden kann. Dies kann durch Ausführen von yum install mysql-devel behoben werden.

Installieren Sie UWSGI

Wenn pip install uwsgi wird ein Fehler gemeldet:

plugins/python/uwsgi_python.h:2:20: Schwerwiegender Fehler: Python.h: Keine solche Datei oder kein solches Verzeichnis
#include <Python.h>


Führen Sie yum install python-devel.x86_64 aus, um das Problem zu beheben, und führen Sie „pip install“ erneut aus, um es herunterzuladen.

Konfigurieren Sie den uWSGI-Server

Der relevante Inhalt der Datei uwsgi.ini ist wie folgt:

[Benutzer]
Socket = /tmp/uwsgi.sock
chown-socket = nginx:nginx
chmod-Socket = 664
# Ordentliches Herunterfahren auf SIGTERM, siehe https://github.com/unbit/uwsgi/issues/849#issuecomment-118869386
hook-master-start = unix_signal:15 tötet sie_alle_mit_gnädigem_Anstand

Erstellen Sie die Datei uwsgi.ini im Projektverzeichnis /app/:

[Benutzer]

uwsgi-socket = /tmp/uwsgi.sock
chmod-socket = 777
aufrufbar = App
wsgi-Datei = main.py
Puffergröße = 65535
Prozesse = %(%k * 2)
Threads = %(%k * 20

Die Bedeutung der einzelnen Parameter ist:

uwsgi-socket: Das Konfigurationselement uwsgi-socket gibt eine Datei an, bei der es sich um einen Unix-Socket handelt, d. h. einen Socket, der über das Dateisystem (und nicht über eine Netzwerkadresse) angesprochen und aufgerufen wird. Nachdem Sie den uwsgi-socket konfiguriert haben, müssen Sie auch den chmod-socket konfigurieren.
Ein Unix-Socket ist eine Datei, unterliegt also den Berechtigungen des Unix-Systems und kann auf 660 oder 777 konfiguriert werden.
Aktivieren Sie den uwsgi-Client, um auf diese Unix-Socket-Datei zuzugreifen, die hier als 777 konfiguriert ist.

aufrufbar: Legt fest, welche Variable im von uwsgi geladenen Modul aufgerufen wird, wenn eine Anfrage empfangen wird. Der Standardwert ist die Variable mit dem Namen „Anwendung“.

wsgi-file: Lädt die angegebene wsgi-Datei.

Puffergröße: Legt die interne Puffergröße fest, die für die UWSGI-Paketanalyse verwendet wird. Der Standardwert ist 4k.

Prozesse und Threads sind die Anzahl der geöffneten Prozesse bzw. Threads und %k ist eine magische Zahlvariable, die die Anzahl der CPU-Kerne darstellt. Wenn wir eine Dual-Core-CPU haben,
Es gibt hier 4 Prozesse und 40 Threads, das heißt, es gibt 4 Prozesse und jeder Prozess hat 40 Threads.

Supervisor installieren (optional)

Bei der direkten Yum-Installation wird der Fehler „ No package supervisor available. Dies liegt daran, dass CentOS aus der RedHat Enterprise Edition kompiliert wird, wodurch alle Urheberrechtsprobleme behoben werden. Führen Sie einfach yum install epel-release aus, um das Problem zu lösen. Nach der Installation wird folgendes Verzeichnis generiert:


Jetzt konfigurieren wir den Supervisor so, dass er auf die Dienste nginx und uwsgi hört.

Erstellen Sie zunächst die supervisor Datei im Verzeichnis /etc und anschließend die Datei supervisord.conf und das Verzeichnis conf.d:


Das Verzeichnis supervisord.conf ist wie folgt konfiguriert:

; Supervisor-Konfigurationsdatei

[unix_http_server]
file=/var/run/supervisor/supervisor.sock ; (der Pfad zur Socket-Datei)
chmod=0700 ; Sockef-Dateimodus (Standard 0700)

[Vorgesetzter]
logfile=/var/log/supervisor/supervisord.log; (Hauptprotokolldatei; Standard $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (Supervisord-Pid-Datei; Standard-Supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' untergeordnetes Protokollverzeichnis, Standard $TEMP)

; der folgende Abschnitt muss in der Konfigurationsdatei für RPC verbleiben
; (Supervisorctl/Web-Interface) funktionieren soll, können zusätzliche Schnittstellen
; hinzugefügt durch Definition in separaten rpcinterface:-Abschnitten
[RPC-Schnittstelle:Supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[Supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; verwenden Sie eine unix://-URL für einen Unix-Socket

; Der Abschnitt [include] kann nur die Einstellung "files" enthalten. Dies
; Einstellung kann mehrere Dateien auflisten (getrennt durch Leerzeichen oder
; Zeilenumbrüche). Es können auch Platzhalter enthalten sein. Die Dateinamen sind
; wird als relativ zu dieser Datei interpretiert. Eingebundene Dateien *können*
; Include-Dateien selbst.

[enthalten]
Dateien = /etc/supervisor/conf.d/*.conf

Erstellen Sie dann die Datei supervisord.conf im Verzeichnis conf.d und bearbeiten Sie sie:

[Vorgesetzter]
nodaemon=wahr

[Programm:uwsgi]
Befehl=/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

[Programm: nginx]
Befehl=/usr/local/nginx/sbin/nginx
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
# Ordnungsgemäßer Stopp, siehe http://nginx.org/en/docs/control.html
Stoppsignal=BEENDEN

Bei den oben genannten Pfaden handelt es sich um tatsächliche Verzeichniskonfigurationen. Wenn sie unterschiedlich sind, müssen sie geändert werden.

Starten Sie dann den Supervisor:


Nachdem die obige Konfiguration abgeschlossen ist, verpacken wir den Container neu, um ein neues Image zu generieren, das als base_v3 aufgezeichnet wird, und schreiben eine Docker-Datei, um die Docker-Anwendung zu verpacken:

VON base_v3
 
# Erstellen Sie ein Arbeitsverzeichnis RUN mkdir /app
 
# Gibt an, dass alle Befehle, die beim Starten des Containers ausgeführt werden, im App-Verzeichnis WORKDIR /app ausgeführt werden
 
# Ersetzen Sie die nginx-Konfiguration KOPIEREN Sie nginx.conf /etc/nginx/nginx.conf
 
# Kopieren Sie den Inhalt des lokalen App-Verzeichnisses in das App-Verzeichnis des Containers COPY ./app/ /app/

Erstellen Sie hier eine weitere nginx.conf-Datei im selben Verzeichnis wie Dockerfile und App und ändern Sie den Inhalt von nginx.conf wie folgt:

Benutzer nginx;
Arbeiterprozesse 1;
Fehlerlog /usr/local/nginx/logs/error.log warnen;
pid /usr/local/nginx/logs/nginx.pid;
Arbeiter_rlimit_nofile 20480;


Ereignisse {
 verwenden Sie epoll;
 Arbeiterverbindungen 20480;
 multi_accept ein;
}


http {
  einschließen /usr/local/nginx/conf/mime.types;
  Standardtyp Anwendung/Oktett-Stream;

  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for"';
  #Bei großen Anfragevolumina wird empfohlen, access_log zu schließen
  #access_log /var/log/nginx/access.log Haupt;

  sendfile an;
  #tcp_nopush ein;

  Keepalive-Timeout 300 s;
  Client-Header-Timeout: 300 s;
  Client_Body_Timeout: 300 s.

  gzip an;
  gzip_min_länge 1k;
  gzip_puffer 4 16k;
  gzip_types Text/HTML-Anwendung/JavaScript-Anwendung/JSON;

  einschließen /usr/local/nginx/conf.d/*.conf;

  Server {
   hören Sie 6666;
   Zeichensatz UTF-8;
   Maximale Client-Körpergröße: 75 M;
   Standort / {
    uwsgi_params einschließen;
    uwsgi_pass unix:///tmp/uwsgi.sock;
    uwsgi_send_timeout 300;
    uwsgi_connect_timeout 300;
    uwsgi_read_timeout 300;
   }
  }
}

Als nächstes müssen Sie nur docker build -t new_project . und 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 .
Natürlich werden nginx und uwsgi derzeit nicht automatisch gestartet und müssen manuell gestartet werden. Wenn Sie den Dienst automatisch starten möchten, können Sie Supervisor verwenden oder einen ENTRYPOINT nginx -g "daemon on;" && uwsgi --ini /app/uwsgi.ini hinzufügen.

Führen Sie anschließend stichprobenartig einen Schnittstellentest durch:

Dies ist das Ende dieses Artikels zum Erstellen von Python Flask + nginx + uwsgi-Containern mit Docker. Weitere verwandte Inhalte zum Erstellen von Flask + nginx + uwsgi mit Docker finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die folgenden verwandten Artikel weiter. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Python wsgiref Quellcodeanalyse
  • Einführung in die Python WSGI-Spezifikation
  • Eine kurze Analyse der WSGI-Schnittstelle und des Betriebs von WSGI-Diensten in Python
  • Python löst das Problem, dass Flask uwsgi keine globalen Variablen abrufen kann
  • Python-Webframework Django WSGI Prinzipanalyse
  • Detaillierte Erklärung zur Konfiguration von Python, MySQL, Nginx, UWSGI und Django auf VPS CENTOS
  • Python-Entwicklung Nginx+uWSGI+virtualenv Tutorial zur Bereitstellung mehrerer Projekte
  • CentOS7-Bereitstellung Flask (Apache, mod_wsgi, Python36, venv)
  • So führen Sie Python WSGI-Anwendungen in Apache aus
  • Verwendung der in Python integrierten Bibliothek wsgiref (WSGI-Grundlagen)

<<:  Mysql-Sortierung und Paginierung (Order by & Limit) und vorhandene Fallstricke

>>:  js, um einen Boden-Scrolling-Effekt zu erzielen

Artikel empfehlen

Detaillierte Beispiele für Variablen- und Funktionspromotion in JavaScript

js-Ausführung Phase der lexikalischen Analyse: um...

Detaillierte Erläuterung des Fehlerproblems der Case-When-Anweisung

Vorwort In der MySQL-Datenbank verwenden wir manc...

Detaillierte Erläuterung der MySQL-Datenbankisolationsebene und des MVCC

Inhaltsverzeichnis 1. Isolationsstufe LESEN SIE U...

Detaillierte Erklärung der MySQL Truncate-Verwendung

Inhaltsverzeichnis MySQL Truncate-Verwendung 1. T...

So erstellen Sie Benutzer und verwalten Berechtigungen in MySQL

1. So erstellen Sie einen Benutzer und ein Passwo...

Detaillierte Erläuterung des Nest.js-Hashing- und Verschlüsselungsbeispiels

0x0 Einführung Zunächst einmal: Was ist ein Hash-...

Detaillierte Erklärung der Lösung für verweigerte Berechtigungen in Linux

Zugriff verweigert: Der Grund hierfür ist: Es lie...

So konfigurieren Sie WordPress mit Nginx

Zuvor hatte ich WordPress selbst erstellt, aber d...

Details zum TypeScript-Mapping-Typ

Inhaltsverzeichnis 1. Zugeordnete Typen 2. Mappin...