[PYTHON] Stellen Sie Django-Apps unter Ubuntu + Nginx + MySQL bereit (Build)

Ich habe einen Vertrag mit GMO Cloud ALTUS unterzeichnet und die entwickelte Django-Anwendung in der Umgebung von Nginx + uWSGI + MySQL + Python3 bereitgestellt. Daher möchte ich ein Memorandum über die ausgeführte Operation aufbewahren. Bitte beachten Sie, dass dies nur eine Arbeitsnotiz ist und nicht unbedingt eine bewährte Methode ist. Bitte zögern Sie nicht, auf Fehler oder Mängel hinzuweisen (lacht)

Betriebsumgebung

Erstens ist WSGI (Web Server Gateway Interface) eine Standardschnittstelle (PEP333) zwischen einer in Python geschriebenen Anwendung und einem Webserver. UWSGI bezieht sich auf einen Webserver, auf dem Webanwendungen ausgeführt werden können, die den WSGI-Spezifikationen entsprechen.

Die mit Django erstellte Anwendung wurde für die Arbeit mit WSGI entwickelt und kann mit verschiedenen Konfigurationen betrieben werden. Diesmal gab Yuri Umezaki von Pycon 2015 jedoch bekannt ([Webdienstbetrieb mit uWSGI / Docker]). Beispiel](https://www.youtube.com/watch?v=zsoqAf-c3_s&index=23&list=PLMkWB0UjwFGkE3BIm4qpwaK5oPrmLLJoT)) wurde mit der folgenden Konfiguration erstellt.

Anwendungskonfiguration

Web Browser <--> Nginx <--> socket <--> uWSGI <--> Djnago <--> MySQL

Verzeichnisaufbau

/
└── var/
    └── www/
        └── example.jp/           <-Bereitstellungszielordner
            ├── venv/             <-Verzeichnis der virtuellen Umgebung
            │   ├── app           <-Projektstamm der Django-Anwendung(django-Erstellt mit der App admin startproject)
            │   │   └ main        <-Anwendungsstamm der Django-Anwendung(python manage.py startapp main)
            │   ├── uwsgi.ini     <-INI-Datei, die die Startoptionen von uwsgi verwaltet
            │   └── uwsgi_params  <-Datei, in der uwsgi-Variablen gespeichert sind
            └── static            <-Verzeichnis zum Speichern statischer Dateien

Serverinitialisierung

1. Firewall-Einstellungen


GMO Cloud ALTUS verfügt über eine Funktion, mit der Sie die Firewall vom Bildschirm aus einstellen können. Set gemäß make_security.html). Erstens haben nur "22" und "80" Ports geöffnet.

2. Melden Sie sich beim virtuellen Server an


GMO Cloud ALTUS - Erstellen Sie einen virtuellen Server mit der Ubuntu-Vorlage für den Basisplan. Nach der Erstellung können Sie sich als Benutzer namens "Cloud" anmelden. Nach dem Erstellen des virtuellen Servers wird das Anmeldekennwort des virtuellen Servers im Dialogfeld angezeigt. Notieren Sie sich dies, da Sie es auf anderen Bildschirmen nicht sehen können.

3. Ändern Sie den SSH-Port und verbieten Sie die Anmeldung durch den Root-Benutzer


Die SSH-Portnummer "22" wird häufig gehackt. Ändern Sie sie daher von 22 auf eine andere Nummer (diesmal 2222). In Bezug auf die Kennwortauthentifizierung durch den Root-Benutzer befindet sich "PermitRootLogin-Verbotskennwort" in einem Zustand, in dem dies nicht einmal standardmäßig möglich ist, sodass die erforderlichen Mindesteinstellungen abgeschlossen sind. Für den Fall, dass die SSH-Anmeldung durch den Root-Benutzer überhaupt verboten ist. Machen.

# sshd_Konfigurationsdatei bearbeiten
[cloud]$ sudo vi /etc/ssh/sshd_config
[sudo] password for cloud:          <-Geben Sie das Cloud-Benutzerpasswort ein

/etc/ssh/sshd_config


# What ports, IPs and protocols we listen for
-Port 22
+Port 2222
(Unterlassung)

# Authentication:
(Unterlassung)
-PermitRootLogin prohibit-password
+PermitRootLogin no

4. Starten Sie den SSH-Dienst neu


Starten Sie den SSH-Dienst neu, damit die bisherigen Änderungen wirksam werden.

[cloud]$ sudo service ssh restart

Schließen Sie nach dem Neustart den Port "22" in der Firewall und öffnen Sie den Port "2222". Sobald Sie den Port öffnen und schließen können

--Deny Verbindung über Port "22" --Port "2222" kann sich nicht als Root anmelden --Port "2222", Cloud-Benutzer kann sich anmelden

Versicher dich.

