So stellen Sie mit Nginx mehrere Vue-Projekte unter demselben Domänennamen bereit und verwenden einen Reverse-Proxy

So stellen Sie mit Nginx mehrere Vue-Projekte unter demselben Domänennamen bereit und verwenden einen Reverse-Proxy

Wirkung

Derzeit gibt es 2 Projekte (Projekt1, Projekt2) und eine index.html, die mit nginx geliefert wird. Ich habe den entsprechenden Linkcode hinzugefügt (später eingefügt), um das Routing der Unterprojekte zu vereinheitlichen.

Ich erwarte, dass ich den folgenden Effekt erziele (unter der Annahme von IP: localhost, Port: 8080):

http://localhost:8080/ Geben Sie den äußersten index.html ein
http://localhost:8080/project1 Geben Sie Projekt 1 ein
http://localhost:8080/project2 Geben Sie Projekt 2 ein

Beginnen wir nun ohne weitere Umschweife mit der Konfiguration

Vue-Konfiguration

Ich verwende vue-cli2 zum Erstellen des Projekts, daher muss ich einige Vue-Konfigurationsparameter entsprechend ändern.

index.js im Konfigurationsordner ist gepackt, daher müssen wir den entsprechenden Projektnamen in build.assetsPublicPath ändern, zum Beispiel

//Projekt1
modul.exporte = {
 Entwickler: {},
 bauen: {
  assetPublicPath: '/project1/' // Beachten Sie das führende und nachfolgende '/'
 }
}

//Projekt2
modul.exporte = {
 Entwickler: {},
 bauen: {
  assetPublicPath: '/project2/' // Beachten Sie das führende und nachfolgende '/'
 }
}

Ändern Sie prod.env.js im Konfigurationsordner wie folgt:

