Obtenha o Apache2 em execução com o nginx como proxy reverso

2

Meu objetivo é fornecer um serviço de e-mail seguro a partir de um novo servidor Ubuntu 16.04. Para fazer isso, eu quero configurar o Apache2 com nginx em execução como seu proxy reverso.

Meu problema imediato é que o Apache não inicia, alegando que não há nenhum certificado SSL atribuído (veja a saída do Terminal no final desta pergunta), mesmo que eu não esteja (ainda) tentando usar HTTPS.

Minhas perguntas:

  • Se o Apache estiver sendo executado em uma porta local, não é suficiente que o nginx saiba sobre algum certificado SSL?
  • O que preciso fazer para que o Apache comece a escutar em um endereço local?

Aqui está o meu entendimento do que preciso fazer. Ficaria muito grato se você pudesse apontar onde meu entendimento está errado.

  • Instale o nginx e o Apache2
  • Crie um bloco de servidor nginx para:
    • Ouça nas portas 80 (e 443)
    • (Redirecionar tráfego da porta 80 para a porta 443)
    • (lidar com uma certificação SSL)
    • Encaminhar quaisquer solicitações de um arquivo PHP para o Apache em 127.0.0.1:8080
  • Configure o Apache para:
    • Ouça apenas na porta 8080, não na porta 443
    • Permanece ignorante de qualquer certificação SSL

Eu gosto de lidar com um problema de cada vez, então estou deixando de lado a questão dos certificados SSL e tentando fazer o Apache rodar com o nginx como seu proxy reverso apenas na porta 80.

Aqui estão os arquivos de configuração que eu tenho:

nginx

$ sudo nano /etc/nginx/sites-available/webmail

server {
  listen   80;

  root /var/www/webmail/web;
  index index.php index.html index.htm;

  server_name webmail.mydomain.com;

  # Look for...
  # * the exact path
  # * a default (index.*) file, considering the path to be a directory
  # ... and if that fails:
  # * get the index.php script at the root to deal with the request

  location / {
    try_files $uri $uri/ /index.php;
  }

  # If the chosen path leads to a PHP fie:
  # * forward the request to Apache running at 127.0.0.1:8080
  # * after having modified certain headers

  location ~ \.php$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8080;
  }

  # If there are any Apache HT files in the chosen directory
  # ignore any direct requests for them

  location ~ /\.ht {
    deny all;
  }
}

Apache2

$ sudo nano /etc/apache2/sites-available/webmail.conf 

<VirtualHost 127.0.0.1:8080>
        ServerName webmail.mydomain.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/webmail/web
        <Directory "/var/www/webmail/web">
            Options FollowSymLinks
            AllowOverride All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Portas Apache2

$ sudo nano /etc/apache2/ports.conf

Listen 127.0.0.1:8080

#<IfModule ssl_module>
#       Listen 443
#</IfModule>

#<IfModule mod_gnutls.c>
#       Listen 443
#</IfModule>

Note que estou explicitamente não pedindo ao Apache para escutar na porta 443. Existe outro lugar em algum outro arquivo de configuração que esteja dizendo ao Apache para escutar na porta 443?

Aqui estão os meus arquivos PHP e HTML de espaço reservado, nos locais esperados deles:

index.php

$ sudo nano /var/www/webmail/web/index.php

<?php
  echo "PHP from /var/www/webmail/web/index.php\n";
?>

index.html

$ sudo nano /var/www/webmail/web/index.html

<html>
  HTML from /var/www/webmail/web/index.html
</html>

No navegador, uma solicitação para link é bem-sucedida como esperado, mas uma solicitação para link resulta no download do arquivo, não executado.

Veja o que acontece quando tento iniciar o Apache2:

$ sudo /etc/init.d/apache2 restart
[ ok ] Restarting apache2 (via systemctl): apache2.service.

$ sudo service apache2 status
* apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           '-apache2-systemd.conf
   Active: inactive (dead) since <Time>; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 16059 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
  Process: 16043 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)

systemd[1]: Starting LSB: Apache2 web server...
apache2[16043]:  * Starting Apache httpd web server apache2
apache2[16043]: Action 'start' failed.
apache2[16043]: The Apache error log may have more information.
apache2[16043]:  *
apache2[16059]:  * Stopping Apache httpd web server apache2
apache2[16059]:  *
systemd[1]: Started LSB: Apache2 web server.

Aqui está o conteúdo do error.log:

$ sudo nano /var/log/apache2/error.log

[ssl:emerg] [pid 15943] AH02572: Failed to configure at least one certificate and key for myhostname.hostingservice.com:443
[ssl:emerg] [pid 15943] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[ssl:emerg] [pid 15943] AH02311: Fatal error initialising mod_ssl, exiting. See /var/log/apache2/error.log for more information

(Isso está em var / log / apache2 / error.log e não há mais informações.)

O que eu tenho sentido falta?

NOTA: O objetivo principal deste servidor é entregar um aplicativo Meteor. Eu escolhi fazer isso usando o Phusion Passenger e o Nginx. Além do serviço de e-mail, o Apache também será usado para entregar um site WordPress.

    
por James Newton 28.10.2017 / 12:15

1 resposta

0

Eu tenho que trabalhar agora. Eu tinha deixado de remover /etc/apache2/sites-disabled/default-ssl.conf , então o Apache estava tentando executar um site seguro que não era necessário.

Em seguida, usei sudo certbot --nginx para obter um certificado para o Nginx e agora tudo está funcionando com segurança.

    
por James Newton 01.11.2017 / 20:49