[PYTHON] Erstellen Sie schnell Apache + Pipenv + Flask + SQLAlchemy mit Sakura VPS

Einführung

Memo zum Erstellen eines Python-Webservers auf Sakura VPS (CentOS7) Apache → Gunicorn → Pipenv → Flasche + SQLAlchemy (Bonus phpMyAdmin) Erstellen Sie einen Webserver, der die Datenbank in kürzester Zeit nach der Erstellung der Serverinstanz mit Python verarbeitet.

Dieser Artikel ist vollständig für Anfänger gedacht, aber das erforderliche Mindestwissen ist

Es geht um.

Ich hoffe, es wird nützlich sein für die Serverkonstruktion und Python-Anfänger (ich selbst).

** Dieser Artikel dient zum Erstellen eines Testwebservers in kürzester Zeit, sodass Sicherheit usw. nicht berücksichtigt werden **

Installieren Sie schließlich Folgendes:

** Sagen wir es schnell. ** ** **

Installation des Betriebssystems

Betriebssysteminstallation mit den folgenden Einstellungen auf dem Sakura VPS-Administratorbildschirm Verschiedene Einstellungen> Betriebssysteminstallation

Melden Sie sich bei der Konsole an

Melden Sie sich über die Sakura VPS-Konsole oder die Client-SSH-Verbindung als Root an Beim Anmelden von einem Mac-Client

Offending ECDSA key in /Users/'Nutzername'/.ssh/known_hosts:1

Löschen Sie bekannte_Hosts in ~ / .ssh

Installation und Konfiguration von MySQL

Weitere Informationen finden Sie im Sakura VPS-Handbuch https://www.sakura-vps.net/centos7-setting-list/mysql-settings-for-sakura-vps-centos7

** MariaDB löschen **

$ yum remove -y mariadb-libs
$ rm -rf /var/lib/mysql

*** Hinzufügung des offiziellen MySQL-Repositorys ***

$ rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

** Installiere MySQL **

$ yum -y install mysql-community-server

** Versionsprüfung **

$ mysqld --version

** Einstellungen für MySQL-Start und Autostart **

$ systemctl start mysqld.service
$ systemctl enable mysqld.service

** Überprüfen Sie das anfängliche MySQL-Passwort ** In MySQL5.7 wird das ursprüngliche Kennwort beim ersten Start generiert. Überprüfen Sie daher das anfängliche Kennwort mit dem folgenden Befehl.

$ cat /var/log/mysqld.log | grep password
[Note] A temporary password is generated for root@localhost:(Passwort)

** MySQL-Sicherheitseinstellungen **

[root@ ~]# mysql_secure_installation
 
Securing the MySQL server deployment.
 
Enter password for user root:"Geben Sie das ursprüngliche Passwort ein"
 
The existing password for the user account root has expired. Please set a new password.
 
New password:"Geben Sie ein neues Passwort ein (einschließlich Groß- und Kleinbuchstaben, Zahlen und Symbole)"
 
Re-enter new password:"Passwort zur Bestätigung erneut eingeben"
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.
 
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) :y "Geben Sie y (* 1) ein"
 
New password:"Geben Sie das oben angegebene Passwort ein"
 
Re-enter new password:"Passwort zur Bestätigung erneut eingeben"
 
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) :y "Geben Sie y ein, um zu bestätigen, dass das festgelegte Passwort in Ordnung ist."
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
 
Remove anonymous users? (Press y|Y for Yes, any other key for No) :y "Geben Sie y ein, um zu bestätigen, dass Sie den anonymen Benutzer löschen können."
Success.
 
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
 
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :y "Geben Sie y ein, um zu bestätigen, dass Sie sich nicht remote als Root anmelden können."
Success.
 
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
 
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :y "Geben Sie y ein, um zu bestätigen, dass Sie die Testdatenbank löschen können."
 - Dropping test database...
Success.
 
 - Removing privileges on test database...
Success.
 
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
 
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :y "Geben Sie y ein, um zu bestätigen, ob die Berechtigungstabelle jetzt gelesen und die Einstellung aktiviert werden soll."
Success.
 
All done!

** Ändern Sie die MySQL-Einstellungen (my.cnf) **

$ vi /etc/my.cnf

Fügen Sie Ihrer my.cnf-Datei die folgenden Highlights hinzu.

"Zeichensatzserver = utf8" ⇒ Geben Sie den in der MySQL-Datenbank verwendeten Zeichencode als UTF8 an. "Default_password_lifetime = 0" ⇒ Ab MySQL 5.7 beträgt das Ablaufdatum des Kennworts des Benutzers standardmäßig 360 Tage. Setzen Sie dieses Ablaufdatum daher auf 0, um es zu deaktivieren.