//Projekt1
modul.exporte = {
 NODE_ENV: '"Produktion"',
 BASE_API: '"/api/pro1"' // Dies entspricht später der nginx-Konfiguration}

//Projekt2
modul.exporte = {
 NODE_ENV: '"Produktion"',
 BASE_API: '"/api/pro2"' // Dies entspricht später der nginx-Konfiguration}

[Hinweis] Da ich in meinem Projekt BASE_API als Proxy-Präfix verwende, müssen Sie Ihre eigene Proxy-Konfiguration finden, wenn Ihr Präfix nicht hier ist.

Da die Vue-Router-Dateikonfiguration bei jedem anders ist, müssen Sie Ihre Router-Konfigurationsdatei suchen und intern ändern:

// Ich habe den Verlaufsmodus verwendet, den Hash-Modus habe ich nicht getestet, ich denke, er sollte den gleichen Effekt haben // project1
exportiere standardmäßig einen neuen Router({
 Basis: '/project1/', // Beachten Sie, dass Sie Ihren Unterprojektnamen ändern müssen, dies entspricht Ihrem build.assetsPublicPath
 Modus: "Verlauf",
 scrollBehavior: () => ({ y: 0 }),
 Routen: []
})

//Projekt2
exportiere standardmäßig einen neuen Router({
 Basis: '/project2/', // Beachten Sie, dass Sie Ihren Unterprojektnamen ändern müssen, dies entspricht Ihrem build.assetsPublicPath
 Modus: "Verlauf",
 scrollBehavior: () => ({ y: 0 }),
 Routen: []
})

[Hinweis] Beim Ausführen von npm run build erhalten Sie möglicherweise einen Fehler wie .tap(*). Dies liegt daran, dass es ein Problem mit der Version des html-webpack-plugins im Paket gibt. Sie können die folgende Anweisung ausführen

# Diese Version ist die Version in Ihrem package.json, aber Sie müssen diese Version erneut angeben$ npm i [email protected] -D

Nginx-Konfiguration

Zunächst einmal sieht mein Verzeichnis so aus, alle irrelevanten Dateien werden als ... angezeigt.

.
├─conf
│ ├─... # Andere Dateien│ └─nginx.conf
│
├─html # Schau einfach hier, die anderen benutze ich im Moment nicht│ ├─project1
│ │ └─statisch
│ │ ├─css
│ │ ├─Schriftarten
│ │ └─js
│ │ ├─g
│ │ └─V
│ ├─Projekt2
│ │ └─statisch
│ │ ├─css
│ │ ├─Schriftarten
│ │ └─js
│ │ ├─g
│ │ └─V
│ ├─index.html
│ └─50x.html
└─... # Andere Dateien

[Erklärung] Mein nginx-Verzeichnis ist nativ und enthält einen HTML-Ordner. Um mir Mühe zu ersparen, verwende ich diesen direkt. Natürlich können Sie auch andere Verzeichnisse angeben, aber verwenden Sie vorerst bitte dieselbe Konfiguration wie meine und passen Sie sie später an.

Nun beginnen wir mit der Konfiguration der Datei nginx.conf im Ordner conf

Ich habe die Originaldatei direkt geändert und die geänderten Konfigurationen befanden sich alle im HTTP-Modul. Daher habe ich andere unnötige Codes durch ... ersetzt.

# ...
# Reverse-Proxy http {
  mime.types einschließen;
  Standardtyp Anwendung/Oktett-Stream;

  #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  # '$status $body_bytes_sent "$http_referer" '
  # '"$http_user_agent" "$http_x_forwarded_for"';

  sendfile an;
  KeepAlive-Timeout 65;

  Maximale Client-Körpergröße: 20 M;
  Client-Body-Puffergröße 10 M;
  große_Client_Header_Puffer 4 128k;
  
  # Dies kann als Cluster-Upstream p1_server { verwendet werden
    Server localhost:8081;
  }

  # Dies kann als Cluster-Upstream p2_server { verwendet werden
    Server localhost:8082;
  }

  Server {
    hören Sie 8080;
    Servername localhost;
    Zeichensatz UTF-8;

    Proxy_Verbindungs-Timeout 180;
    Proxy_Sendezeitüberschreitung 180;
    Proxy_Lese_Timeout 180;
    Proxy_Set_Header Host $host;
    proxy_set_header X-Forwarder-Für $remote_addr;

    root html; # Hier geben wir unseren Ordner an. # Die gesamte Projektroute. Ich war faul und habe sie direkt in dieselbe Datei geschrieben. # Wenn es viele gibt, können Sie mehrere Conf-Dateien konfigurieren und sie mithilfe von „Include“ verknüpfen. location / {
      try_files $uri $uri/ /index.html; # Hier können Sie verstehen, dass es sich um die Datei index.html im html-Ordner handelt
    }
    
    #projekt1
    # Hier ist die build.assetsPublicPath-Konfiguration von config/index.js im Vue-Projekt.
    # Es ist auch die Basis des im Vue-Projekt konfigurierten Routers
    Standort ^~ /Projekt1 {
      try_files $uri $uri/ /project1/index.html; # Hier können Sie verstehen, dass es auf die index.html des Ordners project1 unter dem Ordner html angegeben ist
    }
    
    #projekt2
    # Hier ist der Konfigurationsort von Projekt 2 ^~ /project2 { # 
      try_files $uri $uri/ /project2/index.html; # Hier können Sie verstehen, dass es auf die index.html des Ordners project2 unter dem Ordner html angegeben ist
    }
    
    # Hier ist die Schnittstelle, die project1 für die Konfiguration aufrufen muss location /api/pro1 { # Hier ist die Konfiguration BASE_API von prod.env.js im Vue-Projekt 
      Proxy_Redirect aus;
      Proxy_Set_Header Host $host;
      Proxy_Set_Header X-Real-IP $Remote_Addr;
      proxy_set_header X-Weitergeleitet-Für $proxy_add_x_forwarded_for;
      proxy_pass http://p1_server; # Der p1_server hier entspricht der obigen Konfiguration upstream p1_server {}, hier können Sie Clustering durchführen, ich brauche es nicht, also konfiguriere ich es einfach}
    
     # Hier ist die Schnittstelle, die project1 für die Konfiguration aufrufen muss location /api/pro2 { # Hier ist die Konfiguration BASE_API von prod.env.js im Vue-Projekt
      Proxy_Redirect aus;
      Proxy_Set_Header Host $host;
      Proxy_Set_Header X-Real-IP $Remote_Addr;
      proxy_set_header X-Weitergeleitet-Für $proxy_add_x_forwarded_for;
      proxy_pass http://p2_server; # Der p2_server hier entspricht der obigen Konfiguration upstream p2_server {}, hier können Sie Clustering durchführen, ich brauche es nicht, also konfiguriere ich es einfach}

    # ...
  }

  # ...
}

