[PYTHON] Construisez rapidement Apache + Pipenv + Flask + SQLAlchemy avec Sakura VPS

introduction

Mémo pour construire un serveur web Python sur Sakura VPS (CentOS7) Apache → gunicorn → Pipenv → Flask + SQLAlchemy (bonus phpMyAdmin) Créez un serveur Web qui gère la base de données dans les plus brefs délais après la création de l'instance de serveur avec Python.

Cet article est entièrement destiné aux débutants, mais les connaissances minimales requises sont

--Utilisation de base de vi

C'est à propos de.

J'espère que cela sera utile pour la construction de serveurs et les débutants en Python (moi-même).

** Cet article est destiné à créer un serveur Web de test dans les plus brefs délais, la sécurité, etc. n'est donc pas prise en compte **

Installez éventuellement les éléments suivants:

** Disons-le rapidement. ** **

Installation du système d'exploitation

Installation du système d'exploitation avec les paramètres suivants de l'écran de l'administrateur Sakura VPS Divers paramètres> Installation du système d'exploitation

Connectez-vous à la console

Connectez-vous en tant que root depuis la console Sakura VPS ou la connexion ssh client Lors de la connexion depuis un client Mac

Offending ECDSA key in /Users/'Nom d'utilisateur'/.ssh/known_hosts:1

Supprimer known_hosts dans ~ / .ssh

Installation et configuration de MySQL

Reportez-vous au manuel Sakura VPS https://www.sakura-vps.net/centos7-setting-list/mysql-settings-for-sakura-vps-centos7

** Supprimer MariaDB **

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

*** Ajout du référentiel MySQL officiel ***

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

** Installez MySQL **

$ yum -y install mysql-community-server

** Vérification de la version **

$ mysqld --version

** Paramètres de démarrage et de démarrage automatique de MySQL **

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

** Vérifiez le mot de passe initial MySQL ** Dans MySQL5.7, le mot de passe initial est généré au premier démarrage, vérifiez donc le mot de passe initial avec la commande suivante.

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

** Paramètres de sécurité MySQL **

[root@ ~]# mysql_secure_installation
 
Securing the MySQL server deployment.
 
Enter password for user root:"Entrez le mot de passe initial"
 
The existing password for the user account root has expired. Please set a new password.
 
New password:"Entrez le nouveau mot de passe (y compris les lettres majuscules et minuscules, les chiffres et les symboles)"
 
Re-enter new password:"Ressaisissez le mot de passe pour confirmation"
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 "Entrez y (* 1)"
 
New password:"Entrez le même mot de passe défini ci-dessus"
 
Re-enter new password:"Ressaisissez le mot de passe pour confirmation"
 
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 "Entrez y pour confirmer que le mot de passe défini est correct"
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 "Entrez y pour confirmer que vous pouvez supprimer l'utilisateur anonyme"
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 "Entrez y pour confirmer que vous ne pouvez pas vous connecter à distance en tant que root"
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 "Entrez y pour confirmer que vous pouvez supprimer la base de données de test"
 - 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 "Entrez y pour confirmer s'il faut lire la table des autorisations maintenant et activer le paramètre"
Success.
 
All done!

** Modifier les paramètres MySQL (my.cnf) **

$ vi /etc/my.cnf

Ajoutez les points forts suivants à votre fichier my.cnf.

"Character-set-server = utf8" ⇒ Spécifiez le code de caractère utilisé dans la base de données MySQL comme UTF8. "Default_password_lifetime = 0" ⇒ Depuis MySQL 5.7, la date d'expiration du mot de passe de l'utilisateur est de 360 jours par défaut, définissez donc cette date d'expiration sur 0 pour la désactiver.

Redémarrez MySQL pour que les paramètres prennent effet.

$ systemctl restart mysqld.service

** Création d'une base de données ** Connectez-vous à MySQL

$ mysql -u root -p

Créer test_db

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

Déconnectez-vous de MySQL

mysql> QUIT;

Installation d'Apache

yum installation

$ yum install httpd

Réglage de démarrage automatique

$ systemctl enable httpd.service

Démarrage d'Apache

$ systemctl start httpd

Vérifier depuis le navigateur http://'サイトのアドレス'

Apache_HTTP_Server_Test_Page_powered_by_CentOS.b990541ca636492391a260894dc36024.png

Installez pyenv et Python

** Yum install ** packages requis

$ 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

** installation pyenv ** Cliquez ici pour l'emplacement par lequel vous pouvez passer

$ cd /usr/local/

Cloner pyenv depuis git

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

Paramètre PATH

$ 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

Vérifiez la version de pyenv

$ pyenv --version

** Installez Python 3.8.0 ** Installer d'une manière ou d'une autre avec des options pour wsgi

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

Changement de versions

$ pyenv global 3.8.0
$ pyenv rehash

Vérification

$ python --version
Python 3.8.0

Créez un environnement virtuel avec pipenv

** Installer **

$ pip install --upgrade pip
$ pip install pipenv

** Créer un environnement virtuel ** Créer un projet "test"

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

Lancer le shell pipenv

$ pipenv shell

Confirmation d'installation

$ python --version

** Installez le package utilisé cette fois ** Le nom du dossier est affiché sur le côté gauche pendant le shell pipenv

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

Paramètres Apache et création d'applications Flask

Demandes de proxy reçues par Apache à gunicorn

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

Ajouter à la dernière ligne

httpd.conf


ProxyPass /test http://localhost:8000/

redémarrer apache

$ systemctl restart httpd.service

La requête http est transmise par proxy au port 8000 Vous pourrez accéder à l'application Flask que vous avez créée à partir de votre navigateur.

** Créer un fichier .py **

Créez deux fichiers de démarrage Flask et sql .py dans / 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():
	#S'il n'y a pas de table, l'instruction CREATE TABLE est exécutée
	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():
	#Obtenez les dernières données
	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__":
	#Lancement du serveur Web
	app.run(debug=True)

Ensuite, créez un fichier qui gère DB

$ 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

#Paramètres de la base de données mysql
DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8' % (
	"root",             #utilisateur
"Le premier mot de passe mysql que vous avez noté",         #mot de passe
	"localhost",        # host ip
	"test_db", #Nom de la base de données
)

ENGINE = create_engine(
	DATABASE,
	encoding = "utf-8",
	echo=False #Si True, SQL sera généré à chaque fois qu'il est exécuté
)

#Créer une session
session = scoped_session(
			sessionmaker(
				autocommit = False,
				autoflush = True,
				bind = ENGINE))

#Création du modèle de base
Base = declarative_base()
Base.query = session.query_property()

#Hériter du modèle de base et définir la classe de modèle
class TestTable(Base):
	__tablename__ = 'tbl_test'

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

	create_date = Column('create_date', DateTime)

	def __init__(self):
		#Génération de fuseau horaire
		JST = timezone(timedelta(hours=+9), 'JST')

		self.create_date = datetime.now(JST)

Démarrer gunicorn

gunicorn [nom de fichier]: Commencez par [nom de variable](avec l'option de rechargement en changeant de fichier)

(test) $ gunicorn --reload app:app

http: 'adresse du site' / test Vérifiez l'affichage avec

http: 'adresse du site' / test / insert Écrire dans la base de données avec

http: 'adresse du site' / test / select Renvoie les données écrites dans la base de données en (date et heure)

Dans le journal gunicorn quand / sélectionnez ret len [nombre d'enregistrements insérés] Est affiché

gunicorn terminé

(test) $ pkill gunicorn

Je ne l'ai pas fait cette fois Démarrez gunicorn lorsque le serveur démarre Référence: https://qiita.com/sti320a/items/c196387d405272cce46e

[Bonus] phpMyAdmin

Pour ceux qui veulent toucher à l'interface graphique relative à la base de données

** Installer PHP à partir du référentiel remi **

$ 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 et configuration de phpMyAdmin ** Référence: https://knowledge.sakura.ad.jp/9006/

Installation

$ yum --enablerepo=remi-php72 install phpmyadmin

Paramètres d'accès

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

Ajoutez «Exiger tout accordé» aux points saillants ci-dessous. Avec ce paramètre, vous pouvez accéder à phpMyAdmin de l'extérieur. phpMyAdminの設定(CentOS_7)___さくらインターネットのVPS設定マニュアル.788d26d3be1946519eb2e0a13e9bd233.png

redémarrer apache

$ systemctl restart httpd

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

à la fin

Je fais beaucoup de recherches pour créer un serveur Web avec Python

--Installez FTP

Ce domaine était commun à presque tous les articles.

Je suis tombé sur une partie qui n'était pas le but initial et j'ai pris le temps d'enquêter, alors j'ai fini par recommencer depuis le début ... Parce qu'il y avait pas mal de choses Construisez rapidement de toute façon, en omettant le travail supplémentaire et les explications J'ai essayé de me concentrer là-dessus.

De plus, la différence entre pyenv et pipenv dans l'environnement Python Où l'environnement virtuel est créé et comment il fonctionne Comment fonctionne le serveur AP de Gunicorn, etc. Quand j'ai commencé à enquêter, cela est devenu encore plus profond, et en même temps je me suis intéressé, je me suis progressivement éloigné du but ...

Cet article + sélénium etc. a été utilisé pour automatiser le processus Un site qui rassemble des mangas pouvant être lus avec chaque application de manga Manga Ikki Fonctionne. Jetez un œil ici si vous le souhaitez.

Recommended Posts

Construisez rapidement Apache + Pipenv + Flask + SQLAlchemy avec Sakura VPS
Créer un environnement Flask avec Dockerfile + docker-compose.yml
Résumé de la création d'un environnement LAMP + Wordpress avec Sakura VPS
[Python] Créez rapidement une API avec Flask
Créer un babillard avec Heroku, Flask, SQL Alchemy
Créez rapidement un environnement Python Django avec IntelliJ
Jusqu'à ce que cela fonctionne avec virtualenv + flask + apache + wsgi