2 votes

Alias Nginx et proxy_pass

J'utilise nginx comme frontal web et apache2 comme back-end web. Apache fait tourner plusieurs sites web localement et nginx y accède.

Pour l'instant, différents sous-domaines sont hébergés, mais je veux les migrer en un seul en utilisant http://my-single-domain.com/subdomain-alias grâce à nginx.

Le répertoire racine et le port vhost d'apache2 sont différents pour chaque sous-domaine (cela semble évident, n'est-ce pas ?).

J'ai essayé plusieurs configurations mais je n'arrive pas à obtenir l'envoi de la ressource, c'est-à-dire que l'index html est envoyé mais les ressources ne sont pas trouvées par le serveur ( 404 Not Found ) malgré la règle root en cours.

J'ai essayé plusieurs solutions telles que :

location /alias1 {
  proxy_pass   http://127.0.0.1:9095/;
  include      /etc/nginx/proxy.conf;
}

o

location /alias1 {
  alias  /alias1/;
  proxy_pass   http://127.0.0.1:9095/;
  include      /etc/nginx/proxy.conf;
}

ou même

location /alias1/ {
  rewrite ^/alias1(/.*)$ $1 break;
  proxy_pass http://127.0.0.1:9095/;
}

ou encore

location /alias1/ {
  rewrite ^/alias1(/.*)$ $1 break;
  proxy_pass   http://127.0.0.1:9095/;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Quel est le problème de cette installation ? Comment configurer nginx pour qu'il récupère les ressources à partir d'un répertoire racine spécifique lorsque l'âge de l'utilisateur est atteint ? /alias1/page est demandé ?


Demandé en premier lieu sur webmasters.stackexchange.com

---### /etc/nginx/proxy.conf proxy_redirect désactivé ; proxy_set_header Hôte $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto https ; #client_max_body_size 10m ; #client_body_buffer_size 12 #proxy_send_timeout 90 ; proxy_read_timeout 90 ; proxy_buffers 32 4k ;

/etc/nginx/nginx.conf

 user              www-data  www-data;

 worker_processes  2;

 pid        /var/run/nginx.pid;

 worker_rlimit_nofile 1024;

 events {
         worker_connections 512;
 }

 http {

         include /etc/nginx/mime.types;
         default_type application/octet-stream;
         sendfile "on";
         tcp_nopush "on";
         tcp_nodelay "on";
         keepalive_timeout "65";
         access_log "/var/log/nginx/access.log";
         error_log "/var/log/nginx/error.log";
         server_tokens off;
         types_hash_max_size 2048;

         include /etc/nginx/conf.d/*.conf;
         include /etc/nginx/sites-enabled/*/*;
 }

/etc/nginx/site-enable/single-domain.conf

server {
        listen      443;
        ssl on;
        ssl_certificate /etc/ssl/private/single-domain.com-with_chain.crt;
        ssl_certificate_key /etc/ssl/private/single-domain.com.key.pem;

        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/private/dhparams.pem;

        server_name www.single-domain.com;

        location / {
                proxy_pass   http://127.0.0.1:8090/;
                include      /etc/nginx/proxy.conf;
        }

        location /alias/ {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass   http://127.0.0.1:8103/;
        proxy_set_header Host alias.single-domain.com;
        root /var/www/alias.single-domain.com;
        }

        location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx|otf|eot|svg|ttf|woff)$ {
                root /var/www/single-domain.com/public;
                proxy_buffering on;
                proxy_cache_valid 200 120m;
                expires 864000;
        }

        access_log /var/log/nginx/single-domain.com/www-access.log;
        error_log /var/log/nginx/single-domain.com/www-error.log;
}

0 votes

C'est une très mauvaise idée. Vous devrez modifier tous vos sites web pour rechercher des actifs statiques qui ne sont pas dans /img/logo.png pero /alias1/img/logo.png . C'est parfois presque impossible.

0 votes

Pourquoi voulez-vous vous débarrasser des sous-domaines ?

