Hallo, ich versuche Bootcamp als soziales Netzwerk für Forscher an meiner Universität aufzubauen. Aufgrund einiger Einschränkungen kann ich Caddy derzeit jedoch nicht als Reverse-Proxy für die Bereitstellung verwenden. Stattdessen verwende ich nginx. Können Sie mir, falls möglich, eine Anleitung geben, welche Parameter ich für die Produktionsumgebung angeben muss. Ich habe die Datei env.example gesehen, aber da das Projekt neu für mich ist, weiß ich nicht, wie alles miteinander verbunden ist. Ich hänge mit folgendem Fehler fest
manage.py runworker: error: the following arguments are required: channels
Jede Hilfe wird geschätzt.
Hi,
Ich benutze keinen Caddy. Ich verwende Gunicorn für alle meine Django-Projekte.
Hast du alle Voraussetzungen installiert?
Kanäle>=2.1.1 # https://github.com/django/channels
channel-redis>=2.2.1 # https://github.com/django/channels_redis
Sie können über die Konsole überprüfen
$ python -c "import channels"
$ echo $?
0 bedeutet, existiert
1 bedeutet, Modul existiert nicht im System
Kanäle installiert ist. Ich stoße jetzt auf ein anderes Problem. Hier sind meine Docker-Datei und .env. Ich habe ein Problem mit dem Arbeiterservice. Nicht sicher, was es tut. Ich weiß Ihre Hilfe wirklich zu schätzen, Ihr Projekt ist sehr interessant und kann vielen Menschen an meiner Universität helfen, wenn es in Produktion geht.
Hier ist das Fehlerprotokoll.
worker_1 | /usr/local/lib/python3.6/site-packages/daphne/server.py:13: UserWarning: Something has already installed a non-asyncio Twisted reactor. Attempting to uninstall it; you can fix this warning by importing daphne.server early in your codebase or finding the package that imports Twisted and importing it later on.
worker_1 | UserWarning,
django_1 | DEBUG 2019-10-17 21:28:37,751 base 1 140450066271560 Configuring Raven for host: https://sentry.io
worker_1 | DEBUG 2019-10-17 21:28:35,663 base 1 140638836505928 Configuring Raven for host: https://sentry.io
worker_1 | Running worker for channels ['channels', 'notifications']
worker_1 | DEBUG 2019-10-17 21:28:36,297 base 1 140638836505928 Sending message of length 5534 to https://sentry.io/api/1782977/store/
worker_1 | Traceback (most recent call last):
worker_1 | File "manage.py", line 30, in <module>
worker_1 | execute_from_command_line(sys.argv)
worker_1 | File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
worker_1 | utility.execute()
worker_1 | File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
worker_1 | self.fetch_command(subcommand).run_from_argv(self.argv)
worker_1 | File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv
worker_1 | self.execute(*args, **cmd_options)
worker_1 | File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute
worker_1 | output = self.handle(*args, **options)
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels/management/commands/runworker.py", line 46, in handle
worker_1 | worker.run()
worker_1 | File "/usr/local/lib/python3.6/site-packages/asgiref/server.py", line 60, in run
worker_1 | event_loop.run_until_complete(self.handle())
worker_1 | File "/usr/local/lib/python3.6/asyncio/base_events.py", line 484, in run_until_complete
worker_1 | return future.result()
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 30, in handle
worker_1 | [listener.result() for listener in listeners]
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 30, in <listcomp>
worker_1 | [listener.result() for listener in listeners]
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 37, in listener
worker_1 | message = await self.channel_layer.receive(channel)
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 461, in receive
worker_1 | return (await self.receive_single(channel))[1]
änderung in deiner umgebung
REDIS_URL=redis://127.0.0.1:6379
Können Sie mir zeigen, wie der Worker-Dienst konfiguriert wird? Und warum brauchen wir es? Neu in diesem Projekt, also nicht sicher, wo Sie nach diesen Informationen suchen sollen
äh, es ist viel. Das ist nicht in einigen Minuten erledigt...
Bitte prüfen Sie zunächst, ob Sie alle Voraussetzungen in Ihrer Serverumgebung installiert haben
pip install -U -r requirements/production.txt
Zweitens arbeitet Ihr Projekt auf lokaler Ebene?
Das Konfigurieren eines Projekts ist ohne alle Dateien nicht möglich. Und ich bin nicht der Beste, um es zu konfigurieren. Ich kann meine Konfiguration überprüfen und freigeben, aber dies ist NICHT für das Bootcamp getestet und freigegeben. Möglicherweise benötigen Sie zusätzliche Einstellungen.
Ich starte den Dienst mit Docker Compose. Die lokale Bereitstellung funktioniert gut, aber production.yml ist eine ganz andere Sache. Ich beziehe Redis, Daphne, Postgres ein. Wenn Sie irgendwo eine Docker-Compose-Datei zur Hand haben, teilen Sie diese bitte mit. Vielen Dank
Holen Sie sich Outlook für iOS https://aka.ms/o0ukef
Von: samazaphikel [email protected]
Gesendet: Donnerstag, 17. Oktober 2019 17:30 Uhr
An: vitorfs / bootcamp [email protected]
Cc: Tri Minh Pham [email protected] ; Autor [email protected]
Betreff: Re: [vitorfs/bootcamp] Hilfe beim Einrichten der Produktion. (#193)
äh, es ist viel. Das ist nicht in einigen Minuten erledigt...
Bitte prüfen Sie zunächst, ob Sie alle Voraussetzungen in Ihrer Serverumgebung installiert haben
pip install -U -r requirements/production.txt
Zweitens arbeitet Ihr Projekt auf lokaler Ebene?
Das Konfigurieren eines Projekts ist ohne alle Dateien nicht möglich. Und ich bin nicht der Beste, um es zu konfigurieren. Ich kann meine Konfiguration überprüfen und freigeben, aber dies ist NICHT für das Bootcamp getestet und freigegeben. Möglicherweise benötigen Sie zusätzliche Einstellungen.
—
Sie erhalten dies, weil Sie den Thread verfasst haben.
Antworten Sie auf diese E - Mail direkt, sehen sie auf GitHub https://github.com/vitorfs/bootcamp/issues/193?email_source=notifications&email_token=ADEK4AB5JEUP5LQ4APTJ6ITQPDOLFA5CNFSM4JB4YOCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBRVI2A#issuecomment-543380584 oder abmelden https://github.com/notifications/unsubscribe- auth/ADEK4ADBCG24WLWIT3IM6OLQPDOLFANCNFSM4JB4YOCA .
In meinem Fall verwende ich Python 3.7.1 auf einem Ubuntu-Server-Rechner
Optionale Setup-Python-Version
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1
Bei diesem Befehl hat Python 3.7.1 meine erste Priorität
Installieren Sie zuerst die Umgebung auf dem Computer
sudo -H pip3 install virtualenv
cd /home/pages
um in den richtigen Ordner zu wechseln
mkdir bootcamp
um den Projektordner zu erstellen
cd bootcamp/
env erstellen
virtualenv bootcampenv
Aktivieren Sie Ihre Umgebung
source bootcampenv/bin/activate
installl gunicorn
pip3 install gunicorn
gehe zurück zum Seitenverzeichnis
cd ..
und erstelle einen Ordner für das Bootcamp-Projekt
django-admin startproject bootcampprojectdir
cd bootcampprojectdir
Und installieren Sie die Anforderungen
pip install -U -r requirements/production.txt
Wenn Sie verschiedene Datenbanken oder ähnliches verwenden, starten Sie die Migration und sammeln Sie statische
Firewall aktualisieren, um Port 8000 . zuzulassen
sudo ufw allow 8000
erstelle gunicorn wsgi
gunicorn --bind 0.0.0.0:8000 settings.wsgi
einen System-Socket erstellen
sudo nano /etc/systemd/system/gunicorn.socket
[Einheit]
Description=gunicorn.sock[Steckdose]
ListenStream=/run/gunicorn.sock[Installieren]
WantedBy=sockets.target
einen Dienst erstellen
sudo nano /etc/systemd/system/gunicorn.service
[Einheit]
Description=gunicorn daemon
Benötigt=gunicorn.socket
After=network.target[Service]
Benutzer=Seiten
Gruppe=www-daten
WorkingDirectory=/home/pages/bootcampprojectdir/bootcampenv/bin/gunicorn
--access-logfile -
--Arbeiter 3
--bind unix:run/gunicorn.sock
settings.wsgi.application[Installieren]
WantedBy=multi-user.target
alles aktivieren
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
prüfen Sie
file /run/gunicorn.sock
Wenn Sie keinen Fehler haben, ist es in Ordnung
Status überprüfen
sudo systemctl status gunicorn.socket
Service prüfen
curl --unix-socket /run/gunicorn.sock localhost
Wenn Sie keinen HTML-Code sehen, etwas mit dem gunicorn.service
Stellen Sie sicher, dass der Dienst ausgeführt wird
sudo systemctl status gunicorn
Wann ist alles in Ordnung, nächster Schritt NGinx übergeben an gunicorn
nginx installieren
sudo apt install nginx
Erstellen Sie eine Site in nginx
einen Dienst erstellen
sudo nano /etc/nginx/sites-available/bootcampproject
Server {
hören 80;
Servername 99.99.99.99location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/pages/bootcampprojectdir; }
Lage / {
schließe proxy_params ein;
proxy_pass http://unix :/run/gunicorn.sock;
}
}
Speichern und kopieren Sie diese Datei auf Sites-enabled
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled
und prüfe das nginx-Setup
sudo nginx -t
Wenn keine Fehler auftreten, starten Sie nginx neu
sudo systemctl restart nginx
nginx-Firewall-Ports hinzufügen, aber zuerst den Port 8000 aus dem Test löschen
sudo ufw delete allow 8000
nginx hinzufügen
sudo ufw allow 'Nginx Full'
Hallo @phamminhtris Ich freue mich, dass Sie das Projekt verwenden und es nützlich finden. Es gibt zwei Hauptmethoden zum Bereitstellen des Projekts in einer Produktionsumgebung. Der erste würde Docker verwenden, aber es hat seine Vorbehalte und erfordert offensichtlich eine gewisse Vertrautheit mit Docker und docker-compose
. Ich bin alles andere als ein Experte und benutze es deshalb nur für die Entwicklung, aber vielleicht findest du hier etwas nützliches .
Die andere Möglichkeit besteht darin, das Projekt so zu implementieren, wie es ist, was "einfacher" ist (oder Sie können zumindest mehr Ressourcen und Anleitungen finden, um es bereitzustellen). Denken Sie nur daran, Ihre .env
Datei mit den erforderlichen Variablen zu laden. Sie können die mitgelieferte Beispielversion verwenden, um zu verstehen, wie sie deklariert werden.
Reicht es, nur Gunicorn als einzigen Server zu verwenden? Ich habe gesehen, dass einige der Funktionen einen ASGI-Anwendungsserver wie daphne benötigen, um Web-Socket-Verkehr zu bedienen. Bitte korrigiert mich, wenn ich falsch liege. Vielen Dank für Ihre freundliche Hilfe. Schätze das wirklich.
Bei Nginx kommen zuerst Anfragen aus dem Internet an. Es kann diese sehr schnell verarbeiten und ist normalerweise so konfiguriert, dass nur die Anfragen durchgelassen werden, die wirklich bei Ihrer Webanwendung ankommen müssen.
Gunicorn übersetzt Anfragen, die es von Nginx erhält, in ein Format, das Ihre Webanwendung verarbeiten kann, und stellt sicher, dass Ihr Code bei Bedarf ausgeführt wird.
Jeder kann etwas tun, was der andere nicht kann.
Nginx ist ein Webserver und Reverse-Proxy. Es ist hochgradig optimiert für all die Dinge, die ein Webserver tun muss.
Kümmere dich um das Domainnamen-Routing (entscheidet, wohin Anfragen gehen sollen oder ob eine Fehlerantwort in Ordnung ist)
Statische Dateien bereitstellen
Bearbeiten Sie viele eingehende Anfragen gleichzeitig
Umgang mit langsamen Clients
Leitet Anfragen, die dynamisch sein müssen, an Gunicorn weiter
SSL beenden (https passiert hier)
Sparen Sie Rechenressourcen (CPU und Speicher) im Vergleich zu Ihrem Python-Code
Und vieles mehr, wenn Sie es entsprechend konfigurieren (Load-Balancing, Caching, …)
Gunicorn
Sobald Nginx entscheidet, dass eine bestimmte Anfrage an Gunicorn weitergeleitet werden soll (aufgrund der von Ihnen konfigurierten Regeln).
Gunicorn ist hochgradig optimiert und verfügt über viele praktische Funktionen.
Ausführen eines Pools von Workerprozessen/Threads (Ausführen Ihres Codes!)
Übersetzt Anfragen, die von Nginx eingehen, um WSGI-kompatibel zu sein
Übersetzen Sie die WSGI-Antworten Ihrer App in die richtigen http-Antworten
Ruft tatsächlich Ihren Python-Code auf, wenn eine Anfrage eingeht
Gunicorn kann mit vielen verschiedenen Webservern kommunizieren
Gunicorn ist nur einer von vielen gültigen WSGI-Servern. Es ist Ihrer App egal, welche Sie verwenden, und Nginx ist es auch egal.
Ich verstehe das obige. Allerdings ist dieses Projekt protokollmäßig etwas ganz Besonderes. Es dient zur Benachrichtigung über Websocket und meines Wissens benötigen wir mehr als ein normales Gunicorn und Nginx, um die App zu steuern? Wenn ich das lokale Docker Compose ausführe, stelle ich fest, dass /notifications nicht zu funktionieren scheint. Ich weiß, dass ich viel verlange, aber ich weiß deine Zeit und Mühe wirklich zu schätzen, mir @samazaphikel zu helfen. Werde die lokale Konfiguration (kein docker-compose, docker) ausprobieren, einfach Ubuntu entlarven und sehen, ob das funktioniert. Danke euch allen
Sehr hilfreiche Anleitung. Schließen.
Hilfreichster Kommentar
In meinem Fall verwende ich Python 3.7.1 auf einem Ubuntu-Server-Rechner
Optionale Setup-Python-Version
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1
Bei diesem Befehl hat Python 3.7.1 meine erste Priorität
Installieren Sie zuerst die Umgebung auf dem Computer
sudo -H pip3 install virtualenv
cd /home/pages
um in den richtigen Ordner zu wechselnmkdir bootcamp
um den Projektordner zu erstellencd bootcamp/
env erstellen
virtualenv bootcampenv
Aktivieren Sie Ihre Umgebung
source bootcampenv/bin/activate
installl gunicorn
pip3 install gunicorn
gehe zurück zum Seitenverzeichnis
cd ..
und erstelle einen Ordner für das Bootcamp-Projekt
django-admin startproject bootcampprojectdir
cd bootcampprojectdir
Und installieren Sie die Anforderungen
pip install -U -r requirements/production.txt
Wenn Sie verschiedene Datenbanken oder ähnliches verwenden, starten Sie die Migration und sammeln Sie statische
Firewall aktualisieren, um Port 8000 . zuzulassen
sudo ufw allow 8000
erstelle gunicorn wsgi
gunicorn --bind 0.0.0.0:8000 settings.wsgi
einen System-Socket erstellen
sudo nano /etc/systemd/system/gunicorn.socket
einen Dienst erstellen
sudo nano /etc/systemd/system/gunicorn.service
alles aktivieren
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
prüfen Sie
file /run/gunicorn.sock
Wenn Sie keinen Fehler haben, ist es in Ordnung
Status überprüfen
sudo systemctl status gunicorn.socket
Service prüfen
curl --unix-socket /run/gunicorn.sock localhost
Wenn Sie keinen HTML-Code sehen, etwas mit dem gunicorn.service
Stellen Sie sicher, dass der Dienst ausgeführt wird
sudo systemctl status gunicorn
Wann ist alles in Ordnung, nächster Schritt NGinx übergeben an gunicorn
nginx installieren
sudo apt install nginx
Erstellen Sie eine Site in nginx
einen Dienst erstellen
sudo nano /etc/nginx/sites-available/bootcampproject
Speichern und kopieren Sie diese Datei auf Sites-enabled
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled
und prüfe das nginx-Setup
sudo nginx -t
Wenn keine Fehler auftreten, starten Sie nginx neu
sudo systemctl restart nginx
nginx-Firewall-Ports hinzufügen, aber zuerst den Port 8000 aus dem Test löschen
sudo ufw delete allow 8000
nginx hinzufügen
sudo ufw allow 'Nginx Full'