Meu objetivo é fornecer um serviço de e-mail seguro a partir de um novo servidor Ubuntu 16.04. Para fazer isso, quero configurar o Apache2 com o nginx em execução como seu proxy reverso.
Meu problema imediato é que o Apache falha ao iniciar, alegando que não há certificado SSL atribuído (consulte a saída do Terminal no final desta pergunta), embora 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 quaisquer certificados SSL?
- O que preciso fazer para que o Apache comece a escutar em um endereço local?
Aqui está o meu entendimento do que eu preciso fazer. Eu ficaria grato se você pudesse apontar onde meu entendimento está errado.
- Instale nginx e Apache2
- Crie um bloco de servidor nginx para:
- Ouça nas portas 80 (e 443)
- (Redirecione o tráfego da porta 80 para a porta 443)
- (Lidar com uma certificação SSL)
- Encaminhe 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
- Permanecer 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 nginx como seu proxy reverso apenas na porta 80.
Aqui estão os arquivos de configuração que 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>
Observe que não estou pedindo explicitamente ao Apache para escutar na porta 443. Existe outro lugar em algum outro arquivo de configuração que está dizendo ao Apache para escutar na porta 443?
Aqui estão meus arquivos PHP e HTML de espaço reservado, em seus lugares esperados:
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 http://webmail.mydomain.com/index.html é bem- sucedida como esperado, mas uma solicitação para http://webmail.mydomain.com/index.php resulta no download do arquivo, não na execução .
Aqui está 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 perdido?
NOTA: O objetivo principal deste servidor é fornecer um aplicativo Meteor. Eu escolhi fazer isso usando Phusion Passenger e Nginx. Além do serviço de e-mail, o Apache também será usado para entregar um site WordPress.
Eu tenho que trabalhar agora. Eu havia esquecido 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.Posteriormente, usei
sudo certbot --nginx
para obter um certificado para Nginx e agora tudo está funcionando com segurança.