Führen Sie Python-Webanwendungen mit NGINX + NGINX Unit + Flask aus

Python-Web-App-Entwicklung mit NGINX + NGINX Unit + Flask

Ich wollte Webentwicklung mit Python machen, also habe ich eine Umgebung für Python-Webanwendungen erstellt. Bisher war die Mainstream-Konfiguration "NGINX <-> uwsgi <-> Flask", aber im April 2018 veröffentlichte NGINX den leichten AP-Server "NGINX Unit". Dieses Mal werden wir NGINX Unit verwenden und eine Webanwendungsumgebung mit der Konfiguration "NGINX <-> NGINX Unit <-> Flask" erstellen.

Umgebung

Verwenden Sie "NGINX" als Webserver, "NGINX Unit" als AP-Server und "Flask" als Python-Webframework.

Bemerkungen

Der Server verwendet eine virtuelle Umgebung von Vagrant und VirtualBox. Bitte aktivieren Sie das private Netzwerk.

$ vagrant init centos/7
$ vi Vagrantfile
- # config.vm.network "private_network", ip: "192.168.33.10"
+ config.vm.network "private_network", ip: "192.168.33.10"
$ vagrant up
$ vagrant ssh

Stellen Sie mit vagrant ssh eine Verbindung zur virtuellen Umgebung her und deaktivieren Sie selinux.

$ sudo vi /etc/selinux/config
- SELINUX=enforcing
+ SELINUX=disabled
$ sudo reboot

Erstellen einer Python-Entwicklungsumgebung

Erstellen Sie eine Python-Entwicklungsumgebung in einer virtuellen Umgebung. Standardmäßig ist in CentOS Python 2.7.5 installiert.

$ python --version
Python 2.7.5

Dieses Mal werden wir Python 3.7.4 verwenden.

Installieren Sie Python3 unter CentOS

Installieren Sie Python unter CentOS unter Bezugnahme auf die Vorgehensweise auf Python Offizielle Seite. Installieren Sie zunächst die erforderlichen Werkzeuge.

$ sudo yum -y groupinstall "development tools"
$ sudo yum install -y bzip2-devel gdbm-devel libffi-devel libuuid-devel ncurses-devel openssl-devel readline-devel sqlite-devel tk-devel wget xz-devel zlib-devel