Starten Sie MySQL neu, damit die Einstellungen wirksam werden.

$ systemctl restart mysqld.service

** Datenbank erstellen ** Melden Sie sich bei MySQL an

$ mysql -u root -p

Erstellen Sie test_db

mysql>CREATE DATABASE test_db;
mysql>SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+

Melden Sie sich von MySQL ab

mysql> QUIT;

Apache-Installation

yum Installation

$ yum install httpd

Automatische Starteinstellung

$ systemctl enable httpd.service

Apache-Start

$ systemctl start httpd

Überprüfen Sie im Browser http://'サイトのアドレス'

Apache_HTTP_Server_Test_Page_powered_by_CentOS.b990541ca636492391a260894dc36024.png

Installieren Sie pyenv und Python

** Yum install ** erforderliche Pakete

$ yum install gcc bzip2 bzip2-devel openssl openssl-devel readline readline-devel
$ yum update -y
$ yum groupinstall "Development Tools"
$ yum install libffi-devel
$ yum install mariadb-devel

** pyenv Installation ** Klicken Sie hier für den Ort, den Sie passieren können

$ cd /usr/local/

Klone pyenv von git

$ git clone https://github.com/pyenv/pyenv.git ./pyenv
$ mkdir -p ./pyenv/versions ./pyenv/shims

PFAD-Einstellung

$ echo 'export PYENV_ROOT="/usr/local/pyenv"' | sudo tee -a /etc/profile.d/pyenv.sh
$ echo 'export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"' | sudo tee -a /etc/profile.d/pyenv.sh
$ source /etc/profile.d/pyenv.sh

Überprüfen Sie die Version von pyenv

$ pyenv --version

** Installiere Python 3.8.0 ** Irgendwie mit Optionen für wsgi installieren

$ env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.8.0

Versionen wechseln

$ pyenv global 3.8.0
$ pyenv rehash

Bestätigung

$ python --version
Python 3.8.0

Erstellen Sie mit pipenv eine virtuelle Umgebung

** Installieren **

$ pip install --upgrade pip
$ pip install pipenv

** Virtuelle Umgebung erstellen ** Erstellen Sie ein "Test" -Projekt

$ mkdir -p /var/www/app/test
$ cd /var/www/app/test
$ pipenv install

Starten Sie die Pipenv-Shell

$ pipenv shell

Installationsbestätigung

$ python --version

** Installieren Sie das diesmal verwendete Paket ** Der Ordnername wird während der pipenv-Shell auf der linken Seite angezeigt

(test) $ pipenv install gunicorn
(test) $ pipenv install flask
(test) $ pipenv install sqlalchemy
(test) $ pipenv install mysqlclient

Apache-Einstellungen und Erstellung der Flask-App

Proxy-Anfragen von Apache an Gunicorn

$ vi /etc/httpd/conf/httpd.conf

Zur letzten Zeile hinzufügen

httpd.conf


ProxyPass /test http://localhost:8000/

Starten Sie Apache neu

$ systemctl restart httpd.service

Die http-Anforderung wird an Port 8000 weitergeleitet Sie können über Ihren Browser auf die von Ihnen erstellte Flask-Anwendung zugreifen.

** .py-Datei erstellen **

Erstellen Sie zwei Flask-Start- und SQL-PY-Dateien in / var / www / app / test.

$ vi app.py

app.py


from flask import Flask
from testsql import *
import datetime

app = Flask(__name__)

@app.route("/")
def hello():
	return "Hello World! "

@app.route("/insert")
def insert():
	#Wenn keine Tabelle vorhanden ist, wird die Anweisung CREATE TABLE ausgeführt
	Base.metadata.create_all(bind=ENGINE)

	data = TestTable()
	ret = data.create_date.strftime("%Y-%m-%d %H:%M:%S")
	session.add(data)
	session.commit()
	session.close()

	return "insert data "+ret

@app.route("/select")
def select():
	#Holen Sie sich die neuesten Daten
	res = session.query(TestTable).order_by(desc(TestTable.create_date)).all()

	ret = ""

	print("ret len "+str(len(res)))

	if 0 < len(res):
		ret = str(res[0].create_date)

	return "select "+ret


if __name__ == "__main__":
	#Start des Webservers
	app.run(debug=True)

Erstellen Sie als Nächstes eine Datei, die DB verarbeitet

$ vi testsql.py

testsql.py


from sqlalchemy import *
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float, DateTime, Text
from datetime import datetime, timedelta, timezone

#MySQL DB Einstellungen
DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8' % (
	"root",             #Nutzer
