EDIT: esqueci de mencionar que ambos flutter.example.com
precisam nodejs.example.com
estar disponíveis externamente - como site e serviço de API para um aplicativo móvel, respectivamente.
Edição 2: me sinto um pouco bobo, então vou ler sobre proxies reversos. Obrigado.
Eu tenho uma VM Ubuntu20:04LTE no Azure. Eu tenho dois contêineres, um executando Flutter webapp flutter
e outro executando um servidor NodeJs api
, ambos possuem certificados SSL instalados na máquina host usando Certbot. Ambos os contêineres estão na mesma rede docker padrão chamada bridge
.
Digamos que ambos os contêineres possam ser acessados por meio dos seguintes URLs:
flutter.example.com
com endereço IP local 172.17.0.4
na porta5556
nodejs.example.com
com endereço IP local 172.17.0.2
na porta5000
Quero que meu flutter
contêiner consuma um endpoint api
localmente por meio da rede host sem precisar usar o https://nodejs.example.com/example/endpoint
.
quando entro no meu flutter
contêiner e executo:
curl http://172.17.0.5:5555/status
Recebo uma resposta do api
contêiner, mas quando executo o mesmo comando com https
em vez de http
, recebo o seguinte erro:
OpenSSL/3.3.1: error:0A0000C6:SSL routines::packet length too long
Aqui está meu arquivo conf Nginx paraflutter
server {
server_name flutter.example.com;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://localhost:5556; #whatever port your app runs on
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
root /usr/share/nginx/html;
index index.html index.htm;
#stub_status on;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/flutter.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/flutter.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = flutter.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name flutter.example.com;
return 404; # managed by Certbot
}
Aqui estão meus arquivos conf do Nginx paraapi
server {
server_name nodejs.example.com;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://localhost:5000; #whatever port your app runs on
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
root /usr/share/nginx/html;
index index.html index.htm;
#stub_status on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/nodejs.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/nodejs.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = nodejs.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name nodejs.example.com;
return 404; # managed by Certbot
}
Pesquisei esse problema específico no Google e não consigo fazê-lo funcionar. As solicitações precisam ser feitas por meio do nome de domínio? Isso significa que eles já estão se comunicando localmente porque tenho o Nginx? O que estou perdendo, estou perdido.
https
ehttp
use portas diferentes. Além disso,5555
não é nginx, mas sim acesso direto ao seu backend. Parece que você configurou o nginx como proxy reverso; nesse caso, você terá que usar nomes de host; por exemplo,https://nodejs.example.com/foo/bar
como URL.Se você deseja que as coisas sejam acessíveis apenas localmente, não faz sentido usar o nginx como proxy reverso, nem faz sentido usar https.