Laden Sie das Installationsprogramm mit wget von der offiziellen Python-Seite (https://www.python.org/downloads/release/python-374/) herunter. Nach dem Herunterladen entpacken.

$ wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
$ tar xzf Python-3.7.4.tgz

Erstellen Sie nach dem Entpacken des Quellcodes.

$ cd Python-3.7.4
$ ./configure --enable-shared
$ make
$ sudo make install
$ sudo sh -c "echo '/usr/local/lib' > /etc/ld.so.conf.d/custom_python3.conf"
$ sudo ldconfig

Der erstellte Befehl wird unter / usr / local / bin installiert.

$ which python
/usr/bin/python
$ which python3
/usr/local/bin/python3
$ python3 --version
Python 3.7.4
$ which pip3
/usr/local/bin/pip3

Zum Schluss pip upgraden.

$ pip3 install --upgrade pip --user

Die neueste Version des Befehls "pip" wird im lokalen "bin" installiert.

$ which pip
~/.local/bin/pip
$ pip --version
pip 19.2.3 from /home/vagrant/.local/lib/python3.7/site-packages/pip (python 3.7)

Das ist alles zum Erstellen der Python-Umgebung.

Erstellen einer virtuellen Python-Umgebung

Erstellen Sie eine virtuelle Python-Umgebung, um Pakete für jedes Projekt zu wechseln und zu verwalten. Python bietet venv als Standardmodul an, das die Erstellung virtueller Umgebungen unterstützt. Erstellen Sie eine virtuelle Umgebung mit venv.

# flask_Erstellen Sie eine virtuelle Umgebung namens sample
$ python3 -m venv flask_sample
$ ls
venv

Aktivieren Sie die von venv erstellte virtuelle Umgebung.

$ source flask_sample/bin/activate
(flask_sample)$

Sie können die virtuelle Umgebung aktivieren, indem Sie das Skript "enable" in dem Verzeichnis ausführen, das vom Modul "venv" erstellt wurde. Wenn Sie die virtuelle Umgebung aktivieren, wird am Anfang der Eingabeaufforderung "(Name der virtuellen Umgebung)" angezeigt. Wechseln Sie in das Verzeichnis der von Ihnen erstellten virtuellen Umgebung und überprüfen Sie die Konfiguration.

(flask_sample)$ cd flask_sample
(flask_sample)$ ls
bin  include  lib  lib64  pyvenv.cfg

Das Verzeichnis "bin" enthält das Skript "enable", das die virtuelle Umgebung aktiviert, und den Befehl "pip" des Python-Paketverwaltungstools. Wenn Sie den Befehl pip in einer virtuellen Umgebung ausführen, werden die Befehle in diesem Verzeichnis ausgeführt. Installierte Pakete werden in "lib / python3.7 / site-packages" und "lib64 / python3.7 / site-packages" installiert. Ignorieren Sie in der virtuellen Umgebung das Verzeichnis "site-packages" von Python selbst und verwenden Sie die Pakete in diesem Verzeichnis. Sie können Apps entwickeln, ohne das Paket von Python selbst zu verschmutzen.

Erstellen eines Beispielprojekts mit Flask

Flask ist ein kleines Python-Mikroframework. Die standardmäßig aufgeführten Funktionen sind minimal und werden bei der Entwicklung kleiner Anwendungen verwendet. Plugins werden bereitgestellt, damit Sie Ihre Funktionalität erweitern können. Verwenden Sie Django, wenn Sie von Anfang an eine große Anwendung entwickeln möchten.

Kolbeninstallation

Installieren Sie in der virtuellen Umgebung von venv Flask.

(flask_sample)$  pip install Flask

Eine Anwendung erstellen

Die Struktur des Beispielprojekts ist wie folgt.

/sample
  |- app.py
  |- templates
        |- index.html
        |- post.html

Jeder Code wird wie folgt implementiert.

app.py


from flask import Flask ,render_template,request

application = Flask(__name__)

@application.route('/')
def index():
    return render_template('index.html')

@application.route('/sample',methods=['POST'])
def sample():
    message = request.form['message']
    return render_template('post.html',message=message)

if __name__=="__main__":
    application.run(host='0.0.0.0')

index.html


<html>
  <head>
    <meta charset="utf-8" />
    <title>Flask Sample</title>
  </head>
  <body>
    <h1>Flask Smaple</h1>
    <form action="sample" method="post">
      <input type="text" name="message" />
      <input type="submit" value="Senden" />
    </form>
  </body>
</html>

post.html


<html>
  <head>
    <meta charset="utf-8" />
    <title>Flask Sample</title>
  </head>
  <body>
    <h1>Flask Smaple</h1>
Botschaft:{{message}}
  </body>
</html>

Führen Sie nach der Implementierung app.py aus, um die Flask-Anwendung zu starten.

(flask_sample)$ python /sample/app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Wenn Sie nach dem Start mit einem Browser auf die private IP: 5000 / virtuelle Umgebung von http: // zugreifen, wird index.html angezeigt. Wenn Sie dies bestätigen können, ist die Funktionsprüfung von "Flask" abgeschlossen. Erstellen Sie als Nächstes einen AP-Server mit "NGINX Unit".

NGINX Unit

NGINX Unit ist ein leichter Anwendungsserver, der von NGINX entwickelt wurde. Sie können Anwendungen in mehreren Sprachen ausführen, sodass Sie Anwendungen in verschiedenen Sprachen auf demselben Server ausführen können. Die Sprache unterstützt "Python", "PHP", "Go", "Perl", "Ruby", "Node.js", "Java". Darüber hinaus können verschiedene Versionen innerhalb der Sprache nebeneinander existieren und ausgeführt werden. (Python2.7 und Python3 usw.) Sie können die Einstellungen in Echtzeit ändern, ohne den Server über API oder JSON anzuhalten, sodass Sie die Einstellungen nahtlos ändern können, ohne den Dienst anzuhalten.

Installation

Das offizielle Dokument hat die Installationsmethode für jedes Betriebssystem veröffentlicht.

Verlassen Sie die virtuelle Umgebung von venv und fügen Sie ein leckeres Repository hinzu.

(flask_sample)$ deactivate
$ sudo vi /etc/yum.repos.d/unit.repo
[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Es installieren.

$ sudo yum install -y unit
$ sudo yum install -y unit-devel unit-go unit-jsc8 unit-perl unit-php unit-python

Legt den automatischen Start der NGINX-Einheit fest.

$ sudo systemctl enable unit
Created symlink from /etc/systemd/system/multi-user.target.wants/unit.service to /usr/lib/systemd/system/unit.service.
$ sudo service unit start
Redirecting to /bin/systemctl start unit.service
$ sudo service unit status
Redirecting to /bin/systemctl status unit.service
● unit.service - NGINX Unit
   Loaded: loaded (/usr/lib/systemd/system/unit.service; enabled; vendor preset: disabled)
   Active: active (running)seit Di 2019-11-05 15:42:47 UTC; 7h ago
 Main PID: 5714 (unitd)
   CGroup: /system.slice/unit.service
           ├─5714 unit: main v1.12.0 [/usr/sbin/unitd --log /var/log/unit/unit.log --pid /var/run/unit/unit.pid --no-daemon]
           ├─5716 unit: controller
           └─5717 unit: router

Sie können bestätigen, dass die NGINX-Einheit mit dem Status "Serviceeinheit" gestartet wurde.

Nehmen Sie Einstellungen für Flask vor

Stellen Sie die NGINX-Einheit so ein, dass Kolbenanwendungen ausgeführt werden. Stellen Sie die Einstellungsdatei am Sockel der NGINX-Einheit auf "GET", um die Kolbenanwendung in "NGINX Unit" zu laden. Die Unix-Buchse zur Steuerung der "NGINX-Einheit" befindet sich unter "/ var / run / unit / control.sock". (Der Standort hängt vom Betriebssystem ab.)

$ cd /sample
$ sudo curl --unix-socket /var/run/unit/control.sock http://localhost/config/ > config.json
$ vi config.json
{
  "listeners": {
    "*:8080": {
      "pass": "applications/flask_app"
    }
  },

  "applications": {
    "flask_app": {
      "type": "python",
      "processes": 2,
      "path": "/sample/",
      "module": "app"
    }
  }
}

--Listers: Stellen Sie den Port ein. Der Wert von "pass" von "*: 8080" ist mit der Hierarchie von "Anwendungen" verknüpft.

Legen Sie die erstellte Einstellungsdatei in den Sockel der NGINX-Einheit, um die Einstellung wiederzugeben.

$ sudo curl -X PUT --data-binary @config.json --unix-socket /var/run/unit/control.sock http://localhost/config
{
	"success": "Reconfiguration done."
}

Wenn "Erfolg" zurückkehrt, ist die Einstellung abgeschlossen. Sie können auch die Einstellungen überprüfen.

$ sudo curl --unix-socket /var/run/unit/control.sock http://localhost/
{
	"certificates": {},
	"config": {
		"listeners": {
			"*:8080": {
				"pass": "applications/flask_app"
			}
		},

		"applications": {
			"flask_app": {
				"type": "python",
        "processes": 2,
				"path": "/sample/",
				"module": "app"
			}
		}
	}
}

Starten Sie die virtuelle Umgebung und greifen Sie auf "http: // localhost: 8080 /" zu.

$ source venv/bin/activate
(flask_sample)$ curl http://localhost:8080/
<html>
  <head>
    <meta charset="utf-8" />
    <title>Flask Sample</title>
  </head>
  <body>
    <h1>Flask Smaple</h1>
    <form action="sample" method="post">
      <input type="text" name="message" />
      <input type="submit" value="Senden" />
    </form>
  </body>
</html>

Wenn index.html angezeigt wird, ist die Konstruktion abgeschlossen. Selbst wenn Sie mit einem Browser darauf zugreifen, wird "index.html" angezeigt. Das ist alles für den Bau der "NGINX Unit". Erstellen Sie als Nächstes den Webserver "NGINX".

NGINX

Es ist ein Open-Source-Webserver, der leicht und schnell ist und als potenzielle Alternative zu Apache Aufmerksamkeit erregt. Im Vergleich zu Apache ist es hinsichtlich Skalierbarkeit und Funktionen wie Verarbeitungsleistung, Parallelverarbeitung und geringer Speichernutzung überlegen. Dieses Mal wird es als Proxyserver verwendet.

Installieren Sie NGINX unter CentOS

NGINX veröffentlicht offiziell ein yum-Repository, also installieren Sie es von diesem Repository. Fügen Sie das Repository hinzu und installieren Sie es anhand der Beschreibung auf der offiziellen Seite.

Repository hinzufügen

Sobald Sie die virtuelle Python-Umgebung verlassen haben. Fügen Sie das yum-Repository hinzu. Fügen Sie / etc / yum.repos.d / NGINX.repo hinzu.

$ sudo vi /etc/yum.repos.d/NGINX.repo
[NGINX]
name=NGINX repo
baseurl=http://NGINX.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

Installation

Überprüfen Sie das Repository.

$ sudo yum info nginx
Available Packages
Name        : NGINX
Arch        : x86_64
Epoch       : 1
Version     : 1.16.1
Release     : 1.el7_4.ngx
Size        : 754 k
Repo        : NGINX/x86_64
Summary     : High performance web server
URL         : http://NGINX.org/
License     : 2-clause BSD-like license
Description : NGINX [engine x] is an HTTP and reverse proxy server, as well as
            : a mail proxy server.

Wenn Sie mit dem Befehl yum info bestätigen können, dass NGINX im Repository vorhanden ist, installieren Sie es.

$ sudo yum install nginx

Automatischen Start einstellen, Starten Sie NGINX.

$ sudo systemctl enable nginx
$ sudo service start nginx
$ ![nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239179/0d818e0a-7aee-8a07-af95-72d34dfaa824.png)
service status nginx
● NGINX.service - NGINX - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/NGINX.service; enabled; vendor preset: disabled)
   Active: active (running)

Greifen Sie nach dem Start von NGINX mit Ihrem Browser auf die private IP-Adresse http: // der virtuellen Umgebung zu. Wenn der folgende Bildschirm angezeigt wird, ist der Startvorgang abgeschlossen.

nginx.png

Zusammenarbeit zwischen NGINX und NGINX Unit

NGINX-Konfigurationsdatei

NGINX arbeitet als WEB-Server oder Proxy-Server vor NGINX Unit. Proxy-Anfragen an die Anwendung an die Nginx-Einheit. Die Konfigurationsdatei "NGINX" befindet sich in "/ etc / nginx / conf.d".

$ sudo vi /etc/nginx/conf.d/app.conf
upstream unit-python {
        server 127.0.0.1:8080;
}
server {
    listen 80;
    server_name localhost;

    location ~ / {
      proxy_pass http://unit-python;
      proxy_set_header Host $host;
    }
}

Starten Sie NGINX neu und gehen Sie zu http: // localhost /.

$ sudo service restart nginx
$ curl http://localhost/
<html>
  <head>
    <meta charset="utf-8" />
    <title>Flask Sample</title>
  </head>
  <body>
    <h1>Flask Smaple</h1>
    <form action="sample" method="post">
      <input type="text" name="message" />
      <input type="submit" value="Senden" />
    </form>
  </body>
</html>

Wenn "index.html" angezeigt wird, ist die Proxy-Einstellung abgeschlossen. Sie können die index.html überprüfen, indem Sie mit einem Browser auf die http: // private IP der virtuellen Umgebung zugreifen. Damit ist die Erstellung der Python-Webanwendungsumgebung abgeschlossen.

Zusammenfassung

Wir haben die Umgebung der WEB-Anwendung mit NGINX + NGINX Unit + Flask erstellt. Da sich die "NGINX Unit" auf den Betrieb von Mikrodiensten spezialisiert hat, denke ich, dass sie auch in Zukunft Aufmerksamkeit erregen wird. Ich möchte weiter darauf eingehen.

Recommended Posts

Führen Sie Python-Webanwendungen mit NGINX + NGINX Unit + Flask aus
Führen Sie den Python-WSGI-Server auf der NGINX-Einheit aus
Führen Sie Flask unter CentOS mit Python3.4, Gunicorn + Nginx aus.
[Python] Führen Sie Flask in Google App Engine aus
Gewinnen Sie die Python + Flask-Web-App mit Jenkins
Führen Sie Openpose unter Python (Windows) aus.
Führen Sie Tensorflow 2.x unter Python 3.7 aus
Führen Sie Pythons CGI auf CORESERVER aus
Führen Sie den Unix-Befehl auf Python aus
Webanwendung mit Python + Flask ② ③
Webanwendung mit Python + Flask ④
Beispiel zum Einfügen der Python Flask-Webanwendung in den Azure App Service (Webanwendung)
Vorbereiten des Betriebs von Flask auf EC2
Überwachen Sie Python-Webanwendungen mit Prometheus
Führen Sie Python planmäßig auf AWS Lambda aus
Führen Sie das Docker-Image von TensorFlow unter Python3 aus
Führen Sie Python regelmäßig auf Heroku Scheduler aus
Führen Sie verschiedene Versionen von Python (wsgi) -Apps in einer Entwicklungsumgebung aus
Erstellen Sie mit pyenv unter Ubuntu 12.04 schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Führen Sie das Servo mit Python unter ESP32 (Windows) aus.
Führen Sie AzureKinect an Heiligabend in Python aus.
Laden Sie mit Python Dateien im Web herunter
Lassen Sie einen Servomotor mit Python auf Raspberry Pi 3 laufen
Einfache Web-App mit Python + Flask + Heroku
[Python] Führen Sie Headless Chrome unter AWS Lambda aus
Führen Sie Python-Code in der A2019 Community Edition aus
Führen Sie eine Python-Webanwendung mit Docker aus
Führen Sie Python in C ++ unter Visual Studio 2017 aus
Installieren Sie Python3 und Django unter Amazon Linux (EC2) und führen Sie den Webserver aus
Erstellen Sie mit venv unter Ubuntu 14.04 LTS schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Der Schlüssel zum Bereitstellen von Flask-Apps mit Python Buildpack in Cloud Foundry (Diego)
Bis Python mit Pythonbrew installiert ist und Flask auf dem WSGI-Server ausgeführt wird
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
Installieren Sie Python3.5 + NumPy + SciPy und führen Sie es unter Windows 10 aus
Setzen Sie MicroPython unter Windows ein, um ESP32 unter Python auszuführen
Python Web Framework Django gegen Pyramide gegen Flasche Dezember 2015
Führen Sie Python YOLOv3 in C ++ unter Visual Studio 2017 aus
So führen Sie MeCab unter Ubuntu 18.04 LTS Python aus
Hallo Welt mit Nginx + Uwsgi + Python auf EC2
Stellen Sie Django-Apps unter Ubuntu + Nginx + MySQL bereit (Build)
Führen Sie Zookeeper x Python (Kazoo) unter Mac OS X aus
Überwachen Sie Python-Apps mit dem APM (Flask) von New Relic.
Starten Sie einen Webserver mit Python und Flask
Ein Memorandum zum Berühren von Python Flask mit Heroku
Führen Sie die Pip-Installation unter MacOS Python 3.7 oder höher aus
Erstellen Sie eine Python3 + -Kolbenumgebung auf der Compute Engine von GCP
(Für mich) AWS_Flask_3 (Flask auf AWS installieren / ausführen)
TensorFlow: Führen Sie in Python gelernte Daten unter Android aus
Führen Sie Python auf Apache aus, um InfluxDB-Daten anzuzeigen
Python unter Windows
Twitter mit Python3
Hinweise zur Flasche
Python auf Mac
Python auf Windbg
Python-Unit-Test
Führen Sie die Kolben-App auf Cloud 9 und Apache Httpd aus
Ausgabeprotokoll an die Konsole mit Flask + Nginx auf Docker
Analysieren und visualisieren Sie JSON (Webanwendung ⑤ mit Python + Flask)
Starten Sie mit Docker eine Python-Webanwendung auf Nginx + Gunicorn