- 1. Schritt 1 - Aktualisieren des Systems
- 2. Schritt 4 – Einrichten der virtuellen Umgebung
- 3. Schritt 5 – Installieren des PostgreSQL-Treibers
- 4. Schritt 6 – Erstellen des Projekts
- 5. Schritt 7 - Konfigurieren der Datenbankverbindung
- 6. Schritt 8 – Durchführen von Datenbankmigrationen
- 7. Schritt 9 - Gunicorn installieren
- 8. Schritt 10 - Statische Dateien konfigurieren
- 9. Schritt 11 - Konfigurieren von Nginx
- 10. Schritt 12 - Supervisor konfigurieren
- 11. Notiz
Nachdem der Zugriff auf den Server mit Ubuntu 16.04 in einem der vorherigen Artikel konfiguriert wurde, ist es an der Zeit, alles Notwendige bereitzustellen, damit die Site darauf funktioniert. nämlich:
- Django
- ein Framework für die Entwicklung von Webanwendungen in Python;
- PostgreSQL
- SQL-Datenbank;
- Gunicorn - WSGI HTTP-Server in Python für UNIX-Systeme;
- Ngnix - HTTP-Server und Reverse-Proxy, Mail-Proxy und Allzweck-TCP/UDP-Proxy;
- Supervisor ist ein Prozessmanager, der die Verwaltung von Programmen mit langer Laufzeit erheblich vereinfacht, insbesondere von Websites, die nach einem Absturz automatisch neu gestartet werden müssen.
Schritt 1 - Aktualisieren des Systems
Lassen Sie uns die vorhandenen Pakete aktualisieren. Man weiß nie, das System hat veraltete Pakete.
sudo apt-get update sudo apt-get upgrade
Schritt 2 – Installieren aller erforderlichen Pakete, ohne die virtuelle Umgebung zu installieren
Installieren Sie einen Stapel aller erforderlichen Pakete, die nicht über virtualenv verwendet werden, nämlich Python 3, PostgreSQL, Nginx.
sudo apt-get install python3-dev python3-setuptools libpq-dev postgresql postgresql-contrib nginx
Pip Ich habe es letztendlich separat über das easy \ _install3 Dienstprogramm installiert, das mit python3-setuptools geliefert wird, erstens weil dann die neueste Version installiert wird und zweitens, wenn es über apt -get installiert wird Beim Installieren von Paketen in virtualenv sind Fehler aufgetreten.
sudo easy_install3 pip
Schritt 3 - Erstellen der Datenbank und des Datenbankbenutzers
Lassen Sie uns nun eine Datenbank und einen Benutzer erstellen und dem postgres-Benutzer erweiterte Rechte über das sudo-Dienstprogramm geben, das bei der Installation von PostgreSQL erstellt wird.
sudo -u postgres psql
Nach der Ausführung dieses Befehls werden wir zur PostgreSQL-Konsole weitergeleitet, wo wir die erforderliche Datenbank und einen Benutzer erstellen, in dessen Namen sich die Django-Anwendung mit dieser Datenbank verbindet.
Lassen Sie uns eine Datenbank erstellen:
CREATE DATABASE myproject;
Lassen Sie uns einen Benutzer erstellen:
CREATE USER myprojectuser WITH PASSWORD 'password';
Als nächstes richten Sie den Projektbenutzer ein. Es wird UTF8-Codierung verwenden, da diese Codierung auch von Django verwendet wird, und Python empfiehlt, Dateien mit UTF8-Codierung fest zu codieren, insbesondere wenn sie Text enthalten, der auf Site-Seiten angezeigt wird. Die Isolationsstufe in der Datenbank wird ebenfalls festgelegt. Das heißt, wenn Daten zum Lesen verfügbar sind. In diesem Fall nach Bestätigung der Transaktion im allgemeinen Fall. Natürlich gibt es Fälle, in denen Daten vor der Bestätigung verfügbar sind, aber dies ist ein separates Diskussionsthema. Es legt auch den Typ der Zeitzonen fest, der für Django standardmäßig UTC ist.
ALTER ROLE myprojectuser SET client_encoding TO 'utf8'; ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed'; ALTER ROLE myprojectuser SET timezone TO 'UTC';
Als nächstes gewähren wir diesem Benutzer Zugriffsrechte auf die Datenbank:
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
Nun, verlassen wir die PostgreSQL-Konsole.
\q
Wenn Sie Probleme mit Kodierungen auf dem Server haben, wenn der Server über LATIN1-Kodierung verfügt und die Datenbank in UTF8 erstellt werden muss, lesen Sie den nächsten Artikel . /), wo diese Aufgabe gelöst wurde.
Schritt 4 – Einrichten der virtuellen Umgebung
Installieren und aktivieren Sie die virtuelle Umgebung:
pip3 install virtualenv virtualenv ~/myprojectenv source myprojectenv/bin/activate
Schritt 5 – Installieren des PostgreSQL-Treibers
Wir werden den folgenden Befehl installieren
sudo pip install django psycopg2
In der virtuellen Umgebung müssen Sie den Befehl pip verwenden, nicht pip3
Schritt 6 – Erstellen des Projekts
Gehen wir zum Ordner mit der virtuellen Umgebung, wir sollten uns immer noch im virtuellen Umgebungsmodus befinden. Und lassen Sie uns ein Projekt erstellen.
cd ~/myprojectenv django-admin.py startproject myproject
Schritt 7 - Konfigurieren der Datenbankverbindung
Bearbeiten wir nun die Django-Konfigurationsdatei so, dass sie eine Verbindung zur PostgreSQL-Datenbank herstellt, anstatt die SQLite-Datenbank zu erstellen und dann eine Verbindung herzustellen.
nano ~/myproject/myproject/settings.py
Suchen Sie dazu den folgenden Codeabschnitt in der Datei:
... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } ...
Und ersetzen Sie es durch Folgendes, wobei Sie Ihre Daten für die Verbindung mit der Datenbank berücksichtigen:
... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'myproject', 'USER': 'myprojectuser', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '', } } ...
Schritt 8 – Durchführen von Datenbankmigrationen
Django hat einen sehr großen Vorteil - es hat einen eingebauten Admin-Bereich, der das Leben viel einfacher macht. Damit dies jedoch funktioniert, müssen Sie die Datenbank migrieren, dh SQL-Abfragen aus den Datenmodellen vorbereiten, die die Struktur der Datenbank bilden.
cd ~/myproject python manage.py makemigrations python manage.py migrate
Wir werden auch einen Superuser erstellen, der ein Administrator mit maximalen Zugriffsrechten auf Ihre Site ist. Führen Sie den folgenden Befehl aus und befolgen Sie die Anweisungen.
python manage.py createsuperuser
Schritt 9 - Gunicorn installieren
Installieren Sie Gunicorn, das als HTTP-Server für unsere Website fungiert. Installieren Sie es in der virtuellen Umgebung.
sudo pip install django gunicorn
Sie können überprüfen, ob die Site bereits aktiv ist:
gunicorn myproject.wsgi:application --bind 111.222.333.44:8000 # Укажите ваш IP-адрес
Schritt 10 - Statische Dateien konfigurieren
Django stellt standardmäßig nur statische Dateien im Debug-Modus bereit, der auf einem Produktionsserver nicht verwendet wird. Bei einem Produktionsserver werden alle statischen Dateien aus allen Projekten mit dem Befehl collectstatic in einem separaten speziellen Ordner gesammelt, und der Ordner selbst muss in der Datei settings.py angegeben werden.
Lass es uns bearbeiten:
nano ~/myproject/settings.py
Und fügen Sie eine Zeile hinzu, die angibt, wo statische Dateien gesammelt werden sollen.
STATIC_ROOT = '/home/user/myprojectenv/myproject/myproject/static/'
Lassen Sie uns nun alle Statiken in diesem Verzeichnis sammeln:
python manage.py collectstatic
Schritt 11 - Konfigurieren von Nginx
Lassen Sie uns die Nginx-Konfigurationsdatei bearbeiten.
sudo nano /etc/nginx/sites-available/default
Lassen Sie uns den gesamten Inhalt löschen und durch den nächsten ersetzen.
server { listen 80; server_name 111.222.333.44; # здесь прописать или IP-адрес или доменное имя сервера access_log /var/log/nginx/example.log; location /static/ { root /home/user/myprojectenv/myproject/myproject/; expires 30d; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Starten wir Nginx neu.
sudo service nginx restart
Und lass uns Gunicorn laufen lassen
gunicorn myproject.wsgi:application
Danach werden Sie feststellen, dass die Site bereits auf Port 80 verfügbar ist.
Schritt 12 - Supervisor konfigurieren
Damit die Site zu jeder Tageszeit verfügbar ist, muss ein Supervisor konfiguriert werden, der als Dienst im Speicher hängt und überwacht, dass die Site immer funktioniert.
sudo apt-get install supervisor
Für einen stabilen Betrieb von Gunicorn müssen Sie die Konfigurationsdatei erstellen. Es befindet sich neben der Datei, die für unsere Webanwendung gestartet wird.
cd /home/user/myprojectenv/myproject/myproject touch gunicorn.conf.py nano gunicorn.conf.py
Fügen wir die folgenden Konfigurationsinformationen hinzu:
bind = '127.0.0.1:8000' workers = 3 user = "nobody"
Das heißt, wir haben angegeben, an welchen Port wir binden und welcher Benutzer den Prozess startet. Und auch die Anzahl der Arbeitsgänge. In diesem Fall sind es drei davon. Berechnet nach folgender Formel:
Arbeiter = Ncpu + 1
Dann erstellen wir die Konfiguration des Supervisors selbst
cd /etc/supervisor/conf.d/ touch myproject.conf nano myproject.conf
Schreiben wir die folgenden Einstellungen hinein
[program:myproject] command=/home/user/myprojectenv/bin/gunicorn myproject.wsgi:application -c /home/user/myprojectenv/myproject/myproject/gunicorn.conf.py directory=/home/user/myprojectenv/myproject user=nobody autorestart=true redirect_stderr=true
Beginnen wir nun mit dem Supervisor. Es gibt einen Vorbehalt bei der Installation von Supervisor. Es wurde nach der Installation nicht als Dienst gestartet. Daher müssen Sie es zwangsweise zum Start hinzufügen und manuell starten, wenn Sie den Server nicht neu starten möchten.
sudo update-rc.d supervisor enable sudo service supervisor start
Nun, dann können Sie die Konfigurationen aktualisieren, den Status der Site-Anwendung und ihren Neustart überprüfen.
supervisorctl reread supervisorctl update supervisorctl status myproject supervisor restart myproject
Beim Neustart des Servers startet alles automatisch
Notiz
Wenn Sie die Projektdateien geändert haben, müssen Sie gunicorn neu starten. Aktivieren Sie dazu einfach die virtuelle Umgebung und verwenden Sie den Befehl killall
source ~/myprojectenv/bin/activate sudo killall gunicorn
Supervisor startet Gunicorn nach diesem Befehl automatisch, sodass Sie sich keine Sorgen machen müssen, dass der Server für längere Zeit ausfällt. Nicht mehr als ein zweiter Ausfall.
Für
Django
empfehle ich
Timeweb VDS-Server
.
С чем может быть связана ошибка? ставил всё на свою машину, статический ip не покупал.
(myprojectenv) ubuntu@ubuntu:~/myprojectenv/myproject$ gunicorn myproject.wsgi:application --bind мойайпишник:8000
[2017-10-28 11:54:39 +0000] [31426] [INFO] Starting gunicorn 19.7.1
[2017-10-28 11:54:39 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:39 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:40 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:40 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:41 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:41 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:42 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:42 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:43 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:43 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:44 +0000] [31426] [ERROR] Can't connect to ('мойайпишник', 8000)
Этот ваш IP адрес случайно не внешний IP адрес роутера, за которым Вы сидите со своим ПК?
перепробывал все ip, которые нашёл у себя на компе. не подскажите, как найти нужный?
А Вы делали вообще bind на '127.0.0.1:8000'?
По моему sudo здесь лишнее. Разве sudo устанавливает внутри виртуального окружения?
Как ни странно - Да.
Некропост, однако, хотел бы добавить, что в случае с продакшеном, миграции там делать нельзя. (точнее, конечно, можно, но нельзя)
Все миграции необходимо хранить в репозитории.
Твоя правда. Согласен. Свои миграции храню в репозитории. На продакшене только выполняю обновление структуры базы данных, после тестирования на дев сервере конечно (читай локальная машина разработки).
Здравствуйте, подскажите пожалуйста, как исправить:
в Ubuntu 20.04, в каталоге проекта пытаюсь создать вертуальную среду
virtualenv env
вылезает ошибка:
ModuleNotFoundError: No module named 'virtualenv.seed.via_app_data'
Спасибо.
Это может быть и ошибка в вашей версии virtualenv и не совсем верная установка, и косяки в процессе следования туториалу.
Но подобные ошибки вылезали на GitHub в репозитории virtualenv.
Впрочем я сам с таким не сталкивался, так что готового ответа у меня нет.
Установите venv:
после этого можно сделать
virtualenv - устаревший, venv - часть стандартной библиотеки. в Windows - venv ставится вместе с питоном, в убунте, к сожалению, даже куски стандартной библиотеки приходится доставлять руками.
Ок, спасибо, буду пробовать.
Все заработало, немного ругнулся, что лучше:
python3 -m venv .venv
но в итоге все сработало.
Спасибо!
Стави все по статье. Добрался до шага 12 и после него перестал запускатся сервер через gunicorn myproject.wsgi:application. выдает ошибку
", line 1014, in _gcd_import
", line 991, in _find_and_load
", line 973, in _find_and_load_un locked
[ERROR] Exception in worker process
Traceback (most recent call last):
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/wo rkers/base.py", line 119, in init_process
self.load_wsgi()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
self.wsgi = self.app.wsgi()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
return self.load_wsgiapp()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
return util.import_app(self.app_uri)
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/util.py", line 358, in import_app
mod = importlib.import_module(module)
File "/usr/lib/python3.8/importlib/ init .py", line 127, in import _module
return _bootstrap._gcd_import(name[level:], package, level)
File "
File "
File "
ModuleNotFoundError: No module named 'myproject.wsgi'
На что обратить внимание?
После команд запуска supervisor'а
sudo update-rc.d supervisor enable
sudo service supervisor start
нужно ли вообще в виртуальном окружении запускать Gunicorn
я думаю, вам стоит кастовать сюда Евгения - я предпочитаю использовать systemd для запуска и менеджмента сервера
попробуйте призвать его через кнопку ответить
Евгений доброй ночи, можете что-то посоветовать?
привет
тут нужна твоя помощь=)
я в супервизоре - ноль=)
Ошибка в конфиге инжинкса про статику в root последний слеш лишний путь в таком виде получается
День добрый.
А как вы это делаете?
А разве это не миграция? И как тогда быть с вашим утверждением о миграциях:
я имел в виду, что на проде нельзя делать
правильнее было бы сказать, что на проде нельзя создавать миграции. мигрировать БД - без этого, естественно, никак
Всё, теперь понял. Спасибо!
Ещё вопрос: как правильно обновлять кодовую базу, если произошли изменения в ней?
обновлять где?
если на проде -
если вы используете systemd для управления сервером
То есть я правильно понимаю, что на боевом сервере нужно ставить помимо всего ещё и git?
в целом, тут все не просто
в зависимости от способа доставки это может быть k8s, docker, rsync, ansible, git... да хоть wget-ом качать архив с условного гитхаба
и для каждого способа свои способы доставки и развертывания
для начала, если у вас 1 сервер и минимум каких-то особенностей, git pull вполне хватит. И да, для этого нужно, чтобы был git установлен
Ясно. Спасибо за развёрнутый ответ.
Думаю, что мне для моих целей хватит и git. Локально я им пользоваться умею, а вот с удалёнными серверами не сталкивался, только с github, отсюда и вопросы.
Сижу, ковыряюсь с git pull на виртуалке, и ни черта не понимаю.
Как правильно залить проект на удалённый сервер, чтобы он по git pull принимал изменения? Отправить изменения с локальной машины у меня получилось, а вот на git pull ругается:
Всё, разобрался.
В виртуальном окружении ругается на отсутствие pip:
pip ставил вот так:
поскольку easy_install3 почему-то не поставился вместе с setuptools.
в виртуальном окружении не надо использовать sudo
используя sudo вы ставите пакеты глобально. Если у вас один проект на сервере - ок. но если нет, все плюсы от venv-ов идут на смарку.
кстати, советую посмотреть в сторону poetry - на мой взгялд, это проект уже production-ready. пакеты ставятся в несколько потоков, фиксируются не только зависимости, но и зависимости зависимостей. А venv-вы создаются автоматически и не в проекте. может быть не очень удобно, но можно переопределить поведение локально и глобально. в целом, советую
Ага, спасибо, завелось!
Да мне бы хотя бы с основами разобраться, куда уж продвинутые уровни...
На шаге 11 вылезла вот такая ошибка:
Проблема решилась добавлением в settings.py в ALLOWED_HOSTS IP-адреса 10.0.3.15.
После шага 12 сайт вместо стартовой страницы Django показывает: "502 Bad Gateway".
Что не так?
покажите конфиг nginx и ка запускаете gunicorn
Всё по мануалу выше, буква в букву.
Всё по мануалу выше, буква в букву.
нужна твоя помощь=)
Поднял сервис с помощью systemd, вот по этому мануалу: https://habr.com/ru/post/501414/
А почему нельзя? Где можно об этом почитать? Киньте, пожалуйста, в меня ссылкой.
При любых попытках взаимодействовать с супервизаром, выбивает в такую ошибку
Помогите пожалуйста, уже все волосы выдрал
Это на какую команду так отвечает?
Отвечал на все команды после
Исправил таким образом