Posso executar dois aplicativos de servidor na porta 80?

6

Atualmente, estou executando o nginx na porta 80, com os nomes de servidor configurados como example.com e www.example.com .

Eu também tenho um aplicativo Flask que eu gostaria de ter acessível através da porta 80, mas usando o hostname app.example.com .

Como o nginx já está usando a porta 80, como exatamente eu rotearia as solicitações app.example.com para o aplicativo Flask?

Observe que o servidor tem apenas um endereço IPv4.

    
por Mark 03.04.2013 / 09:02

2 respostas

4

Deve ser bastante fácil.

Certifique-se de que o próprio Flask esteja sendo executado em uma porta diferente de 80.

Em seguida, use NginX como um proxy reverso (e servidor da Web) para manipular, um subdomínio para app.example.com e, em segundo lugar, manipule isso como um proxy para localhost: 8080 (ou onde quer que seu aplicativo de balão esteja vinculado).

upstream flask  {
      server 127.0.0.1:8080; #Flask
}

server {
    listen       YOUR_PUBLIC_IP:80;
    server_name  app.example.com;

location / {
     proxy_pass  http://flask;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }

}

Você pode ter muitos blocos {} do servidor, todos na porta 80, desde que server_name varie e usá-los como o Apache VirtualHosts.

    
por 03.04.2013 / 09:28
1

Não é uma boa idéia veicular diretamente o aplicativo na porta 80. É muito melhor ter um servidor HTTP padrão escutando na porta 80 e encaminhando solicitações para o servidor WSGI do aplicativo Python (Flask).

Você deve configurar o nginx para enviar todos os pedidos de app.example.com para o seu WSGI (Python Application Server). Dessa forma, as solicitações do link serão veiculadas diretamente pelo nginx e todas as solicitações para o host virtual app.example.com:80 serão encaminhadas para seu servidor de aplicativos Python. Dependendo da sua preferência, você pode executar seu aplicativo Python / Flask usando uWSGI ou gunicorn.

Para configurar o app.example.com como um host virtual, você precisará criar um arquivo (por exemplo, /etc/nginx/sites-available/app.example.com se você estiver usando uma distribuição baseada no Debian) que conterá algo como isto:

server { 
  server_name app.example.com; 
  access_log /var/log/nginx/app-access.log; 
  error_log /var/log/nginx/app-error.log; 
  location /static { 
    root /var/www/app.example.com/static; # adjust to fit your path here 
  } 
  location / { 
    uwsgi_pass unix:/tmp/uwsgi_app.sock; 
    include /etc/nginx/conf.d/uwsgi_params; 
  } 
}

O conteúdo da seção location / precisa ser ajustado, dependendo do servidor WSGI específico que você escolher usar - veja abaixo.

Em seguida, você precisa ligar simbolicamente a nova configuração do host virtual aos sites habilitados e reiniciar o nginx:

ln -sf /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
/etc/init.d/nginx restart

Consulte este documento para obter mais informações sobre como configurar o nginx para servir vários sites (hosts virtuais) no mesmo endereço IP e na porta TCP .

Aqui estão duas entradas de blog descrevendo como configurar o nginx com o uWSGI: Implantando Frasco Com Nginx e uWSGI Configurando o Flask com nginx e uWSGI . Se você preferir gunicorn (uma porta Python WSGI do servidor de aplicativos unicorn de Ruby), você pode verificar essa pergunta SO: Executando um aplicativo Flask com nginx e gunicorn e Servindo aplicações em frascos com Nginx e gunicorn

    
por 03.04.2013 / 09:55