web-dev-qa-db-fra.com

Exécuter Apache2 avec nginx en tant que proxy inverse

Mon objectif est de fournir un service de messagerie sécurisé à partir d'un nouveau serveur Ubuntu 16.04. Pour ce faire, je souhaite configurer Apache2 avec nginx sous son proxy inverse.

Mon problème immédiat est qu’Apache ne démarre pas, affirmant qu’aucun certificat SSL n’a été attribué (voir la sortie de Terminal à la fin de cette question), même si je n’essaie pas (encore) d’utiliser HTTPS.

Mes questions:

  • Si Apache est exécuté sur un port local, ne suffit-il pas que nginx soit informé de l'existence de certificats SSL?
  • Que dois-je faire pour qu'Apache commence à écouter à une adresse locale?

Voici ma compréhension de ce que je dois faire. Je vous serais reconnaissant de bien vouloir indiquer en quoi ma compréhension est erronée.

  • Installez nginx et Apache2
  • Créez un bloc serveur nginx pour:
    • Écoutez sur les ports 80 (et 443)
    • (Rediriger le trafic du port 80 au port 443)
    • (Traiter avec une certification SSL)
    • Transférez toutes les demandes de fichier PHP vers Apache à l'adresse 127.0.0.1:8080.
  • Configurez Apache pour:
    • Écoutez uniquement sur le port 8080, pas sur le port 443
    • Rester ignorant de toute certification SSL

J'aime traiter un problème à la fois. Je laisse donc de côté la question des certificats SSL et tente de faire fonctionner Apache avec nginx en tant que proxy inverse sur le port 80 uniquement.


Voici les fichiers de configuration que j'ai en place:

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>

ports 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>

Notez que je ne demande pas explicitement à Apache d’écouter sur le port 443. Y at-il un autre emplacement dans un autre fichier de configuration qui indique à Apache d’écouter sur le port 443?


Voici mes fichiers d'espace réservé PHP et HTML, aux emplacements prévus:

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>

Dans le navigateur, une demande à http://webmail.mydomain.com/index.html réussit comme prévu, mais une demande à http://webmail.mydomain.com/index .php entraîne le téléchargement du fichier, mais pas son exécution.


Voici ce qui se passe lorsque j'essaie de démarrer 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.

Voici le contenu de 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

(Ceci est dans var/log/Apache2/error.log, et il n'y a pas plus d'informations.)

Qu'est-ce que j'ai manqué?


REMARQUE: L'objectif principal de ce serveur est de fournir une application Meteor. J'ai choisi de le faire avec Phusion Passenger et Nginx. En plus du service de messagerie, Apache sera également utilisé pour livrer un site WordPress.

2
James Newton

Je le travaille maintenant. J'avais négligé de supprimer /etc/Apache2/sites-disabled/default-ssl.conf, Apache essayait donc de faire fonctionner un site sécurisé inutile.

J'ai par la suite utilisé Sudo certbot --nginx pour obtenir un certificat pour Nginx, et maintenant tout fonctionne correctement.

0
James Newton