Olá, estou tentando criar o Bootcamp como uma rede social para pesquisadores na minha universidade. No entanto, devido a algumas restrições, atualmente não posso usar caddy como proxy reverso para implantação. Em vez disso, uso o nginx. Se possível, você pode me dar alguma orientação sobre quais parâmetros preciso especificar para o ambiente de produção. Eu vi o arquivo env.example, mas como o projeto é novo para mim, não sei como tudo se conecta. Estou preso com o seguinte erro
manage.py runworker: error: the following arguments are required: channels
Qualquer ajuda é apreciada.
Oi,
Não estou usando o caddie. Estou usando o gunicorn para todos os meus projetos django.
Você instalou todos os requisitos?
canais> = 2.1.1 # https://github.com/django/channels
canais-redis> = 2.2.1 # https://github.com/django/channels_redis
Você pode verificar via console
$ python -c "import channels"
$ echo $?
0 significa, existe
1 significa que o módulo não existe no sistema
canais está instalado. Eu encontro outro problema agora. Aqui estão meu arquivo docker e .env. Estou tendo problemas com o serviço do trabalhador. Não tenho certeza do que isso faz. Agradeço muito sua ajuda, seu projeto é muito interessante e pode ajudar muitas pessoas na minha universidade se ele entrar em produção.
Aqui está o log de erros.
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]
mudança em seu ambiente
REDIS_URL=redis://127.0.0.1:6379
Você pode me mostrar como configurar o serviço do trabalhador? E por que precisamos disso? Novo neste projeto, não tenho certeza de onde procurar essas informações
uhh, é muito. Isso não é feito em alguns minutos ...
Em primeiro lugar, verifique se você instalou todos os requisitos em seu ambiente de servidor
pip install -U -r requirements/production.txt
Em segundo lugar, seu projeto está trabalhando no local?
Configurar um projeto não é possível sem todos os arquivos. E eu não sou o melhor para configurá-lo. Posso verificar minha configuração e compartilhar, mas NÃO foi testado e aprovado para bootcamp. Talvez você precise de configurações adicionais.
Estou ativando o serviço usando o docker compose. A implantação local funciona bem, mas o production.yml é uma coisa totalmente diferente. Eu envolvo redis, daphne, postgres. Se você tiver um arquivo docker-compose à mão em algum lugar, compartilhe. Obrigado
Obtenha o Outlook para iOS https://aka.ms/o0ukef
De: samazaphikel [email protected]
Enviado: quinta-feira, 17 de outubro de 2019 17h03:30
Para: vitorfs / bootcamp [email protected]
Cc: Tri Minh Pham [email protected] ; Autor [email protected]
Assunto: Re: [vitorfs / bootcamp] Ajuda com a configuração da produção. (# 193)
uhh, é muito. Isso não é feito em alguns minutos ...
Em primeiro lugar, verifique se você instalou todos os requisitos em seu ambiente de servidor
pip install -U -r requisitos / produção.txt
Em segundo lugar, seu projeto está trabalhando no local?
Configurar um projeto não é possível sem todos os arquivos. E eu não sou o melhor para configurá-lo. Posso verificar minha configuração e compartilhar, mas NÃO foi testado e aprovado para bootcamp. Talvez você precise de configurações adicionais.
-
Você está recebendo isso porque é o autor do tópico.
Responda a este e-mail diretamente, vê-lo no GitHub https://github.com/vitorfs/bootcamp/issues/193?email_source=notifications&email_token=ADEK4AB5JEUP5LQ4APTJ6ITQPDOLFA5CNFSM4JB4YOCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBRVI2A#issuecomment-543380584 , ou unsubscribe https://github.com/notifications/unsubscribe- auth / ADEK4ADBCG24WLWIT3IM6OLQPDOLFANCNFSM4JB4YOCA .
No meu caso, IM usando python 3.7.1 na máquina servidor Ubuntu
Versão Python de configuração opcional
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1
Com este comando, python 3.7.1 é minha primeira prioridade
Primeiro, instale o ambiente na máquina
sudo -H pip3 install virtualenv
cd /home/pages
para mudar para a pasta correta
mkdir bootcamp
para criar a pasta do projeto
cd bootcamp/
criar env
virtualenv bootcampenv
Ative seu ambiente
source bootcampenv/bin/activate
instalar gunicorn
pip3 install gunicorn
voltar para o diretório de páginas
cd ..
e criar uma pasta para o projeto bootcamp
django-admin startproject bootcampprojectdir
cd bootcampprojectdir
E instale os requisitos
pip install -U -r requirements/production.txt
Se você usar diferentes bases de dados ou algo assim, inicie a migração e colete dados estáticos
Atualize o firewall para permitir a porta 8000
sudo ufw allow 8000
criar wsgi gunicorn
gunicorn --bind 0.0.0.0:8000 settings.wsgi
criar um soquete de sistema
sudo nano /etc/systemd/system/gunicorn.socket
[Unidade]
Descrição = gunicorn.sock[Soquete]
ListenStream = / run / gunicorn.sock[Instalar]
WantedBy = sockets.target
criar um serviço
sudo nano /etc/systemd/system/gunicorn.service
[Unidade]
Descrição = daemon gunicorn
Requer = gunicorn.socket
Depois de = network.target[Serviço]
Usuário = páginas
Grupo = www-data
WorkingDirectory = / home / pages / bootcampprojectdir / bootcampenv / bin / gunicorn
--access-logfile -
--trabalhadores 3
--bind unix: run / gunicorn.sock
settings.wsgi.application[Instalar]
WantedBy = multi-user.target
habilitar tudo
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
Confira
file /run/gunicorn.sock
Quando você não tem nenhum erro, então está bem
Verifique o status
sudo systemctl status gunicorn.socket
verificar serviço
curl --unix-socket /run/gunicorn.sock localhost
Quando você não vê o código htnl, algo com o gunicorn.service
certifique-se de que o serviço está funcionando
sudo systemctl status gunicorn
Quando estiver tudo bem, a próxima etapa NGinx passa para gunicorn
instalar nginx
sudo apt install nginx
crie um site no nginx
criar um serviço
sudo nano /etc/nginx/sites-available/bootcampproject
servidor {
escute 80;
server_name 99.99.99.99location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/pages/bootcampprojectdir; }
localização / {
incluir proxy_params;
proxy_pass http: // unix : /run/gunicorn.sock;
}
}
salve e copie este arquivo para sites habilitados
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled
e verifique a configuração do nginx
sudo nginx -t
Caso não haja erros, reinicie o nginx
sudo systemctl restart nginx
adicione portas de firewall nginx, mas primeiro exclua a porta 8000 do teste
sudo ufw delete allow 8000
adicionar nginx
sudo ufw allow 'Nginx Full'
Olá @phamminhtris , fico feliz que você esteja usando o projeto e que seja útil para você. Existem duas maneiras principais de implantar o projeto em um ambiente de produção. O primeiro seria usar o Docker, mas tem suas ressalvas e, obviamente, requer uma boa familiaridade com o Docker e docker-compose
. Estou longe de ser um especialista e é por isso que só o uso para desenvolvimento, mas talvez você possa encontrar algo útil aqui .
A outra maneira é implementar o projeto como está, o que é "mais fácil" (ou pelo menos você pode encontrar mais recursos e guias para implantá-lo), apenas lembre-se de carregar seu arquivo .env
com as variáveis necessárias, você pode usar a versão de exemplo incluída para entender como declará-los.
É suficiente apenas usar o gunicorn como o único servidor? Eu vi que alguns dos recursos exigiam um servidor de aplicativos ASGI como o daphne para atender ao tráfego de soquete da web. Por favor corrija-me se eu estiver errado. Obrigado por sua ajuda gentil. Realmente aprecio isso.
Nginx é onde as solicitações da Internet chegam primeiro. Ele pode lidar com eles muito rapidamente e geralmente é configurado para permitir que apenas essas solicitações passem, que realmente precisam chegar ao seu aplicativo da web.
O Gunicorn traduz as solicitações que recebe do Nginx em um formato que seu aplicativo da web pode manipular e garante que seu código seja executado quando necessário.
Cada um pode fazer algo que o outro não pode.
Nginx é um servidor web e proxy reverso. É altamente otimizado para todas as coisas que um servidor web precisa fazer.
Cuide do roteamento do nome de domínio (decide para onde as solicitações devem ir ou se uma resposta de erro é necessária)
Servir arquivos estáticos
Lidar com muitos pedidos que chegam de uma vez
Lidar com clientes lentos
Encaminha solicitações que precisam ser dinâmicas para Gunicorn
Encerrar SSL (https acontece aqui)
Economize recursos de computação (CPU e memória) em comparação com seu código Python
E muito mais, se você configurá-lo para fazer isso (balanceamento de carga, armazenamento em cache, ...)
Gunicorn
Assim que o Nginx decidir, que uma solicitação específica deve ser repassada ao Gunicorn (devido às regras com as quais você o configurou).
O Gunicorn é altamente otimizado e possui muitos recursos convenientes.
Executando um pool de processos / threads de trabalho (executando seu código)
Traduz solicitações vindas do Nginx para serem compatíveis com WSGI
Traduzir as respostas WSGI do seu aplicativo em respostas http adequadas
Na verdade, chama seu código Python quando uma solicitação chega
O Gunicorn pode se comunicar com muitos servidores da web diferentes
Gunicorn é apenas um dos muitos servidores WSGI válidos. Seu aplicativo não se importa com qual você usa, e o Nginx também não se importa.
Eu entendo o acima. No entanto, este projeto é bastante especial em termos de protocolo. Ele serve notificação via websocket e, no meu entendimento, precisaremos de mais do que um gunicorn e nginx regulares para conduzir o aplicativo? Quando executo o docker compose local, noto que / Notifications parece não funcionar. Sei que estou pedindo muito, mas realmente agradeço seu tempo e esforço em me ajudar @samazaphikel. Vou tentar a configuração local (sem docker-compose, docker), basta usar o Ubuntu e ver se funciona. Obrigado a todos
Guia muito útil. Fechando.
Comentários muito úteis
No meu caso, IM usando python 3.7.1 na máquina servidor Ubuntu
Versão Python de configuração opcional
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1
Com este comando, python 3.7.1 é minha primeira prioridade
Primeiro, instale o ambiente na máquina
sudo -H pip3 install virtualenv
cd /home/pages
para mudar para a pasta corretamkdir bootcamp
para criar a pasta do projetocd bootcamp/
criar env
virtualenv bootcampenv
Ative seu ambiente
source bootcampenv/bin/activate
instalar gunicorn
pip3 install gunicorn
voltar para o diretório de páginas
cd ..
e criar uma pasta para o projeto bootcamp
django-admin startproject bootcampprojectdir
cd bootcampprojectdir
E instale os requisitos
pip install -U -r requirements/production.txt
Se você usar diferentes bases de dados ou algo assim, inicie a migração e colete dados estáticos
Atualize o firewall para permitir a porta 8000
sudo ufw allow 8000
criar wsgi gunicorn
gunicorn --bind 0.0.0.0:8000 settings.wsgi
criar um soquete de sistema
sudo nano /etc/systemd/system/gunicorn.socket
criar um serviço
sudo nano /etc/systemd/system/gunicorn.service
habilitar tudo
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
Confira
file /run/gunicorn.sock
Quando você não tem nenhum erro, então está bem
Verifique o status
sudo systemctl status gunicorn.socket
verificar serviço
curl --unix-socket /run/gunicorn.sock localhost
Quando você não vê o código htnl, algo com o gunicorn.service
certifique-se de que o serviço está funcionando
sudo systemctl status gunicorn
Quando estiver tudo bem, a próxima etapa NGinx passa para gunicorn
instalar nginx
sudo apt install nginx
crie um site no nginx
criar um serviço
sudo nano /etc/nginx/sites-available/bootcampproject
salve e copie este arquivo para sites habilitados
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled
e verifique a configuração do nginx
sudo nginx -t
Caso não haja erros, reinicie o nginx
sudo systemctl restart nginx
adicione portas de firewall nginx, mas primeiro exclua a porta 8000 do teste
sudo ufw delete allow 8000
adicionar nginx
sudo ufw allow 'Nginx Full'