5. SSH-Verbindung mit öffentlicher Schlüsselauthentifizierung


[SSH-Port ändern und Anmeldung durch Root-Benutzer verbieten](# 3 - SSH-Port ändern und Anmeldung durch Root-Benutzer verbieten) verbietet die direkte Anmeldung als Root-Benutzer und legt fest, dass sich nur allgemeine Benutzer anmelden können. Ich habe es geändert, aber ich werde es so einstellen, dass es sich mit der Authentifizierung mit öffentlichem Schlüssel für eine sicherere Verwendung anmeldet.

Für diejenigen, die etwas über die Authentifizierung mit öffentlichem Schlüssel wissen möchten, "Vertraute Authentifizierung mit öffentlichem Schlüssel" - selbst Anfänger können verstehen! Weitere Informationen finden Sie im Webserver-Betriebskurs von VPS (2).

Ich verwende Tera Term auch als SSH-Client. Informationen zum Festlegen der Authentifizierung mit öffentlichem Schlüssel in Tera Term finden Sie unter SSH-Verbindung durch Authentifizierung mit öffentlichem Schlüssel - Verwendung von Tera Term. / linux / tera-term-ssh-login-public-key /) und [SSH-Verschlüsselungsmethode mit öffentlichem Schlüssel - Authentifizierung mit öffentlichem Schlüssel mit Tera Term](http://www.j-oosk.com/teraterm/authorized_keys/ Bitte beachten Sie 306 /).

Folgen Sie dem obigen Link, um die Authentifizierungseinstellungen für den öffentlichen Schlüssel in Tera Term abzuschließen.

/etc/ssh/sshd_config


# Change to no to disable tunnelled clear text passwords
-#PasswordAuthentication yes
+PasswordAuthentication no

Bearbeiten.

Starten Sie den SSH-Dienst nach der Bearbeitung wie in [4. Starten Sie den SSH-Dienst neu] neu (# 4 - Starten Sie den SSH-Dienst neu) und bestätigen Sie, dass die Authentifizierungsmethode von der Kennwortauthentifizierung zur Authentifizierung mit öffentlichem Schlüssel geändert wurde. Ich werde.

6. Aktualisieren Sie das Paketverwaltungssystem


apt-get ist ein Befehl zum Bedienen und Verwalten von Paketen mithilfe der APT-Bibliothek (Advanced Package Tool), einem Paketverwaltungssystem für Debian-basierte Distributionen (Debian und Ubuntu), das die Abhängigkeiten der Anwendungen enthält, die Sie installieren möchten. Sie können mit installieren / deinstallieren.

#Aktualisieren Sie die Datenbank, die das Paket verwaltet (aktualisieren Sie das Paket selbst nicht).
[cloud]$ sudo apt-get update

#Installierte Pakete aktualisieren
[cloud]$ sudo apt-get upgrade

Referenz: [Ubuntu] Paket mit apt-get installieren / deinstallieren / aktualisieren Verwendung von apt-get apt-get --Package-Betrieb und -Verwaltung --Linux-Befehl APT HOWTO (Veraltete Dokumentation) Kapitel 3 - Paketverwaltung [Protokoll der Position und Bestätigungsmethode des Ubuntu / apt-Befehls](http://linux.just4fun.biz/Ubuntu/apt%E3%82%B3%E3%83%9E%E3%83%B3%E3%83] % 89% E3% 81% AE% E6% 93% 8D% E4% BD% 9C% E3% 83% AD% E3% 82% B0% E3% 81% AE% E5% 9C% A8% E5% 87% A6 % E3% 81% A8% E7% A2% BA% E8% AA% 8D% E6% 96% B9% E6% B3% 95.html)

7. Ändern Sie das Gebietsschema (Sprache usw.) für Japan


Das Standardgebietsschema ist für englischsprachige Länder. Nachrichten und Daten werden für englischsprachige Länder angezeigt. Ändern Sie daher das Gebietsschema für Japan.

#Überprüfen Sie das Gebietsschema vor der Änderung
[cloud]$ locale

#Bestätigen Sie, dass es sich um ein englischsprachiges Gebietsschema handelt
[cloud]$ date
Fri Dec 16 10:01:01 JST 2016

#Installieren Sie das japanische Paket
[cloud]$ sudo apt-get install language-pack-ja

#Gebietsschema aktualisieren
[cloud]$ sudo update-locale LANG=ja_JP.UTF-8

#Neustart des Betriebssystems
[cloud]$ sudo shutdown -r now

#Überprüfen Sie das geänderte Gebietsschema
[cloud]$ locale

#Bestätigen Sie, dass es sich um ein japanischsprachiges Gebietsschema handelt
[cloud]$ date

8. Zeitsynchronisation


Bis zum 15.04. Verwendete Ubuntu ntpdate, um die Zeit zu synchronisieren, ab 15.10 verwendet es die Systemd-Funktion, um die Zeit zu synchronisieren. Standardmäßig wird ein NTP-Server mit dem Namen "ntp.ubuntu.com" für die Zeitsynchronisation verwendet. Ändern Sie ihn daher in den NTP-NTP-Server (Informations- und Kommunikationsforschungsorganisation) (ntp.nict.jp).

#Überprüfen Sie die Einstellungen für die Zeitsynchronisation
[cloud]$ systemctl -l status systemd-timesyncd

#Ändern Sie das Zeiterfassungsziel
[cloud]$ sudo sed -i 's/#NTP=/NTP=ntp.nict.jp/g' /etc/systemd/timesyncd.conf

? #Neustart des Betriebssystems
? sudo shutdown -r now

#Starten Sie den Zeitsynchronisationsdienst neu
[cloud]$ sudo systemctl restart systemd-timesyncd.service

#Überprüfen Sie die Einstellungen für die Zeitsynchronisation
[cloud]$ systemctl -l status systemd-timesyncd

#Anzeigezeit
[cloud]$ date

※Referenz: Ändern Sie die Einstellung für die Zeitanpassung in Ubuntu 16.04 und 15.10 systemd ich weiß nicht

Erstellen Sie einen Nginx-Benutzer

Später, wenn wir Nginx installieren, erstellen wir eine Gruppe namens Nginx und einen Benutzer namens Nginx, der sich nicht anmelden kann. Stellen Sie die 100s-Gruppen-ID und die Benutzer-ID gemäß der folgenden Zuordnungsrichtlinie ein.

Verwenden Reichweite
Systemadministrator 0 - 99
Systemkonto 100 - 999
Benutzerkonto 1000 - 29999
Reservierung 30000 - 59999
#Überprüfen Sie die verwendete Gruppen-ID
[cloud]$ cat /etc/group

#Erstellen Sie eine Nginx-Gruppe
[cloud]$ sudo groupadd -g [Gruppen-ID] nginx

#Überprüfen Sie die verwendete Benutzer-ID
[cloud]$ cat /etc/passwd

#Erstellen Sie einen Nginx-Benutzer, der zur Nginx-Gruppe gehört
[cloud]$ sudo useradd -g nginx -u [Benutzeridentifikation] -d /nonexistent -s /bin/false nginx

Erstellen eines freigegebenen Benutzers

Erstellen Sie einen App-Benutzer als den Benutzer, der die Anwendung ausführt.

#App-Benutzer hinzufügen
[cloud]$ sudo useradd app -g nginx

#Bestätigen Sie den App-Benutzer
[cloud]$ sudo cat /etc/passwd

#Überprüfen Sie die Gruppe, zu der der App-Benutzer gehört
[cloud]$ sudo groups app

#Legen Sie das App-Benutzerpasswort fest
[cloud]$ sudo passwd app

#Bestätigen Sie, dass Sie zum App-Benutzer wechseln können
[cloud]$ su app

#Melden Sie sich vom App-Benutzer ab
[app]$ exit

Python-Einstellungen

Ich möchte Pakete für jedes Projekt unabhängig installieren und verwenden, anstatt sie global zu installieren. Verwenden Sie pyvenv, da Pyvenv anscheinend anstelle von virtualenv aus Python 3.3 verwendet werden kann.

#Ubuntu 16 von GMO Cloud ALTUS.Python ist bereits in der 04-Vorlage installiert.
#Überprüfen Sie das installierte Python.
[cloud]$ python3 -V

#Installieren Sie pip
[cloud]$ sudo apt install python3-pip

#Pip aktualisieren
[cloud]$ pip3 install --upgrade pip

#Installieren Sie pyvenv
[cloud]$ sudo apt install python3-venv

Referenz: Python3-Entwicklungsumgebung mit pyenv und venv vorbereiten Hinweise zu dem, was ich gelernt habe, als ich über die Verwendung von pyenv oder virtualenv unter Windows nachgedacht habe

Nginx-Einstellungen

Später möchte ich die Website beschleunigen und optimieren. Daher werde ich dieses Mal das von Google entwickelte PageSpeed-Modul (ngx_pagespeed) verwenden, indem ich es in Nginx einbinde. Installieren Sie Nginx + ngx_pagespeed mithilfe eines von Google bereitgestellten Shell-Skripts aus dem Quellcode.

#Installieren Sie den Befehl zum Entpacken
[cloud]$ sudo apt-get install unzip

#Installieren Sie die OpenSSL-Bibliothek
[cloud]$ sudo apt-get install libssl-dev

#Die PCRE-Bibliothek ist eine Bibliothek für reguläre Ausdrücke
#Das Abgleichen durch reguläre Ausdrücke wird möglich, indem die URL neu geschrieben und der Speicherort angegeben wird
[cloud]$ sudo apt-get install libpcre3-dev

#Erstellen Sie ein Cache-Zielverzeichnis für den Puffer
[cloud]$ sudo mkdir -p /var/cache/nginx/client_temp

#Ändern Sie den Eigentümer des Cache-Zielverzeichnisses des Puffers
[cloud]$ sudo chown nginx:root /var/cache/nginx/client_temp

#Ändern Sie die Berechtigungen des Cache-Zielverzeichnisses des Puffers
[cloud]$ sudo chmod 700 /var/cache/nginx/client_temp

#Wechseln Sie zum Root-Benutzer
[cloud]$ sudo su -

#Neueste Nginx- und PageSpeed-Module(ngx_pagespeed)Installieren
[root]$ bash <(curl -f -L -sS https://ngxpagespeed.com/install) --nginx-version latest -b /usr/local/src

#In der Mitte wird ein Dialogfeld angezeigt, in dem Sie zusätzliche Konfigurationsoptionen angeben können. Geben Sie daher zusätzliche Optionen an.
(Unterlassung)
About to build nginx.  Do you have any additional ./configure
arguments you would like to set?  For example, if you would like
to build nginx with https support give --with-http_ssl_module
If you don't have any, just press enter.
> --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with-ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed'

#Melden Sie sich vom Root-Benutzer ab
[root]$ exit

#Überprüfen Sie die Nginx-Version
[cloud]$ nginx -V

#Starten Sie Nginx
[cloud]$ sudo nginx

Stellen Sie nach dem Starten von Nginx mit einem Browser eine Verbindung zu http: // [IP-Adresse] her. Wenn Sie die Nginx-Begrüßungsseite anzeigen können, ist dies in Ordnung!

Ich werde die Einstellung von ngx_pagespeed im Operationsabschnitt einführen, der später aktualisiert wird, aber dieses Mal möchte ich nur den Teil überprüfen, der die Funktion vorerst aktiviert.

Fügen Sie der Serveranweisung in /etc/nginx/nginx.conf die Einstellung zum Aktivieren von PageSpeed hinzu. In der Server-Direktive von nginx.conf

/etc/nginx/nginx.conf


http {
    (Unterlassung)
    server {
         (Unterlassung)
+        pagespeed on;
+        pagespeed RewriteLevel CoreFilters;
+        pagespeed FileCachePath /var/cache/ngx_pagespeed_cache;
+        pagespeed EnableFilters collapse_whitespace,trim_urls,remove_comments;
         (Unterlassung)
    }

}

Wenn Sie hinzufügen können, starten Sie Nginx neu und überprüfen Sie die Antwort der Anforderung. Wenn der Antwortheader "X-Page-Speed: 1.11.33.4-0" enthält, ist dies in Ordnung!

#Starten Sie Nginx neu
[cloud]$ sudo nginx -s reload

#Wirf eine Anfrage und überprüfe den Antwortheader
[cloud]$ curl -I 'http://localhost/' | grep X-Page-Speed
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
X-Page-Speed: 1.11.33.4-0

Referenz: Build ngx_pagespeed From Source So beschleunigen Sie die Website durch Einführung von Nginx + PageSpeed (ngx_pagespeed) 1. Serialisierung von Nginx: Einführung von Nginx Verwenden Sie PageSpeed, um Ihre Website zu optimieren und zu beschleunigen NGINX-1.5.12. Kompilierungs- und Installationsverfahren [Debian] [CentOS] [Ubuntu] Benutzer-ID-Richtlinien und Zuweisungsregeln überprüfen Ubuntu Policy Manual - 9.2.2 UID and GID classes

MySQL-Einstellungen

# MySQL5.Installieren Sie 7
$ sudo apt-get -y install mysql-server-5.7

#Melden Sie sich als Root an
$ mysql -u root -p

#Datenbank erstellen
mysql> CREATE DATABASE `[Name der Datenbank]` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

#Wählen Sie MySQL-Datenbank
mysql> USE 'mysql';

#Benutzerinformationen anzeigen
mysql> select user,host from mysql.user;

#Berechtigung für vom Benutzer erstellte und erstellte Datenbank(CREATE, ALTER, REFERENCES, INDEX, SELECT, UPDATE, INSERT, DELETE)Gewähren
mysql> GRANT CREATE,ALTER,REFERENCES,INDEX,SELECT,UPDATE,INSERT,DELETE ON [Name der Datenbank].* TO '[Nutzername]'@'localhost' IDENTIFIED BY '[Passwort]';

#Überprüfen Sie die Berechtigungen des erstellten Benutzers
mysql> SHOW GRANTS for '[Nutzername]'@'localhost';

#Melden Sie sich von MySQL ab
mysql> exit

※Referenz MySQL-Installation Using MySQL with Django - Access denied for user '@'localhost [MySQL / Benutzer- und DB-Erstellung](http://wiki.minaco.net/index.php?MySQL%2F%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%A8DB % E4% BD% 9C% E6% 88% 90)

Erstellen eines Bereitstellungszielverzeichnisses

#Erstellen Sie ein Bereitstellungszielverzeichnis
[cloud]$ sudo mkdir -p /var/www/example.jp

#Ändern Sie den Eigentümer des Zielverzeichnisses
[cloud]$ sudo chown root:nginx /var/www/example.jp

#Ändern Sie die Berechtigungen des Bereitstellungszielverzeichnisses
[cloud]$ sudo chmod g+w /var/www/example.jp

#Wechseln Sie zum App-Benutzer
$ su app

#Erstellen Sie eine virtuelle Umgebung namens venv.
[app]$ /usr/bin/pyvenv /var/www/example.jp/venv

#Aktivieren Sie die erstellte virtuelle Umgebung. Wenn die virtuelle Umgebung aktiviert ist, "([evn name])Wird am Anfang der Shell hinzugefügt.
[app]$ source /var/www/example.jp/venv/bin/activate

#Aktualisieren Sie die Pip der virtuellen Umgebung auf den neuesten Stand
(venv)[app]$ pip install --upgrade pip

#Installieren Sie Django in einer virtuellen Umgebung
(venv)[app]$ pip install Django

#Installieren Sie uWSGI in einer virtuellen Umgebung
(venv)[app]$ pip install uwsgi

#Installieren Sie PyMySQL in einer virtuellen Umgebung, damit Django eine Verbindung zu MySQL herstellen kann
(venv)[app]$ pip install PyMySQL

#Deaktivieren Sie die virtuelle Umgebung einmal
(venv)[app]$ deactivate

Ich denke, es gibt verschiedene Möglichkeiten, die erstellte Django-Anwendung bereitzustellen, z. B. mithilfe von Git- oder FTP-Software, aber dieses Mal werde ich sie mithilfe von FTP-Software auf den Server hochladen.

Laden Sie die erstellte Django-Anwendung als App-Benutzer unter "/var/www/example.jp/venv/" mit der FTP-Software hoch. Ich habe jedoch geändert, um die Kennwortauthentifizierung in [SSH-Verbindung durch Authentifizierung mit öffentlichem Schlüssel](# 5-ssh-Verbindung durch Authentifizierung mit öffentlichem Schlüssel) zu verbieten und mich mit Authentifizierung mit öffentlichem Schlüssel anzumelden. Daher habe ich festgelegt, dass die Authentifizierung mit öffentlichem Schlüssel auch mit FTP-Software durchgeführt werden kann. Müssen, zu ... haben.

Ich verwende WinSCP als FTP-Software, aber da WinSCP nur private Schlüssel im PuTTY-Format unterstützt, habe ich es mit [SSH-Verbindung durch Authentifizierung mit öffentlichem Schlüssel](# 5-ssh-Verbindung durch Authentifizierung mit öffentlichem Schlüssel) erstellt. Ich habe den privaten Schlüssel in das PuTTY-Format konvertiert.

Klicken Sie im Anmeldebildschirm auf die Schaltfläche Bearbeiten, um den Bildschirm "Erweiterte Websiteeinstellungen" anzuzeigen. Klicken Sie in der Navigation auf "SSH" ⇒ "Authentifizierung" und dann auf die Schaltfläche "Datei auswählen" für "Privater Schlüssel". Der Bildschirm "Privaten Schlüssel auswählen" wird angezeigt. [SSH-Verbindung durch Authentifizierung mit öffentlichem Schlüssel](# 5-Wenn Sie den privaten Schlüssel auswählen, der durch SSH-Verbindung durch Authentifizierung mit öffentlichem Schlüssel erstellt wurde, wird er automatisch in den privaten Schlüssel im PuTTY-Format konvertiert.

uWSGI-Einstellungen

#Melden Sie sich vom App-Benutzer ab
[app]$ exit

#Erstellen Sie ein Verzeichnis zum Speichern von uWSGI-Socket- und PID-Dateien
[cloud]$ sudo mkdir -p /var/run/uwsgi

#Ändern Sie den Eigentümer des Verzeichnisses, in dem die uWSGI-Socket- und PID-Dateien gespeichert sind
[cloud]$ sudo chown root:nginx /var/run/uwsgi

#Ändern Sie die Berechtigungen des Verzeichnisses, in dem die uWSGI-Socket- und PID-Dateien gespeichert sind
[cloud]$ sudo chmod g+w /var/run/uwsgi

#Erstellen Sie ein Verzeichnis zum Speichern von uWSGI-Protokolldateien
[cloud]$ sudo mkdir -p /var/log/uwsgi

Erstellen Sie eine Datei (uwsgi_params), die Variablen für uWSGI unter /var/www/example.jp/venv/ definiert.

/var/www/example.jp/venv/uwsgi_params


uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

Erstellen Sie uwsgi.ini mit den Startoptionen von uWSGI.

vim:/var/www/example.jp/venv/uwsgi.ini


[uwsgi]
uid = nginx
gid = nginx

# Django-related settings
# the base directory (full path)
#Bitte ändern Sie es entsprechend Ihrer Umgebung
chdir = /var/www/example.jp/venv/app

# Django's wsgi file
#Bitte ändern Sie es entsprechend Ihrer Umgebung(Grundsätzlich "Django Projektname.wsgi "gesetzt)
module = app.wsgi

# the virtualenv (full path)
#Bitte ändern Sie es entsprechend Ihrer Umgebung
home = /var/www/example.jp/venv


# process-related settings
# master
master = true

# maximum number of worker processes
processes = 2

threads = 1

# the socket (use the full path to be safe
socket = /var/run/uwsgi/master.sock

pidfile = /var/run/uwsgi/master.pid

# ... with appropriate permissions - may be needed
chmod-socket = 666

# clear environment on exit
vacuum = true

thunder-lock = true

max-requests = 6000
max-requests-delta = 300

# log
logto = /var/log/uwsgi/uwsgi.log
deamonize = /var/log/uwsgi/uwsgi-@(exec://date +%Y-%m-%d).log
log-reopen = true

Nginx-Einstellungen

Stellen Sie den virtuellen Host in Zukunft unter der Annahme ein, dass mehrere Anwendungen auf demselben Server ausgeführt werden.

Erstellen Sie die Verzeichnisse "/ etc / nginx / sites-available" und "/ etc / nginx / sites-enabled". Die Konfigurationsdatei des virtuellen Hosts wird in "/ etc / nginx / sites-available" gespeichert.

Wenn Nginx gestartet wird, lesen Sie unter "/ etc / nginx / sites-enabled" und unter "/ etc / nginx / sites-enabled" symbolisch einen Link zur Einstellungsdatei unter "/ etc / nginx / sites-available". Sie können die Einstellungen des virtuellen Hosts aktivieren oder deaktivieren, indem Sie die Einstellungen hinzufügen oder löschen, was die Verwaltung erleichtert.

#Erstellen Sie ein Verzeichnis zum Speichern der Konfigurationsdatei des virtuellen Hosts
[cloud]$ sudo mkdir /etc/nginx/sites-available

#Erstellen Sie ein Verzeichnis zum Speichern des symbolischen Links zur Konfigurationsdatei des virtuellen Hosts, den Sie aktivieren möchten
[cloud]$ sudo mkdir /etc/nginx/sites-enabled

Erstellen Sie eine Konfigurationsdatei für den virtuellen Host unter "/ etc / nginx / sites-available /".

/etc/nginx/sites-available/example.jp


# the upstream component nginx needs to connect to
upstream django {
    # for a file socket
    server unix:///var/run/uwsgi/master.sock;
}

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    # substitute your machine's IP address or FQDN
    server_name [IP-Adresse oder Domain];
    charset     utf-8;

    # max upload size
    # Django media
    location /static {
        # your Django project's static files - amend as required
        #Bitte ändern Sie es entsprechend Ihrer Umgebung.
        alias /var/www/example.jp/static;
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        # the uwsgi_params file you installed
        #Bitte ändern Sie es entsprechend Ihrer Umgebung.
        include     /var/www/example.jp/venv/uwsgi_params;
    }
}

Nachdem Sie die Konfigurationsdatei für den virtuellen Host erstellt haben, erstellen Sie einen symbolischen Link.

#Stellen Sie einen symbolischen Link zur Konfigurationsdatei des virtuellen Hosts her, den Sie aktivieren möchten
[cloud]$ sudo ln -s /etc/nginx/sites-available/example.jp /etc/nginx/sites-enabled/example.jp

Fügen Sie der http-Direktive hinzu, um sie unter "/ etc / nginx / sites-enabled /" zu lesen.

/etc/nginx/nginx.conf


http {
     (Unterlassung)
     #gzip  on;
+    include /etc/nginx/sites-enabled/*;
     (Unterlassung)
}

Stellen Sie Nginx so ein, dass es automatisch startet, auch wenn das Betriebssystem neu gestartet wird. Erstellen Sie "/etc/systemd/system/nginx.service".

/etc/systemd/system/nginx.service


[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Sobald Sie "/etc/systemd/system/nginx.service" erstellt haben

#Nginx läuft, also hör auf
#Wenn Sie eine Fehlermeldung wie "PID-Datei kann nicht geöffnet werden" erhalten, starten Sie das Betriebssystem neu
[cloud]$ sudo nginx -s stop

#Inbetriebnahme
[cloud]$ sudo systemctl start nginx

#Dienstausfall
[cloud]$ sudo systemctl stop nginx

#Aktivieren Sie den automatischen Dienststart
[cloud]$ sudo systemctl enable nginx

#Inbetriebnahme
[cloud]$ sudo systemctl start nginx

Nachdem Sie bestätigt haben, dass der Dienst durch Ausführen gestartet / gestoppt werden kann, registrieren Sie Nginx als Dienst.

Andere Befehle für den Dienst


#Neustart des Dienstes
$ sudo systemctl restart [Dienstname]

#Deaktivieren Sie den automatischen Start des Dienstes
$ sudo systemctl disable [Dienstname]

#Überprüfen Sie den Betriebsstatus des Dienstes
$ sudo systemctl status [Dienstname]

#Beenden Sie alle im Service enthaltenen Prozesse
$ sudo systemctl kill -s9 [Dienstname]

Referenz: [Einführung des leichten und schnellen Webservers Nginx in Ubuntu 12.04 (Einstellung von Teil 1)](http://blog.kondoyoshiyuki.com/2012/12/09/setting-1-nginx-on-ubuntu-12 -04 /) NGINX systemd service file

Django Grundeinstellungen

Ich möchte eine Datenbank und Tabellen in MySQL erstellen, damit ich eine DB-Migration von Django durchführen kann.

#Virtuelle Umgebung aktivieren
[app]$ source /var/www/example.jp/venv/bin/activate

#Erstellen Sie eine Migrationsdatei
(venv)[app]$ python /var/www/example.jp/venv/pornstar/manage.py makemigrations app

#Überprüfen Sie die Migration, die im SQL-Format ausgeführt werden soll
(venv)[app]$ python /var/www/example.jp/venv/pornstar/manage.py sqlmigrate app 0001

#Führen Sie die Migration durch
(venv)[app]$ python /var/www/example.jp/venv/pornstar/manage.py migrate

Außerdem werden statische Dateien erfasst, indem sie von jeder Anwendung in ein bestimmtes Verzeichnis kopiert werden, damit sie problemlos in der Produktionsumgebung veröffentlicht werden können. Kopieren Sie die statische Datei mit dem folgenden Befehl in das angegebene Verzeichnis.

Bearbeiten Sie settings.py in Ihrer Django-Anwendung, fügen Sie STATIC_ROOT hinzu und kommentieren Sie STATICFILES_DIRS aus.

diff:/var/www/example.jp/venv/app/app/settings.py


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/

STATIC_URL = '/static/'
+STATIC_ROOT = '/var/www/example.jp/static/'
(Unterlassung)
-STATICFILES_DIRS = (
-    os.path.join(BASE_DIR, "static"),
-)
+#STATICFILES_DIRS = (
+#    os.path.join(BASE_DIR, "static"),
+#)
#Statische Datei kopieren
(venv)[app]$ python /var/www/example.jp/venv/app/manage.py collectstatic

#Deaktivieren Sie die virtuelle Umgebung
(venv)[app]$ deactivate

Referenz: So veröffentlichen Sie statische Dateien

Einstellungen für den uWSGI-Autostart

Erstellen Sie wie Nginx "/etc/systemd/system/uwsgi.service", damit uWSGI automatisch gestartet wird, auch wenn das Betriebssystem neu gestartet wird.

/etc/systemd/system/uwsgi.service


# uwsgi.service
[Unit]
Description=uWSGI
After=syslog.target

[Service]
ExecStartPre=/bin/bash -c 'mkdir -p /var/run/uwsgi; chown root:nginx /var/run/uwsgi; chmod g+w /var/run/uwsgi;'
ExecStart=/bin/bash -c 'source /var/www/example.jp/venv/bin/activate; uwsgi --ini /var/www/example.jp/venv/uwsgi.ini'
#Restart=always
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

"ExecStartPre" ist eine Option zum Angeben des Befehls, der vor dem Starten des Dienstes ausgeführt werden soll. Es wird jedoch angegeben, dass das Verzeichnis (/ var / run / uwsgi) zum Speichern der uWSGI-PID-Datei und der Socket-Datei als auszuführender Befehl erstellt wird.

Weil "/ var / run" eine symbolische Verknüpfung zu "/ run" ist und "/ run" im tmpfs-Dateisystem bereitgestellt ist. Beim Neustart des Betriebssystems werden dann alle Dateien unter "/ run (= / var / run)" gelöscht, sodass ein Befehl zum Erstellen eines Verzeichnisses angegeben wird, falls das Verzeichnis nicht vorhanden ist.

Stellen Sie sicher, dass Sie den Dienst starten / stoppen und den automatischen Start aktivieren können.

#Inbetriebnahme
[cloud]$ sudo systemctl start uwsgi

#Dienstausfall
[cloud]$ sudo systemctl stop uwsgi

#Aktivieren Sie den automatischen Dienststart
[cloud]$ sudo systemctl enable uwsgi

#Inbetriebnahme
[cloud]$ sudo systemctl start uwsgi

Aktualisierte Django-Konfigurationsdatei

diff:/var/www/example.jp/venv/app/app/settings.py


(Unterlassung)
# SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = True
+DEBUG = False
-ALLOWED_HOSTS = []
+ALLOWED_HOSTS = ['IP-Adresse oder Domain']
(Unterlassung)

Wenn Sie mit einem Browser auf http: // [IP-Adresse oder Domain] zugreifen und die Anwendung anzeigen können, ist dies in Ordnung!

Wenn es nicht funktioniert

--Interner Fehler

Überprüfen Sie die Nginx-Fehlerprotokolldatei (/var/log/nginx/error.log) und die uWSGI-Protokolldatei (/var/log/uwsgi/uwsgi.log), um den Fehler zu identifizieren.

Verweise

  1. Integration der uWSGI + Django-App in Nginx
  2. Versuchen Sie es mit nginx + uWSGI + Flask
  3. Verfahren zum Veröffentlichen der Django-App unter CentOS 7 + Nginx
  4. Verwendung von Django mit uWSGI
  5. Django Best Practice-Deployment-Server
  6. [Django-Umgebungskonstruktion (Ubuntu Server, Apache, PostgreSQL)](http://yura2.hateblo.jp/entry/2015/04/05/Django%E3%81%AE%E7%92%B0%E5 % A2% 83% E6% A7% 8B% E7% AF% 89 (Ubuntu_Server, _Apache, _PostgreSQL))
  7. Von der Installation von Apache bis zur Bereitstellung von Django
  8. Verwenden wir uWSGI, einen praktischen und superstarken WSGI-Server
  9. Beachten Sie, dass die Python Flask-App in der nginx + uWSGI-Umgebung bereitgestellt wurde
  10. Setting up Django and your web server with uWSGI and nginx

Recommended Posts

Stellen Sie Django-Apps unter Ubuntu + Nginx + MySQL bereit (Build)
Bereitstellen von Django (Ubuntu 14.04 LTS + Nginx + uWSGI + Supervisor)
Erstellen Sie eine Django-Umgebung auf Raspai (MySQL)
Build Python auf Ubuntu
Stellen Sie die Django-Anwendung auf EC2 mit Nginx + Gunicorn + Supervisor bereit
Stellen Sie die Django-Anwendung auf Heroku bereit
Erstellen Sie die Python 3.8 + Pipenv-Umgebung unter Ubuntu 18.04
Erstellen Sie wxPython unter Ubuntu 20.04 auf Himbeer-Pi 4
# 3 Erstellen Sie eine Python-Umgebung (Django) mit einer EC2-Instanz (ubuntu18.04) von AWS part2
Erstellen Sie Python 3 und OpenCV unter Ubuntu 18.04
Stellen Sie die Django-App in Heroku bereit [Teil 2]
Stellen Sie die Django-App in Heroku bereit [Teil 1]
Erstellen Sie eine Django-App auf Docker und stellen Sie sie in AWS Fargate bereit
Erstellen Sie mit Docker eine Umgebung aus NGINX + NGINX Unit + MySQL
Erstellen Sie eine Python-Umgebung mit pyenv auf EC2 (Ubuntu)
Erstellen Sie die Python3.5 + matplotlib-Umgebung unter Ubuntu 12 mit Anaconda
[Neueste] So erstellen Sie eine Java-Umgebung unter Ubuntu
Führen Sie Python-Webanwendungen mit NGINX + NGINX Unit + Flask aus
(Fall) Django (DRF) + uWSGI + Nginx + MySQL docker-compose.yml Beispiel
Erstellen Sie eine Kubernetes-Umgebung für die Entwicklung unter Ubuntu
Django Heroku Deploy 1
Shebang auf Ubuntu 20.04
Django Heroku Deploy 2
Für Sie, die durch den Einsatz von Django in die Enge getrieben werden. Vollversion der Django 2.2-Bereitstellung unter Ubuntu 18.04 + Nginx
Django + MySQL-Einstellungen
Stellen Sie Python 3.6 / Django / Postgres-Webanwendungen in Azure bereit
Erstellen einer Django-Entwicklungsumgebung mit pyenv-virtualenv auf einem Mac
# 2 Erstellen Sie eine Python-Umgebung mit einer EC2-Instanz von AWS (ubuntu18.04).
So stellen Sie eine Django-Anwendung in der Alibaba-Cloud bereit
Stellen Sie die Django-Anwendung in Google App Engine (Python3) bereit.
So erstellen Sie eine Django (Python) -Umgebung auf Docker
Erstellen Sie eine virtuelle Python-Umgebung mit venv (Django + MySQL ①)
Stellen Sie die mit PTVS erstellte Django-App in Azure bereit