Skip to content

Instantly share code, notes, and snippets.

@mau21mau
Last active May 22, 2019 00:40
Show Gist options
  • Save mau21mau/59c7f373d4248104b257 to your computer and use it in GitHub Desktop.
Save mau21mau/59c7f373d4248104b257 to your computer and use it in GitHub Desktop.
Webserver: Django com uWSGi e Nginx no Ubuntu >= 12.04

Webserver: Django com uWSGi e Nginx no Ubuntu >= 12.04

OBS.: A pasta onde os projetos django serão hospedadas nesse tutorial é /home/sysadmin/webapps/. Por isso, criando a pasta:

cd /home/sysadmin/
mkdir webapps

O tutorial considera que seus projetos Django se encontrem dentro de webapps na seguinte estrutura (Django==1.7.1):

meuprojeto

meuprojeto
├── app1
│   ├── admin.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── app2
│   ├── admin.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── meuprojeto
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

###1 - Instale os softwares necessários (mysql é opcional): sudo apt-get install nginx

sudo apt-get install mysql-server

sudo apt-get install python-pip python-dev build-essential

sudo pip install --upgrade pip

sudo pip install virtualenvwrapper

sudo pip install uwsgi

OBS: Para instalar o Python-mysql via pip posteriormente, alguns módulos devem ser instalados no ubuntu. Para tal execute o comando a seguir:

sudo apt-get install build-essential python-dev libmysqlclient-dev

Configurar o virtualenvwrapper: adicione as seguintes linhas ao final do arquivo ~/.bashrc, da seguinte forma:

sudo nano ~/.bashrc

Copie as 3 linhas abaixo, vá no terminal, posicione o cursor no fim do arquivo ~/.bashrc clique com o botão direito e vá em colar (ou ctrl+shift+v)

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh

Depois de colar as linhas pressione ctrl+o e de enter para salvar o arquivo. Depois ctrl+x para fechar.

Depois execute o comando source ~/.bashrc para recarregar o arquivo na memória.

Crie um virtualenv para o seu projeto através do comando:

mkvirtualenv meuprojeto

Configurar o uWSGI:

cd /etc/

sudo mkdir uwsgi

cd uwsgi

sudo mkdir vassals

cd vassals

sudo mkdir available

sudo mkdir enabled

cd /var/log/

sudo mkdir uwsgi

Edite o arquivo /etc/init/uwsgi.conf:

sudo nano /etc/init/uwsgi.conf

Cole as seguintes linhas no arquivo:

description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals/enabled --uid www-data --gid www-data --master

Ctrl+o pra salvar. Ctrl+x pra fechar.

####Arquivos de configuração para o Nginx e para o Uwsgi

Nginx: Crie um arquivo contendo o conteúdo abaixo descrito (substituindo as informações do projeto). Salve esse arquivo em /etc/nginx/sites-available/

Para criar esse arquivo via linha de comando faça o seguinte:

sudo nano /etc/nginx/sites-available/meuprojeto.com.br

Um arquivo vazio será aberto. Copie o conteúdo abaixo e cole dentro do terminal. Pressione Ctrl+o para salvar e Ctrl+x para fechar.

Conteúdo do arquivo:

upstream meuprojeto {
    #server 127.0.0.1:8001;
    server unix:///tmp/meuprojeto.sock;
}
server {
    listen 80;
    server_name meuprojeto.com.br; # Dominio do projeto
    client_max_body_size 20M;
    
    error_log /var/log/nginx/error_meuprojeto;
    access_log /var/log/nginx/access_meuprojeto;

    location /media {
        autoindex    on;
        alias /home/sysadmin/webapps/meuprojeto/meuprojeto/media; # your Django project's media files
    }
    location /static {
        autoindex    on;
        alias /home/sysadmin/webapps/meuprojeto/meuprojeto/static; # your Django project's media files
    }
    location / {
        uwsgi_pass  meuprojeto;
        include     /etc/nginx/uwsgi_params; # or the uwsgi_params you installed manually
    }
}

uWSGI: Crie um arquivo contendo o conteúdo abaixo descrito (substituindo as informações do projeto). Salve esse arquivo em /etc/uwsgi/vassals/available/

Para criar esse arquivo via linha de comando faça o seguinte:

sudo nano /etc/uwsgi/vassals/available/meuprojeto.ini

