[PYTHON] J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10

Actuellement, je crée un jeu de stratégie qui fonctionne sur le Web, mais j'ai eu des problèmes car j'ai annulé le serveur loué pour diverses raisons.

Argent ... non ... ;;;

Donc, j'ai Windows 10 sur mon PC, mais j'ai vérifié si un environnement expérimental pouvait être créé localement, et quand je l'ai essayé, j'ai réussi à le faire, donc je vais le déployer. Si vous avez un ordinateur, vous pouvez mettre en place un environnement Web sans dépenser d'argent, donc même si vous avez des problèmes, essayez-le!

Cependant, la sécurité est quasiment ignorée car c'est un "environnement vilain". De plus, créer un serveur sous Windows 10 et le publier sur le Web est une violation de la licence de Microsoft, donc ** Ne le faites jamais **. Uniquement en utilisant l'environnement expérimental local.

table des matières

supposition

Convient aux applications saisies à partir d'un navigateur Web. Fondamentalement, il s'agit d'une opération frontale avec HTML5 et Javascript, mais on suppose que les calculs et les sorties compliqués sont traités par Python sur un serveur virtuel. Rendez également possible la gestion de la base de données.

** Logiciels requis **

Il existe une version de nginx compatible avec Windows, alors utilisez-la. En outre, flask est utilisé comme cadre entre uwsgi et nginx.

Image d'opération

Il y a une déclaration selon laquelle uwsgi utilisé dans le serveur virtuel est pris en charge par Windows, mais en fait, il ne peut pas être exécuté directement sur Windows (cela ne fonctionne pas ...). Au lieu de cela, uwsgi peut être exécuté virtuellement sur le logiciel de terminal "cygwin" qui fonctionne sous Windows. Le flux de processus est une image du passage d'une action d'entrée du Web à Cygwin via nginx, du traitement de Python et de PostgreSQL, et de sa restitution à nginx.

En tant qu'image, cygwin est un serveur uwsgi et postgreSQL. 20200831003334.jpg

Environnement

En fait, mettre en place l'environnement. Ici, installez l'application suivante.

  1. Installez nginx. Récupérez l'archive de: J'utilise essentiellement la version Stable. Décompressez l'archive obtenue à l'emplacement de votre choix.  nginx HP

1-1. Démarrez l'invite de commande dans nginx-X.X.X de la destination. 1-2 Démarrer Entrez nginx pour exécuter. 1 à 3. Affichez http: // localhost dans le navigateur. Autoriser si bloqué par le pare-feu. Si "Welcome to nginx!" S'affiche, la configuration est normale. 1-4.nginx -s quitte pour quitter.

2. Installez python et les bibliothèques requises. Obtenez le programme d'installation de: En gros * utilisez le programme d'installation basé sur le Web. Configurez-le où vous le souhaitez avec le programme d'installation que vous avez.  python HP

Vous devriez cocher Ajouter Python x.x au chemin. Pour les autres, sélectionnez la valeur par défaut ou l'option en fonction de votre environnement. Je vais le tester une fois l'installation terminée.

# python -V
Python 3.8.2
* Pour Windows, cela semble être python, pas python3.

# pip3 install flask requests requests_oauthlib python-dateutil psycopg2
~ Omis ~

# pip3 list
~ Omis ci-dessous ~

3. Installez uwsgi. Ici, nous allons utiliser Cygwin Terminal pour l'installer sur l'émulateur Linux. Configurez-le où vous le souhaitez avec le programme d'installation que vous avez.  Cygwin HP

Sélectionnez ce qui suit pour le package (notez que sinon, il sera ignoré):

Choisissez la valeur par défaut ou l'option qui convient à votre environnement. L'environnement virtuel peut être sous la configuration actuelle.

Après la configuration, démarrez cygwin et configurez uwsgi.

Vérifiez le nom d'utilisateur de la maison ★ Après cela[Utilisateur Cygwin]Unifiez avec
# echo $USER
* Par défaut, le nom d'utilisateur de connexion Windows(dossier)Aura le même nom que

apt avec wget-Obtenez cyg
$ wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
$ chmod 755 apt-cyg
$ mv apt-cyg /usr/local/bin

Pour les commandes système
$ apt-cyg install procps

Obtenez la bibliothèque python3
$ apt-cyg install python3-devel

Téléchargez uwsgi depuis git et configurez-le.

