Estou tentando tornar dois aplicativos acessíveis em meu servidor LAN (raspberry pi).
- lab_app : este é um aplicativo muito simples, feito com flask de terceiros, usando um banco de dados sqlite3, que resulta em um arquivo dentro da pasta do meu aplicativo. Ele está localizado no caminho
/var/www/lab_app/
e é executado na porta interna 8080 e na porta externa 80.
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080)
- aqi_luftdaten : um aplicativo mais complexo, feito por mim em Django, usando banco de dados postgresql. Ele está localizado no caminho
/var/www/aqi_luftdaten/
e é executado na porta interna 8000 - iniciei-o manualmente por meio do comando:
python manage.py runserver 0.0.0.0:8000
No momento, apenas lab_app
está funcionando e acessível:
Seu servidor web é nginx e seu servidor de aplicativos é uWSGI.
O nginx está configurado desta forma:
existe um arquivo de configuração /var/www/lab_app/lab_app_nginx.conf
que é apontado por um link simbólico do diretório/etc/nginx/conf.d
ln -s /var/www/lab_app/lab_app_nginx.conf /etc/nginx/conf.d/
Seu conteúdo é
server {
listen 80;
server_name localhost;
charset utf-8;
client_max_body_size 75M;
location /static {
root /var/www/lab_app/;
}
location / { try_files $uri @labapp; }
location @labapp {
include uwsgi_params;
uwsgi_pass unix:/var/www/lab_app/lab_app_uwsgi.sock;
}
}
seguindo um tutorial, removi o arquivo de configuração padrão habilitado para sites nginx, para que o diretório /etc/nginx/sites-enabled
seja vazio.
Dentro do diretório /etc/nginx/sites-available/
existe apenas o arquivo padrão /etc/nginx/sites-available/default
.
Seu conteúdo é
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
uWSGI é configurado desta forma:
existe um arquivo /var/www/lab_app/lab_app_uwsgi.ini
com conteúdo:
[uwsgi]
#application's base folder
base = /var/www/lab_app
#python module to import
app = lab_app
module = %(app)
home = %(base)
pythonpath = %(base)
#socket file's location
socket = /var/www/lab_app/%n.sock
#permissions for the socket file
chmod-socket = 666
#the variable that holds a flask application inside the module imported at line #6
callable = app
#location of log files
logto = /var/log/uwsgi/%n.log
Carreguei suas informações no uWSGI usando o comando
bin/uwsgi --ini /var/www/lab_app/lab_app_uwsgi.ini
e então há um arquivo /etc/systemd/system/emperor.uwsgi.service
com conteúdo
[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
ExecStart=/var/www/lab_app/bin/uwsgi --ini /var/www/lab_app/lab_app_uwsgi.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
Este aplicativo funciona bem na minha LAN e pode ser acessado no IP do meu servidor a partir de um navegador de dispositivo externo.
Agora gostaria de expor o aplicativo aqi_luftdaten
na porta externa 80.
Portanto, a primeira coisa que quero fazer é configurar o nginx para este aplicativo.
Então eu criei um arquivo de configuração nginx /var/www/aqi_luftdaten/nginx/aqi_luftdaten_nginx.conf
, com conteúdo
server {
listen 3000;
server_name localhost;
charset utf-8;
client_max_body_size 75M;
location /static/ {
root /var/www/aqi_luftdaten/static/;
}
location / {
proxy_pass http://localhost:8000;
}
}
e vinculou-o simbolicamente ao diretório /etc/nginx/conf.d/
via
ln -s /var/www/aqi_luftdaten/nginx/aqi_luftdaten_nginx.conf /etc/nginx/conf.d/
então reinicie o nginx
/etc/init.d/nginx restart
mas recebo este erro:
[....] Restarting nginx (via systemctl): nginx.serviceJob for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
failed!
e correndo systemctl status nginx.service
eu consigo
nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2024-04-01 12:04:18 BST; 10s ago
Docs: man:nginx(8)
Process: 26704 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 26705 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)
Apr 01 12:04:15 Raspberry100 systemd[1]: Starting A high performance web server and a reverse proxy server...
Apr 01 12:04:15 Raspberry100 nginx[26705]: nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
Apr 01 12:04:16 Raspberry100 nginx[26705]: nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
Apr 01 12:04:16 Raspberry100 nginx[26705]: nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
Apr 01 12:04:17 Raspberry100 nginx[26705]: nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
Apr 01 12:04:17 Raspberry100 nginx[26705]: nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
Apr 01 12:04:18 Raspberry100 nginx[26705]: nginx: [emerg] still could not bind()
Apr 01 12:04:18 Raspberry100 systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Apr 01 12:04:18 Raspberry100 systemd[1]: nginx.service: Failed with result 'exit-code'.
Apr 01 12:04:18 Raspberry100 systemd[1]: Failed to start A high performance web server and a reverse proxy server.
Parece que a porta 8000 já está em uso, mas não entendo o porquê, pois a outra aplicação está exposta nas portas 8080:80
Na verdade, o problema era o fato de o aplicativo aqi_luftdaten ter sido iniciado manualmente e executado na porta 8000, então o nginx encontrou essa porta já em uso.
Resolvi o problema parando a execução do servidor com ctrl+C e executando novamente
e desta vez eu recebo
Se eu tentar acessar o aplicativo aqi_luftdaten no navegador de outro dispositivo,
http://<raspberrypi_IP>:3000/
obtenho sucessopois o uWSGI ainda não está configurado.