Um arquivo vazio será aberto. Copie o conteúdo abaixo e cole dentro do terminal. Pressione Ctrl+o para salvar e Ctrl+x para fechar.

Conteúdo do arquivo:

[uwsgi]

# caminho para o virtualenv no qual o projeto ira rodar
home = /home/sysadmin/.virtualenvs/meuprojeto

# socket gerado no momento da inicializacao do uwsgi. Pode ser um servidor ou arquivo.sock.
# o socket estabelece a ponte de comunicacao entre as requisicoes que chegam no nginx/apache
# e as trasnfere para o projeto django especificado o projeto especificado no chdir
# neste caso esta sendo usado socket em arquivo
#socket = 127.0.0.1:8001
socket = /tmp/meuprojeto.sock

uid = www-data
gid = www-data
cpu-affinity = 1
workers=4
chmod-socket = 770
chown-socket = www-data:www-data
buffer-size=32768
# Esta a pasta do projeto
chdir = /home/sysadmin/webapps/meuprojeto

logto = /var/log/uwsgi/meuprojeto.com.br.log
logger = file:/var/log/uwsgi/meuprojeto.com.br.log

# Carrega o arquivo de inicializacao do projeto, onde "meuprojeto" é a pasta e "wsgi"
# e o nome do arquivo wsgi.py contido dentro da pasta "meuprojeto"
module = meuprojeto.wsgi

Lá em cima, criamos as pastas /etc/uwsgi/vassals/available/ e /etc/uwsgi/vassals/enabled/porque o uwsgi não as cria quando instalado. Na verdade essa estrutura é opcional, mas eu adotei esse padrão. Ao contrário do uwsgi, o Nginx cria as pastas /etc/nginx/sites-available/ e /etc/nginx/sites-enabled/.

Entenda que as pastas available são usadas para manter os arquivos de configuração dos projetos (esta pasta não é mapeada), enquanto as pastas enabled irão conter os arquivos que serão executados (esta pasta é mapeada). Para não ter de ficar excluindo o arquivo de configuração de dentro de enabled toda vez que um site for desativado e copiá-lo novamente toda vez que ativado, cria-se um link simbólico dentro de enabled, apontando para o arquivo que está em available. E desativa-se o link quando o site for desativado.

Perceba que quando falo que a pasta é mapeada, me refiro ao seguinte:

Se você abrir o arquivo /etc/nginx/nginx.conf verá que tem a seguinte linha:include /etc/nginx/sites-enabled/*;. Isso significa que o Nginx irá mapear todos os arquivos dentro deste diretório.

Lembra que lá em cima na configuração do uWSGI criamos um (/etc/init/uwsgi.conf) arquivo com a seguinte linha?

exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals/enabled --uid www-data --gid www-data --master

Perceba o parâmetro --emperor /etc/uwsgi/vassals/enabled. Ele informa para o uWSGI mapear todos os arquivos que estiverem dentro desta pasta.

Finalmente, sabendo a razão pela qual utiliza-se os links, vamos criá-los:

sudo ln -s /etc/nginx/sites-available/meuprojeto.com.br /etc/nginx/sites-enabled/

sudo ln -s /etc/uwsgi/vassals/available/meuprojeto.ini /etc/uwsgi/vassals/enabled/

###2 - Por questões de segurança, o projeto deverá rodar com usuário www-data.

###3 - Adicione os usuários www-data e o seu usuario ao grupo www-data http://askubuntu.com/questions/79565/add-user-to-existing-group

sudo usermod -a -G www-data <usuario>

sudo usermod -a -G www-data www-data

###4 - Adicione as seguintes pastas ao grupo www-data: cd /var/log/

sudo chgrp -R www-data uwsgi/

sudo chgrp -R www-data nginx/

cd /etc/

sudo chgrp -R www-data uwsgi/

sudo chgrp -R www-data nginx/

cd ~/webapps/

sudo chgrp -R www-data meuprojeto/

###5 - De permissões de leitura, escrita e exec. ao proprietário e grupo (770) para as pastas:

cd /var/log/

sudo chmod 770 -R uwsgi

sudo chmod 770 -R nginx

cd /etc/

sudo chmod 770 -R nginx/

sudo chmod 770 -R uwsgi/

cd ~/webapps/

sudo chmod 770 -R meuprojeto/

####Reinicie os serviços

sudo service nginx restart

sudo service uwsgi restart

###REINICIE O SISTEMA

sudo reboot now

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment