web-dev-qa-db-fra.com

nginx et Apache2 sur le même serveur

J'ai Ubuntu 16.04 avec nginx et Apache2. Il y a 2 enregistrements DNS A pointés sur cette machine:

  • app1.mydomain.com
  • app2.mydomain.com

J'ai besoin qu'app1.mydomain.com soit résolu par Apache et app2.mydomain.com soit résolu par nginx. Les deux sur le port 80. Est-ce possible?

de plus, Apache doit gérer 2 applications différentes (site1 et site2).

Je voudrais:

  • app1.mydomain.com/site1 - à résoudre par Apache et exécuter le site d'application1
  • app1.mydomain.com/site2 - à résoudre par Apache et le site d'application incendie2
  • app2.mydomain.com - pour servir une application fantôme avec nginx

Voici ma configuration Apache:

<VirtualHost *:80>
    ServerAdmin [email protected]

    ServerName app1.mydomain.com

    ServerAlias www.app1.mydomain.com

    ErrorLog /var/www/site1/logs/error.log

    CustomLog /var/www/site1/logs/access.log combined

    WSGIScriptAlias /api /var/www/site1/application/index.py/

    Alias /static /var/www/site1/application/static

    <Directory /var/www/site1/application>
            Order deny,allow
            Allow from all
    </Directory>

    AddType text/html .py

    ErrorLog /var/www/site2/logs/error.log
    CustomLog /var/www/site2/logs/access.log combined

    WSGIScriptAlias /site2 /var/www/site2/index.py/
    Alias /site2/uploads /var/sftp/site2/uploads/

    <Directory /var/www/site2/>
            Order deny,allow
            Allow from all
    </Directory>

Voici mon fichier de configuration NGINX:

server {
listen 8080;
listen [::]:8080;

server_name app2.mydomain.com;
root /var/www/ghost/system/nginx-root;

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_Host;
    proxy_pass http://127.0.0.1:2368;

}
location ~ /.well-known {
    allow all;
}

client_max_body_size 50m;
}
1

Tout d'abord. Apache et Nginx sont des serveurs Web - et non serveurs DNS. Ils ne résolvent rien. Cette question n'a rien à voir avec le DNS, mais tout avec la façon dont les serveurs Web traitent les demandes.

J'ai besoin qu'app1.mydomain.com soit résolu par Apache et app2.mydomain.com soit résolu par nginx. Les deux sur le port 80. Est-ce possible?

Non, ce n'est pas possible. Deux applications ne peuvent pas écouter le même port. Vous pouvez résoudre ce problème de deux manières:

  1. Demandez à Apache d'écouter sur le port 80 et les demandes de proxy d'app2 app.mydomain.com à nginx, d'écouter sur un autre port et de servir app1.mydomain.com directement.
  2. Contraire. Avoir un proxy nginx pour Apache.

Ou - hébergez les deux sur le même serveur Web. Apache et nginx sont souvent interchangeables sur le plan technique. Par conséquent, du point de vue des applications, cela ne devrait pas vraiment avoir d’importance. Du point de vue de la gestion, ils sont plutôt différents.

Je remarque que vous exécutez nginx sur le port 8080, donc je suppose que vous souhaitez utiliser Apache en tant que proxy. Créez ensuite un nouvel hôte virtuel pour Apache, par exemple. /etc/Apache2-sites-available/app2.mydomain.com.conf:

<VirtualHost *:80>
   DocumentRoot "/var/www"
   ErrorLog "logs/app2-error_log"
   CustomLog "logs/app2-access_log" common
   ServerName app2.mydomain.com
   ProxyRequests Off
   <Proxy *>
          Order deny,allow
          Allow from all
    </Proxy>
     Proxypass / http://localhost:8080/
</VirtualHost>

Puis lancez Sudo a2enmod proxy_http; Sudo a2ensite app2.mydomain.com; Sudo service Apache2 reload.

Cela activera mod_proxy, mod_proxy_http et obligera Apache à transmettre toute demande relative à l'app2.mydomain.com de VirtualHost à nginx, qui, selon votre configuration, s'exécute sur le port 8080.

Je n'ai pas testé cette configuration, donc quelques ajustements peuvent être nécessaires.

En tant que note: pourquoi avez-vous besoin de nginx? Selon la configuration de nginx, il s'agit simplement de proxy d'une requête pour un autre serveur Web s'exécutant sur le port 2368. Vous pouvez utiliser un proxy directement à l'aide d'Apache ...

mod_proxy - la documentation peut être utile pour la peaufiner.

1
vidarlo

Selon le contenu de votre question, vous avez déjà résolu le problème, sauf que vous ne pouvez accéder qu'à une seule application par numéro de port. Vous ne pouvez pas exécuter Apache2 et Nginx sur le même port. Ce n'est pas possible.

Depuis que vous avez mentionné que votre DNS est déjà opérationnel et qu'il pointe vers la bonne machine (IP). Vous pouvez atteindre votre app1.mydomain.com par défaut (port 80) avec:

http://app1.mydomain.com

C'est la même chose que

http://app1.mydomain.com:80

Vous devrez spécifier le port de votre Nginx, que vous avez défini dans votre fichier de configuration pour port 8080.

Utilisez ceci pour accéder à votre site1:

http://app1.mydomain.com:8080

Si vous spécifiez le mauvais port, la page par défaut sera chargée quel que soit le nom de domaine utilisé. Pour Apache, la valeur par défaut est le premier hôte virtuel, sauf spécification différente.

0
L. D. James