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 avec les paramètres suivants de l'écran de l'administrateur Sakura VPS Divers paramètres> Installation du système d'exploitation
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
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;
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://'サイトのアドレス'
** 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
** 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
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)
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
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.
redémarrer apache
$ systemctl restart httpd
http://'サイトのアドレス'/phpmyadmin/
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