0 votes

L'objectif n'est pas de se débarrasser des sous-domaines, mais d'utiliser le TLS du domaine unique à la place. Les sous-domaines ne sont que des services personnels et privés qui, selon l'IMO, n'ont pas besoin de sous-domaines pour cela en premier lieu (c'est juste qu'il est facile de les séparer en premier lieu). N'est-il pas possible de demander à nginx de rechercher des actifs dans un autre répertoire racine tout en supprimant l'option /alias/ -part-path de l'actif lui-même ? !

2voto

Matija Nalis Points 2390

Si apache écoute sur le port 9095 pour le domaine sub1.example.com et sur le port 9096 pour le domaine sub2.example.com et vous voulez que nginx passe http://www.example.com/alias1 en premier, et http://www.example.com/alias2 pour le deuxième virtualhost apache, vous feriez :

location /alias1/ {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass   http://127.0.0.1:9095/;
        proxy_set_header Host sub1.example.com;
}

location /alias2/ {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass   http://127.0.0.1:9096/;
        proxy_set_header Host sub2.example.com;
}

alors par exemple, la demande originale à nginx à http://your-single-domain.example.com/alias1/foo/page1.html sera transféré à apache comme s'il était destiné à http://sub1.example.com:9095/foo/page1.html

Et la demande originale à nginx à http://your-single-domain.example.com/alias2/bar/baz/page2.html sera transféré à apache comme s'il était destiné à http://sub2.example.com:9096/bar/baz/page2.html

Mise à jour1 (preuve de concept) : avec le nginx ayant sólo comme ci-dessus, nous exécutons netcat en tant que nc -l -p 9095 (apache ne devrait pas écouter sur ce port pour ce débogage), puis ouvrez dans le navigateur http://www.single-domain.com/alias1/assets/style.css . Nous devrions voir dans la sortie de netcat ce qui suit :

GET /assets/style.css HTTP/1.1
Host: sub1.example.com
Connection: close
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.6.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1

Si apache écoutait sur le port 9095 au lieu de notre netcat, il recevrait donc une requête HTTP/1.1 pour l'URL " http://sub1.example.com/assets/style.css "(qui apparaîtrait dans /var/log/apache2/access_log ou similaire)

Notez que rewrite ^/alias1(/.*)$ $1 break; n'est pas nécessaire, car location /alias1/ dépouillera automatiquement cette /alias1/ partie de l'URL.

Si vous obtenez des résultats différents en utilisant votre Dans ce cas, je vous recommande de commencer par la configuration décrite dans cette réponse, de vérifier qu'elle fonctionne, puis d'ajouter les anciens blocs de configuration un par un jusqu'à ce qu'il y ait un problème - et vous aurez alors un bloc en conflit qui devra être modifié.

Mise à jour2 : depuis que vous avez posté votre configuration nginx, c'est évident - vous avez un remplacement de l'emplacement qui dit que toutes vos données d'accès à la base de données ont été modifiées. .css (ainsi que d'autres fichiers) doivent être servis directement avec nginx à partir de /var/www/single-domain.com/public . Supprimez ou modifiez-le, et il passera par apache.

0 votes

Merci pour votre réponse ! J'ai essayé cette conf mais les actifs sont toujours récupérés sur http://www.single-domain.com/alias1/assets/style.css y no http://alias1.single-domain.com/assets/style.css .

0 votes

@Auzias es-tu sûr de ne pas en avoir ? autres dans la configuration de nginx et que vous l'avez redémarré avec succès ? location /alias1 devrait toujours correspondre http://www.single-domain.com/alias1/assets/style.css (si nginx écoute sur www.single-domain.com, bien sûr !) et devrait donc toujours accéder à apache via le proxy spécifié.

0 votes

Cela expliquerait ce comportement étrange. Je suis certain que nginx a redémarré. Un rewrite ^/alias1(/.*)$ $1 break; être ajoutée ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X