Abschließend habe ich den Code der index.html gepostet, den ich geändert habe

Da ich anhänge, werde ich den von mir angehängten Code direkt veröffentlichen und die anderen werden …

...
<p><em>Vielen Dank, dass Sie nginx verwenden.</em></p> <!-- Für Anzeigeort-->

<!-- start: anhängen -->
<hr>
<a href="/project1" rel="external nofollow" >Projekt 1</a> | <a href="/project2" rel="external nofollow" >Projekt 2</a>
<!-- Ende: Anhängen-->

</body> <!-- Für Anzeigezwecke -->

Abschließendes Debuggen

Nachdem alle Konfigurationen abgeschlossen sind, können wir nginx starten. Wenn Sie nicht wissen, wie das geht, lösen Sie das Problem bitte selbst.

Der Start ist erfolgreich. Wir können dies sehen, indem wir http://localhost:8080 in den Browser eingeben.

Klicken Sie auf Projekt 1. Der Link lautet dann http://localhost:8080/project1.

Klicken Sie auf Projekt 2. Der Link ändert sich zu http://localhost:8080/project2, was genau unseren Erwartungen entspricht und erfolgreich ist.

[Erzwungene Erklärung der Metaphysik] Ich habe es an diesem Tag konfiguriert, aber gleich beim Start trat ein Fehler auf, also habe ich schließlich aufgegeben. Aber als ich am nächsten Tag nachschauen wollte, war beim Start alles in Ordnung. Ich war so verwirrt! Wenn Sie auf das gleiche Problem wie ich stoßen, lassen Sie es einfach in Ruhe, vielleicht ist es am nächsten Tag behoben.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • So stellen Sie ein Vue-Projekt auf Nginx bereit (Verlaufsmodus)
  • So stellen Sie ein Vue-Projekt unter Nginx bereit
  • Lösung für das Problem, dass beim Bereitstellen eines Vue-Projekts mit Nginx keine JS-CSS-Dateien gefunden werden
  • Lösen Sie das Problem der leeren Aktualisierung beim Bereitstellen des Vue-Projekts nginx in einem Nicht-Root-Verzeichnis
  • Implementierung der Bereitstellung eines Vue-Projekts auf einem Nginx/Tomcat-Server
  • Tutorial zur Bereitstellung des Vue.js-Projekts über Nginx
  • So lösen Sie das Problem, dass der CSS-Stil nicht wirksam wird, wenn Vue verpackt und in Nginx bereitgestellt wird
  • Der Server verwendet Nginx, um das Vue-Projekt bereitzustellen

<<:  Detaillierte Erläuterung des CocosCreator-Projektstrukturmechanismus

>>:  Detaillierte Erläuterung der allgemeinen Schritte zur SQL-Anweisungsoptimierung

Artikel empfehlen

MySQL 8.0.12 Einfaches Installations-Tutorial

In diesem Artikel finden Sie das Installations-Tu...

Grundkenntnisse der MySQL-Datenbank

Inhaltsverzeichnis 1. Datenbanken verstehen 1.1 D...

Eine kurze Analyse der Crontab-Aufgabenplanung in Linux

1. Erstellen Sie eine Planungsaufgabe Anweisung c...

Sammlung einer Zusammenfassung der HTML-Iframe-Nutzung

Detaillierte Analyse der Iframe-Nutzung <iframe...

HTML+CSS zum Erreichen eines reaktionsfähigen Karten-Hover-Effekts

Inhaltsverzeichnis erreichen: Zusammenfassen: Daz...

So finden Sie den angegebenen Inhalt einer großen Datei in Linux

Denken Sie im Großen und im Kleinen und lenken Si...

Detaillierte Beispiele für Docker-Compose-Netzwerke

Ich habe heute mit den Netzwerkeinstellungen unte...

Detaillierte Schritte zur Installation von MySQL 5.7 über YUM auf CentOS7

1. Gehen Sie zu dem Speicherort, an dem Sie das I...

Detaillierter Installationsprozess und Prinzip des Vue-Routers

Inhaltsverzeichnis 1. Implementierungsprinzip des...

Beispiele für optimistisches und pessimistisches Sperren in MySQL

Die Aufgabe der Parallelitätskontrolle in einem D...