$ wget https://github.com/unbit/uwsgi/archive/[Nom de l'archive de publication]
$ unzip [Nom de l'archive]
$ cd uwsgi-[Nom de la version]
$ python3 setup.py install
* Spécifiez la version de publication pour l'archive
* Cela prend beaucoup de temps car la compilation fonctionne.

Au fait, vérifiez l'encodage par défaut au cas où. S'il est basé sur Linux, uft-8 est basique, mais Cygwin est utf-8 par défaut, donc il ne devrait y avoir aucun problème.

$ python3
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>> exit
[ctrl+D]* Fin par entrée clé

Et si ce n'était pas utf-8? Ajoutez un encodage à votre profil.

$ vi /home/[Utilisateur Cygwin]/.bash_profile

export LANG=ja_JP.UTF-8

:wq

Après l'ajout, exécutez ce qui suit pour le charger.

$ source ~/.bash_profile

4. Installez postgreSQL.

4-1. Obtenez le code source de ce qui suit.  postgresql HP
Sélectionnez le format .qz.

$ wget [URL du code source]

4-2 Compilez et installez le code source.

$ tar -xvzf [Nom du fichier d'archive]
$ cd [Dossier décompressé]
$ mkdir make_dir
$ cd make_dir
$ ../configure --enable-nls --enable-thread-safety
$ make
$ make install
$ cd src/interfaces/libpq
$ make
$ make install

4-3. Ajoutez des variables d'environnement à .bash_profile.

$ vi /home/[Utilisateur Cygwin]/.bash_profile

export PATH=/usr/local/pgsql/bin:/usr/local/pgsql/lib:$PATH
export PGHOST=localhost
export PGLIB=/usr/local/pgsql/lib
export PGDATA=/usr/local/pgsql/data

:wq

Après l'ajout, exécutez ce qui suit pour le charger.

source ~/.bashrc
source ~/.bash_profile

4-4 Réglage initial.

$ /usr/sbin/cygserver.exe &
$ initdb -U postgres

Cela changera le nom du superutilisateur postgreSQL en [postgres].

4-5 Démarrez le serveur postgreSQL et vérifiez si vous pouvez vous connecter.

$ pg_ctl start
$ pg_ctl status
$ psql -l
$ psql postgres -U postgres

=>

=> \q

S'il n'y a aucune erreur, c'est OK.

4-6 Connexion Ensuite, définissez le mot de passe du super-utilisateur, créez une base de données et effectuez une authentification par mot de passe simple.

$ createuser strgdb -U postgres
$ createdb -O strgdb strgdb -U postgres

Super utilisateur[postgres]Connectez-vous avec
$ psql postgres -U postgres

Super utilisateur[postgres]Définissez un mot de passe pour
=> alter role postgres with password '[mot de passe principal postgres]';  

Utilisateur pour la région étoile[strgdb]Définissez un mot de passe pour.
=> alter role strgdb with password '[Mot de passe DB]';  
=> alter role strgdb with login;  
=> \q  

Modifiez le fichier d'autorisations.
$ vi /etc/local/pgsql/data/pg_hba.conf

De L95 à confiance → mot de passe défini comme suit

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
###local   all             all                                     trust
local   all             all                                     password
# IPv4 local connections:
###host    all             all             127.0.0.1/32            trust
host    all             all             127.0.0.1/32            password
# IPv6 local connections:
###host    all             all             ::1/128                 trust
host    all             all             ::1/128                 password
# Allow replication connections from localhost, by a user with the
# replication privilege.
###local   replication     all                                     trust
###host    replication     all             127.0.0.1/32            trust
###host    replication     all             ::1/128                 trust

:wq

Une fois terminé, pg_Redémarrez SQL
$ pg_ctl start

$ psql postgres -U postgres
Password for user postgres:* Entrez le mot de passe du super utilisateur

=> 

=> \q

$ psql strgdb -U strgdb
Password for user strgdb:* Entrez le mot de passe utilisateur strgdb
=> 
=> \q
Si vous pouvez vous connecter, c'est OK.

5. Préparez la source de test.

côté nginx (Windows)
/www/index.html
De manière appropriée.

côté uwsgi (Cygwin)
/home/[Lucida(Nom d'utilisateur)]/uwsgi/test.py
source de test python

#!/usr/bin/python
# coding: UTF-8
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

6. Démarrez cygwin et testez le serveur uwsgi.

uwsgi --http :9090 --wsgi-file uwsgi/test.py
*** Starting uWSGI 2.0.18 (64bit) on [Tue Aug 25 17:58:48 2020] ***
~ Omis ~
*** uWSGI is running in multiple interpreter mode ***

Autoriser si bloqué par le pare-feu. Accédez aux éléments suivants dans votre navigateur.

http://localhost:9090

Si Hello World est affiché, c'est OK. Arrêtez le serveur uwsgi avec Ctrl + C.

8. Émettez un certificat SSL. Les certificats suivants sont requis pour utiliser SSL.

Si vous ne les avez pas, vous pouvez les acheter et les obtenir ou émettre une auto-certification. Ce qui suit montre la procédure de délivrance d'une auto-certification.

Ouvrez le fichier openssl.cnf avec un éditeur de texte et modifiez ce qui suit. [dossier d'installation cygwin] /etc/pki/tls/openssl.cnf

L91 : default_days	  = 825

L150: countryName_default = JP
L155: stateOrProvinceName_default =XXXXXX * Préfecture
L158: localityName_default        =XXXXXX * Municipalités
L161: 0.organizationName_default  =XXXXXX * Nom de l'organisation
* La ligne semble changer en fonction de la version d'openssl

8-2 Créez la clé privée de l'autorité de certification et le certificat de l'autorité de certification racine. Ce sera un travail avec cygwin.

$ mkdir /etc/pki/CA
$ chmod 700 /etc/pki/CA
$ cd /etc/pki/CA
$ openssl genrsa -des3 -out ca.key 2048
Enter pass phrase for ca.key:* L'autorité de certification réussit correctement
Verifying - Enter pass phrase for ca.key:* Identique à la carte d'autorité de certification

$ openssl req -x509 -new -nodes -key ca.key -sha256 -out ca.pem
Enter pass phrase for ca.key:* Identique à la carte d'autorité de certification
~ Omis ~
Common Name (eg, your name or your server's hostname) []:* Nom de l'autorité de certification
* Autre que cela, aucune entrée
~ Omis ~

8-3. Installez le certificat d'autorité de certification sur le client. Dans Windows → Paramètres, recherchez "Certificat". Ouvrez Gérer les certificats utilisateur. Cliquez avec le bouton droit sur une autorité de certification racine de confiance, Toutes les tâches → Importer. Sélectionnez l'utilisateur actuel, ca.pem, sélectionnez l'autorité de certification d'itinéraire, puis OK.

8-4. Créez un certificat de serveur. Ce sera un travail avec cygwin.

$ mkdir /etc/pki/Server
$ chmod 700 /etc/pki/Server
$ cd /etc/pki/Server
$ openssl genrsa -out server.key 2048
$ openssl req -new -key server.key -out server.csr
~ Omis ~
Common Name (eg, your name or your server's hostname) []:* Adresse IP et nom d'hôte selon le cas
* Autre que cela, aucune entrée
~ Omis ~
$ vi server.txt
---------
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
---------\wq
$ openssl x509 -req -in server.csr -CA ../CA/ca.pem -CAkey ../CA/ca.key -CAcreateserial -out server.crt -sha256 -extfile server.txt
Enter pass phrase for ../CA/ca.key:* Pass d'autorité de certification

9. Paramètres de configuration de nginx Ajustez nginx.config dans 9-1.nginx. [dossier d'installation de nginx] /config/nginx.conf

#user  nobody;
worker_processes auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

worker_rlimit_nofile 2048;
events {
### worker_connections 1024;
	worker_connections 2048;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include [Dossier source HTML]/source/nginx/*.conf;
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    include [Dossier source HTML]/source/nginx/sites-enabled/*; 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Ajoutez ces deux lignes
    
###    server {
###        listen       80;
###        server_name  localhost;
###
###        #charset koi8-r;
###
###        #access_log  logs/host.access.log  main;
###
###        location / {
###            root   html;
###            index  index.html index.htm;
###        }
###
###        #error_page  404              /404.html;
###
###        # redirect server error pages to the static page /50x.html
###        #
###        error_page   500 502 503 504  /50x.html;
###        location = /50x.html {
###            root   html;
###        }

~ Omis ~
    }
~ Omis ~
}

9-2. Préparez la configuration pour le serveur nginx. Préparez un fichier différent de celui par défaut. [Dossier approprié] /nginx/https.conf

server {
	listen 443 ssl http2;
	server_name localhost;

	ssl_protocols TLSv1.2;
	ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
	ssl_ecdh_curve prime256v1;
	ssl_prefer_server_ciphers on;
	ssl_session_cache shared:SSL:10m;
	ssl_certificate [Dossier d'installation de Cygwin]/etc/pki/Server/server.crt;
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Certificat de serveur
	ssl_certificate_key [Dossier d'installation de Cygwin]/etc/pki/Server/server.key;
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Clé privée du serveur

	keepalive_timeout 70;
	sendfile on;
	client_max_body_size 0;
	root [Dossier source HTML]
       ~~~~~~~~~~~~~~~~~~~~~
	server_tokens off;
	charset utf-8;

	gzip on;
	gzip_disable "msie6";
	gzip_vary on;
	gzip_proxied any;
	gzip_comp_level 6;
	gzip_buffers 16 8k;
	gzip_http_version 1.1;
	gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
	add_header Strict-Transport-Security "max-age=31536000";

	location / {
		index index.html;
	}

	location /uwsgi {
		include uwsgi_params;
		proxy_pass https://127.0.0.1:9090;
	}

}

9-3 Test de démarrage du serveur.

Démarrez cygwin.
$ uwsgi --master --https 127.0.0.1:9090,/etc/pki/Server/server.crt,/etc/pki/Server/server.key --wsgi-file strg_uwsgi/test.py
  
Démarrez nginx à l'invite Windows DOS.
$ [lecteur d'installation nginx]:
$ cd [dossier d'installation de nginx]
$ start nginx
  
Accédez aux deux emplacements suivants avec votre navigateur.
 https://localhost/
C'est OK si le haut de la page Web est affiché.

 https://localhost/uwsgi
Si Hello World s'affiche, c'est OK.

Arrêtez une fois les serveurs nginx et uwsgi. uwsgi est Ctrl+Arrêtez-vous à C.
$ nginx -s quit
  

c'est tout. Alors fais ce que tu veux.

Début et fin

Commencez par la commande suivante.

côté nginx (Windows)
# start nginx

côté cygwin
# /usr/sbin/cygserver.exe &
# pg_ctl start
# pg_ctl status
# uwsgi --master --https 127.0.0.1:9090,/etc/pki/Server/server.crt,/etc/pki/Server/server.key --wsgi-file uwsgi/test.py

Pour terminer, utilisez la commande suivante.

côté nginx (Windows)
# nginx -s stop

côté cygwin
※Ctrl+Appuyez sur C
# pg_ctl stop
# pg_ctl status

Quittez Cygwin

Sites / articles référencés

Les titres sont omis ci-dessous.

Recommended Posts

J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10
Créer un environnement Linux sur Windows 10
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de créer un linebot (préparation)
J'ai construit un environnement TensorFlow avec windows10
J'ai essayé de créer un environnement de MkDocs sur Amazon Linux
Créer un environnement d'exécution Python sur IBM i
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
J'ai essayé de créer une configuration RAID logicielle SATA qui démarre le système d'exploitation sur Ubuntu Server
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
Créez un environnement de développement Python 3 (Anaconda) confortable avec Windows
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
Création d'un environnement TensorFlow qui utilise des GPU sous Windows 10
[Go + Gin] J'ai essayé de créer un environnement Docker
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
Comment exécuter Django sur IIS sur un serveur Windows
Créez un environnement shell et python décent sur Windows
Je voulais créer rapidement un serveur de messagerie utilisable librement avec postfix + dovecot sur EC2
J'ai essayé de créer un environnement avec WSL + Ubuntu + VS Code dans un environnement Windows
CodePicnic qui peut créer un environnement [Développement | Exécuter | Tutoriel | Démo] qui s'exécute sur le navigateur
[Mac] Je souhaite créer un serveur HTTP simple qui exécute CGI avec Python
J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
J'ai essayé l'algorithme de super résolution "PULSE" dans un environnement Windows
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
J'ai essayé de créer un bot pour annoncer un événement Wiire
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai fait un générateur de réseau neuronal qui fonctionne sur FPGA
J'ai essayé de créer l'API Quip
Créer un environnement Python sur Mac (2017/4)
Créer un environnement python dans centos
J'ai essayé de l'activer / de le désactiver en définissant "Créer un plug-in qui met en évidence les espaces pleine largeur avec Sublime Text 2".
[Linux] Comment installer un package sur un serveur qui n’a pas d’environnement Internet (autonome)
Comment configurer WSL2 sur Windows 10 et créer un environnement d'étude pour les commandes Linux
Quand j'ai essayé de créer un environnement Rails sur WSL2 (Ubuntu 20.04LTS), j'ai trébuché et suis tombé.
Concurrence avec VS Code Créez un environnement Python pour les professionnels sous Windows
J'ai essayé de créer un pointage de crédit simple avec régression logistique.
J'ai essayé de créer un système qui ne récupère que les tweets supprimés
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
Qiskit: Je veux créer un circuit qui crée des états arbitraires! !!
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé d'enregistrer une station sur la plateforme IoT "Rimotte"
J'ai essayé de créer des taureaux et des vaches avec un programme shell
Tout, de la création d'un environnement Python à son exécution sous Windows
Créez un environnement python sur votre Mac
Je veux créer un environnement Python
J'ai essayé d'installer Kivy dans un environnement Mac
[Python] Créez un LineBot qui s'exécute régulièrement
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse
J'ai créé une API Web
Créer une machine virtuelle Linux sous Windows
J'ai essayé la détection d'objets avec YOLO v3 (TensorFlow 2.0) sur un processeur Windows!
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'ai essayé de mettre en œuvre une blockchain qui fonctionne réellement avec environ 170 lignes
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
Créez un environnement de développement Python sur Windows (WSL distant Visual Studio Code).
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
J'ai écrit un diagramme de configuration du système avec des diagrammes sur Docker
J'ai essayé de développer un formateur qui génère des journaux Python en JSON