Implantação de aplicativo Django da prática de implantação em contêiner (2)

No artigo anterior, alguns alunos sentiram que era difícil entender sem detalhes, deixe-me explicar brevemente.

No caso do nosso desenvolvimento:
    solicitação do navegador → python manage.py runserver (como 8000) → para o código do aplicativo (Django, Flask, etc.)

Implementado online:
    solicitação de nome de domínio → resolução de DNS → IP do servidor → Nginx (porta 80) → encaminhamento de proxy 127.0.0.1: 8000 (IP não é necessariamente 127.0.0.1) → lógica do código do aplicativo para o projeto.

Durante todo o processo de implantação, adicionamos uma camada de docker para implantação isolada, que não só resolveu a inconsistência de vários ambientes em desenvolvimento (dev) teste (teste) online (prod), mas também atingiu o objetivo de empacotar uma vez e rodar em todos os lugares. , Não precisamos usar o virtualenv para isolamento do ambiente de pacote Python todos os dias, o que é muito conveniente no modo de desenvolvimento multijogador.

Na verdade, eu já falei sobre a prática de implantação em contêiner do Docker no capítulo de introdução do docker - get started . Quanto ao novato, se você sentir que não é fácil começar no início, você pode considerar remover o link intermediário do docker e executar o serviço diretamente na máquina Linux.

Depois de explicar o acima, vamos passar ao nosso tópico de hoje:
Implantação de Django + Nginx + Gunicorn

Gunicorn

Gunicorn é "Green Unicorn". Ele veio originalmente do Unicorn na comunidade Ruby. É um servidor Python WSGI HTTP para Unix. Gunicorn é amplamente compatível com vários frameworks da web e é simples e leve.

O motivo pelo qual usamos uWSGI ou Gunicorn é o Flask. O desempenho do serviço WSGI integrado do Django não é bom o suficiente. Geralmente é usado em ambientes de teste e desenvolvimento, e o serviço WSGI de alto desempenho é usado principalmente online.

Como introdução, cito um exemplo oficial:

$ pip install gunicorn 
  $ cat myapp.py 
    def app ( amb , start_response): 
        data = b "Olá, mundo! \ n" 
        start_response ("200 OK", [ 
            ("Content-Type", "text / plain"), 
            ("Content-Length", str (len (data))) 
        ]) 
        return iter ([data]) 
  $ gunicorn -w 4 myapp: app 
  [2014-09-10 10:22:28 +0000] [30869] [ INFO] Ouvindo em: http://127.0.0.1:8000 (30869) 
  [2014-09-10 10:22:28 +0000] [30869] [INFO] Usando trabalhador: sincronizar 
  [2014-09-10 10:22 : 28 +0000] [30874] [INFO] Booting worker com pid: 30874 
  [2014-09-10 10:22:28 +0000] [30875] [INFO] Booting worker com pid: 30875
  [2014-09-10 10:22:28 +0000] [30876] [INFO] Booting worker com pid: 30876
  [2014-09-10 10:22:28 +0000] [30877] [INFO] Inicializando trabalhador com pid: 30877

Após a instalação do gunicorn, podemos gunicorn -h ver a configuração. Normalmente, por conveniência, sempre colocamos o gunicorn no arquivo de configuração.

Uma coisa a mencionar aqui é que há um --statsd-host no gunicorn que torna possível rastrear solicitações de outra maneira. Eu mencionei o statsd no artigo de monitoramento anterior. Você pode consultar meu blog anterior "Construindo um sistema de monitoramento da web usando Statsd + Graphite + Grafana" , Clique para ler o texto original.

Como uWSGI, dou um exemplo de supervisor simples:

# gunicorn.conf.py 
import multiprocessing 
import socket 
bind = '0.0.0.0:9527' 
workers = multiprocessing.cpu_count () * 2 + 1  
worker_class = 'gevent' # 搭配 gevent 运行
daemon = False 
proc_name = 'yourproject' 
pidfile = ' /data/run/gunicorn.pid ' 
loglevel =' error ' 
accesslog =' /data/yourproject/supervisor/gunicorn.access.log ' 
errorlog =' /data/yourproject/supervisor/gunicorn.error.log ' 
max_requests = 200000 
# StatsD integration 
# StatsD host é omitido aqui, anexe `--statsd-host` a gunicorn 
# statsd_host = 'localhost: 8125' 
statsd_prefix = socket.gethostname ()

O motivo mencionado acima é porque o número de trabalhadores é o número de núcleos de CPU * 2 + 1. Não há muita base científica para isso. Baseia-se principalmente nas operações de leitura e gravação de um trabalho e no processamento de solicitações por outro trabalho. Você pode configurá-lo de acordo com sua própria situação. Para configurações mais especiais, você mesmo pode consultar os documentos.

supervisor & nginx & docker-compose

O supervisor é o mesmo que a implantação do aplicativo Django usando a prática de implantação em contêiner Docker (1) no artigo anterior . A única mudança é que nosso comando foi alterado de uUWSGI para gunicorn. Não listarei a configuração completa do supervisor aqui.

[programa: gunicorn] 
command = / path / to / gunicorn main: application -c /path/to/gunicorn.conf.py 
diretório = / path / to / project 
user = ninguém 
autostart = true 
autorestart = true 
redirect_stderr = true

Nginx é igual ao artigo anterior. Aqui está um exemplo simples:

  servidor { 
    escuta 80; 
    server_name example.org; 
    access_log /var/log/nginx/example.log; 
    localização / { 
        proxy_pass http://127.0.0.1:8000; 
        proxy_set_header Host $ host; 
        proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; 
    } 
  }

A configuração docker-compose é a mesma do artigo anterior e há mais conteúdo, portanto, não será listado. Você pode consultar o artigo anterior para a configuração da implantação do aplicativo Django (1) usando as práticas de implantação em contêiner Docker .

No fim

Hoje elaboramos principalmente o segundo método de implantação do Django. Na verdade, esse processo é quase o mesmo que sem o docker. Você pode retirar o docker, o que não terá muito impacto em todo o processo.

Da mesma forma, todo o processo de minha implantação é relativamente simples, mas a situação real será um pouco diferente, será que você entendeu? Bem-vindos a todos para me deixarem uma mensagem e discutiremos juntos.


A implantação em contêiner do Docker está relacionada ao nosso próximo artigo, falaremos sobre o grande assassino dos Kubernets.


Acho que você gosta

Origin blog.51cto.com/15009257/2552385
Recomendado
Clasificación