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
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