"Das erste MySQL-Passwort, das Sie notiert haben",         #Passwort
	"localhost",        # host ip
	"test_db", #DB-Name
)

ENGINE = create_engine(
	DATABASE,
	encoding = "utf-8",
	echo=False #Wenn True, wird SQL bei jeder Ausführung ausgegeben
)

#Sitzung erstellen
session = scoped_session(
			sessionmaker(
				autocommit = False,
				autoflush = True,
				bind = ENGINE))

#Basismodellerstellung
Base = declarative_base()
Base.query = session.query_property()

#Erben Sie das Basismodell und definieren Sie die Modellklasse
class TestTable(Base):
	__tablename__ = 'tbl_test'

	id          = Column('id', Integer, primary_key = True)

	create_date = Column('create_date', DateTime)

	def __init__(self):
		#Zeitzonengenerierung
		JST = timezone(timedelta(hours=+9), 'JST')

		self.create_date = datetime.now(JST)

Starten Sie Gunicorn

gunicorn [Dateiname]: Beginnen Sie mit [Variablenname](mit Option zum erneuten Laden durch Ändern der Datei)

(test) $ gunicorn --reload app:app

http: 'Site-Adresse' / Test Überprüfen Sie die Anzeige mit

http: 'Site-Adresse' / test / insert Schreiben Sie in die Datenbank mit

http: 'Site-Adresse' / test / select Gibt die in (Datum und Uhrzeit) in die Datenbank geschriebenen Daten zurück.

Im Gunicorn-Protokoll wann / auswählen ret len [Anzahl der eingefügten Datensätze] Wird angezeigt

Gunicorn fertig

(test) $ pkill gunicorn

Diesmal habe ich es nicht getan Starten Sie Gunicorn, wenn der Server startet Referenz: https://qiita.com/sti320a/items/c196387d405272cce46e

[Bonus] phpMyAdmin

Für diejenigen, die mit der DB-bezogenen GUI in Kontakt treten möchten

** Installieren Sie PHP aus dem Remi-Repository **

$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ yum install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-mysqlnd php-pdo php-gd

** Installation und Konfiguration von phpMyAdmin ** Referenz: https://knowledge.sakura.ad.jp/9006/

Installation

$ yum --enablerepo=remi-php72 install phpmyadmin

Zugriffseinstellungen

$ vi /etc/httpd/conf.d/phpMyAdmin.conf

Fügen Sie zu den Highlights unten "Alle erforderlich" hinzu. Mit dieser Einstellung können Sie von außen auf phpMyAdmin zugreifen. phpMyAdminの設定(CentOS_7)___さくらインターネットのVPS設定マニュアル.788d26d3be1946519eb2e0a13e9bd233.png

Starten Sie Apache neu

$ systemctl restart httpd

http://'サイトのアドレス'/phpmyadmin/

schließlich

Ich recherchiere viel, um einen Webserver mit Python aufzubauen

Dieser Bereich war fast allen Artikeln gemeinsam.

Ich stolperte über einen Teil, der nicht der ursprüngliche Zweck war, und nahm mir Zeit, um nachzuforschen, also fing ich von vorne an ... Weil es ziemlich viele Dinge gab Bauen Sie trotzdem schnell und lassen Sie zusätzliche Arbeit und Erklärungen aus Ich habe versucht, mich darauf zu konzentrieren.

Darüber hinaus ist der Unterschied zwischen pyenv und pipenv in der Python-Umgebung Wo die virtuelle Umgebung erstellt wird und wie sie funktioniert Wie der AP-Server von Gunicorn funktioniert usw. Als ich anfing zu untersuchen, wurde es noch tiefer und gleichzeitig wurde ich interessiert, ich entfernte mich allmählich von dem Zweck ...

Dieser Artikel + Selen usw. wurde verwendet, um den Prozess zu automatisieren Eine Site, die Manga sammelt, die mit jeder Manga-App gelesen werden kann Manga Ikki Funktioniert. Bitte schauen Sie hier, wenn Sie möchten.

Recommended Posts

Erstellen Sie schnell Apache + Pipenv + Flask + SQLAlchemy mit Sakura VPS
Erstellen Sie eine Flask-Umgebung mit Dockerfile + docker-compose.yml
Zusammenfassung zum Erstellen einer LAMP + Wordpress-Umgebung mit Sakura VPS
[Python] Erstellen Sie schnell eine API mit Flask
Erstellen Sie ein Bulletin Board mit Heroku, Flask, SQL Alchemy
Erstellen Sie mit IntelliJ schnell eine Python Django-Umgebung
Bis es mit virtualenv + flask + apache + wsgi funktioniert