--- tags: web,day3 robots: noindex, nofollow lang: pt-br --- # 28 App e Web Server ## 5. Configurando o APP Server Gunicorn O primeiro passo é instalar o gunicorn na venv ```bash ~/.venv/bin/python -m pip install gunicorn ``` **aguarde** Agora vamos testar se o gunicorn consegue servir nosso app Django ```bash cd /app export PYTHONPATH=/app/python-web-api/exemplos/day2/django/ export DJANGO_SETTINGS_MODULE=djblog.settings export BLOG_ENV=production ~/.venv/bin/gunicorn --bind 0.0.0.0:8000 djblog.wsgi ``` ``` [2022-08-04 18:12:23 +0000] [77618] [INFO] Starting gunicorn 20.1.0 [2022-08-04 18:12:23 +0000] [77618] [INFO] Listening at: http://0.0.0.0:8000 (77618) [2022-08-04 18:12:23 +0000] [77618] [INFO] Using worker: sync [2022-08-04 18:12:23 +0000] [77619] [INFO] Booting worker with pid: 77619 ``` Acesse para ver se está tudo funcionando corretamente http://192.168.1.100:8000/ Ok, se funcionou está tudo certo, agora precisamos fazer com que o **gunicorn** execute como um serviço do sistema operacional e para isso usaremos o **systemd** **Ctrl + C** e agora vamos criar um **socket** para o gunicorn. ```bash sudo nano /etc/systemd/system/gunicorn.socket ``` Cole o seguinte conteúdo ```ini [Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock [Install] WantedBy=sockets.target ``` Próximo passo é criar um serviço com nossa app ```bash sudo nano /etc/systemd/system/gunicorn.service ``` cole o seguinte conteúdo > **ATENÇÃO** Substititua `osboxes` pelo usuário da sua VM caso a sua VM tenha um usuário diferente > isto é importante pois este serviço será executado por este usuário. ```ini [Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target [Service] Environment=PYTHONPATH=/app/python-web-api/exemplos/day2/django/ Environment=DJANGO_SETTINGS_MODULE=djblog.settings Environment=BLOG_ENV=production User=osboxes Group=www-data WorkingDirectory=/app ExecStart=/home/osboxes/.venv/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/gunicorn.sock \ djblog.wsgi [Install] WantedBy=multi-user.target ``` Agora vamos ativar os serviços ```bash sudo systemctl start gunicorn.socket sudo systemctl enable gunicorn.socket sudo systemctl status gunicorn.socket sudo systemctl status gunicorn ``` A mansagem deve conter ```bash Active: active (running) ``` Se por acaso não tiver iniciado podemos usar ```bash sudo systemctl daemon-reload sudo systemctl restart gunicorn sudo systemctl status gunicorn ``` O gunicorn está servindo em um **socket** portanto não temos uma porta TCP para acessar como tinhamos antes mas podemos verificar se o socket está ativo com: ```bash ss -l | grep gunicorn ``` ``` u_str LISTEN 0 2048 /run/gunicorn.sock 32549 * 0 ``` Agora precisamos de um proxy que mapeie uma porta HTTP a este socket. ## 6. Configurando o WEB Server NGINX Primeiro apagamos a config default que já vem com o nginx ```bash sudo rm -rf /etc/nginx/sites-enabled/default ``` Agora criamos nossa config: ```bash sudo nano /etc/nginx/sites-available/blog ``` Cole o seguinte conteúdo ```conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { autoindex on; alias /app/static/; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } } ``` Agora ativamos o site no nginx ```bash sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled ``` Verificamos se está tudo certo com a config ```bash sudo nginx -t ``` ``` nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful ``` Reiniciamos ```bash sudo systemctl restart nginx ``` Agora acessamos http://192.168.1.100/ e experimente o /admin.