2016-05-16 9 views
1

Es gibt mehrere Fragen über StackOverflow, wie Unterordner mit verschiedenen Fastcgi-Backends oder Fragen ähnlich verwenden, aber nichts funktioniert richtig - und nach Stunden der Versuch und Lesen der Dokumentation (vielleicht ein kleines Detail fehlt)) Ich gebe auf.Nginx-Server mit mehreren Fastcgi-Backends für verschiedene Unterordner

ich die folgenden Anforderungen:

  • auf / ein PHP 5.6-Anwendung ausgeführt wird (fastcgi Backend 127.0.0.1:9000)
  • auf /crm ein PHP-7.0-Anwendung ausgeführt wird, die es läuft auf / zu glauben hat (fastcgi Backend 127.0.0.1:9001)
  • infact gibt es nur wenig mehr Backends, aber mit diesen beiden ich sie von meiner eigenen
  • machen

Ich habe versucht, separate php Kontexte für Positionspräfixe zuerst zu definieren, bevor Sie versuchen, /crm Präfix zu entfernen. Aber es scheint, dass ich etwas falsch mache, weil /crm immer den PHP-Kontext von / verwendet.

Meine eigentliche abgespeckten Konfiguration, entfernt alles nicht relevant und alle nicht bestandenen Tests:

server { 
    listen  80; 
    server_name myapp.localdev; 

    location /crm { 
     root  /var/www/crm/public; 
     index  index.php; 
     try_files $uri /index.php$is_args$args; 

     location ~ \.php$ { 
      # todo: strip /crm from REQUEST_URI 
      fastcgi_pass 127.0.0.1:9001; # 9001 = PHP 7.0 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include  fastcgi_params; 
     } 
    } 

    location/{ 
     root  /var/www/intranet; 
     index  index.php; 
     try_files $uri /index.php$is_args$args; 

     location ~ \.php$ { 
      fastcgi_pass 127.0.0.1:9000; # 9000 = PHP 5.6 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include  fastcgi_params; 
     } 
    } 
} 
+0

Dies ist nicht die Antwort, die Sie wollen - aber ich schrieb über ein ähnliches Problem [hier] (http://serverfault.com/questions/766222/nginx-reverse-proxy-making-root-webapp-into-custom- Pfad/766225 # 766225) –

+0

Danke für Ihren Kommentar, aber es ist nicht das gleiche Problem. Ihr drittes Problem, das das einzige Problem ist, das nicht gelöst werden konnte, kann leicht gelöst werden, indem Sie das HTML-Basis-Tag für die crm-Anwendung verwenden. –

+1

Sie haben ein paar '' '' fehlen, und die Standardaktion auf einer Ihrer 'try_files' ist falsch. Ist das das Problem? Das '/ crm' wird'/index.php' und nicht '/ crm/index.php'? –

Antwort

3

Es gibt zwei kleinere Fehler in der Config:

  1. Das letzte Argument von try_files ist ein interne Weiterleitung, wenn keine der Dateien zuvor gefunden werden konnte. Das bedeutet, dass Sie für den CRM-Standort den Wert

  2. festlegen möchten. Sie müssen /crm aus dem $fastcgi_script_name entfernen. Der empfohlene Weg, es zu tun ist fastcgi_split_path_info ^(?:\/crm\/)(.+\.php)(.*)$;

Eine eventuell Arbeits Config wie folgt aussehen würde zu verwenden:

server { 
    listen  80; 
    server_name myapp.localdev; 

    location /crm { 
     root  /var/www/crm/public; 
     index  index.php; 
     try_files $uri /crm/index.php$is_args$args; 

     location ~ \.php$ { 
      # todo: strip /crm from REQUEST_URI 
      fastcgi_pass 127.0.0.1:9001; # 9001 = PHP 7.0 

      fastcgi_split_path_info ^(?:\/crm\/)(.+\.php)(.*)$; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

      include  fastcgi_params; 
     } 
    } 

    location/{ 
     root  /var/www/intranet; 
     index  index.php; 
     try_files $uri /index.php$is_args$args; 

     location ~ \.php$ { 
      fastcgi_pass 127.0.0.1:9000; # 9000 = PHP 5.6 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include  fastcgi_params; 
     } 
    } 
} 
+0

Es scheint zu funktionieren. "Vielleicht", es ist ziemlich kompliziert zu testen, da es auf einem der Produktionsserver getan werden muss, haben die Entwicklungsmaschinen nur einen Teil der installierten Software. Gibt es eine Möglichkeit, '/ crm' in die gleiche' root' zu bringen, aber mit einer anderen PHP-Version? Würde das Testen viel einfacher machen (einfach phpinfo Ausgabe testen). –

+0

Natürlich konfigurieren Sie einfach den/crm-Speicherort, um den gleichen Stamm zu verwenden, und Sie sind gut zu gehen. Der Weg /phpinfo.php verwendet PHP 5.6 und/crm/phpinfo.php verwendet 7.0. – egergo

+0

Es ist mir noch nicht gelungen, die Konfiguration zu verwenden, aber es sieht am vielversprechendsten aus. Du bekommst das Kopfgeld. Vielleicht werde ich in ein paar Tagen etwas fragen, zu viel Arbeit diese Woche. –

0

Ausführen dieses auf Ubuntu 14.04 und Nginx 1.10.

Sie können versuchen, den Socket anzugeben.

PHP7

fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 

Anmerkung: Der Weg des PHP7 Buchse ist das "gleiche" wie PHP5. Es ist nicht /var/run/php7-fpm.sock. Ich stolperte über Artikel, die dies als Standardpfad bezeichneten. Bitte überprüfen Sie, wie es auf Ihrem Server installiert ist.

PHP5

fastcgi_pass unix:/var/run/php5-fpm.sock; 

Auch PHP7 läuft, könnten Sie eine Zugriff verweigert Fehler auftreten. Dieses Problem kann auf ein Benutzerproblem in /etc/php/7.0/fpm/pool.d/www.conf zurückzuführen sein. Wo in der PHP7-Konfiguration Benutzer/Gruppe sind www-data, während Nginx Benutzer ist nginx.

Dies ist die PHP7 config:

listen.owner = www-data 
listen.group = www-data 

In meinem Fall änderte ich den Nginx Benutzer www-data.

Hoffe, das hilft.

+0

Das Problem besteht nicht darin, die Socket- oder "Permission Denied" -Fehler zu definieren. Das Routing bestimmter Ordner auf bestimmte PHP-Konfigurationen ist das Problem. –