nginx を使用して同じドメイン名で複数の Vue プロジェクトをデプロイし、リバース プロキシを使用する方法

nginx を使用して同じドメイン名で複数の Vue プロジェクトをデプロイし、リバース プロキシを使用する方法

効果

現在、プロジェクトは2つ(project1、project2)あり、nginxに付属するindex.htmlがあります。サブプロジェクトのルーティングを統一するために、対応するリンクコード(後で貼り付け)を追加しました。

次のような効果が得られると期待しています (IP: localhost、ポート: 8080 と想定)。

http://localhost:8080/ 一番外側のindex.htmlを入力します
http://localhost:8080/project1 プロジェクト1に入る
http://localhost:8080/project2 プロジェクト2に入る

さっそく設定を始めましょう

Vue 構成

私はプロジェクトをビルドするために vue-cli2 を使用しているため、それに応じていくつかの vue 構成パラメータを変更する必要があります。

configフォルダ内のindex.jsはパッケージ化されているので、build.assetsPublicPath内の対応するプロジェクト名を変更する必要があります。例:

//プロジェクト1
モジュール.エクスポート = {
 開発者: {},
 建てる: {
  assetPublicPath: '/project1/' // 先頭と末尾の '/' に注意してください
 }
}

//プロジェクト2
モジュール.エクスポート = {
 開発者: {},
 建てる: {
  assetPublicPath: '/project2/' // 先頭と末尾の '/' に注意してください
 }
}

config フォルダ内の prod.env.js を次のように変更します。

//プロジェクト1
モジュール.エクスポート = {
 NODE_ENV: '"production"'、
 BASE_API: '"/api/pro1"' // これは後で nginx の設定に対応します}

//プロジェクト2
モジュール.エクスポート = {
 NODE_ENV: '"production"'、
 BASE_API: '"/api/pro2"' // これは後で nginx の設定に対応します}

[注] 私のプロジェクトではプロキシプレフィックスとしてBASE_APIを使用しているため、ここにない場合は独自のプロキシ設定を見つける必要があります。

vue-router ファイルの設定は各自で異なるため、ルーターの設定ファイルを見つけて内部的に変更する必要があります。

// 履歴モードを使用しました。ハッシュモードはテストしていませんが、同じ効果があると思います // project1
デフォルトの新しいルーターをエクスポートします({
 base: '/project1/', // サブプロジェクト名を変更することに注意してください。これは build.assetsPublicPath に対応します。
 モード: '履歴'、
 スクロール動作: () => ({ y: 0 }),
 ルート: []
})

//プロジェクト2
デフォルトの新しいルーターをエクスポートします({
 base: '/project2/', // サブプロジェクト名を変更することに注意してください。これは build.assetsPublicPath に対応します。
 モード: '履歴'、
 スクロール動作: () => ({ y: 0 }),
 ルート: []
})

[注意] npm run buildで.tap(*)のようなエラーが出る場合があります。これはパッケージ内のhtml-webpack-pluginのバージョンに問題があるためです。以下の文を実行してください。

# このバージョンは package.json のバージョンですが、このバージョンを再指定する必要があります$ npm i [email protected] -D

Nginx の設定

まず、私のディレクトリは次のようになります。無関係なファイルはすべて次のように表示されます...

。
├─conf
│ ├─... # その他のファイル│ └─nginx.conf
│
├─html # ここだけ見て、他は今のところ使わない│ ├─project1
│ │ └─静的
│ │ ├─css
│ │ ├─フォント
│ │ └─js
│ │ ├─グ
│ │ └─V
│ ├─プロジェクト2
│ │ └─静的
│ │ ├─css
│ │ ├─フォント
│ │ └─js
│ │ ├─グ
│ │ └─V
│ ├─index.html
│ └─50x.html
└─... # その他のファイル

[説明] 私の nginx ディレクトリはネイティブで、html フォルダが含まれています。手間を省くために、これを直接使用します。もちろん、他のディレクトリを指定することもできますが、今のところは私と同じ設定を使用して、後でカスタマイズしてください。

次に、confフォルダ内のnginx.confファイルの設定を開始します。

元のファイルを直接変更し、変更された構成はすべて http モジュール内にあったため、他の不要なコードを次のように置き換えました...

# ...
# リバースプロキシ http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;

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

  ファイル送信オン;
  キープアライブタイムアウト65;

  クライアントの最大ボディサイズは20Mです。
  クライアントボディバッファサイズ 10M;
  ラージクライアントヘッダーバッファ 4 128k;
  
  # これはクラスターアップストリームとして使用できます p1_server {
    サーバー localhost:8081;
  }

  # これはクラスターアップストリーム p2_server として使用できます {
    サーバー localhost:8082;
  }

  サーバー{
    8080を聴く;
    server_name ローカルホスト;
    文字セット utf-8;

    プロキシ接続タイムアウト 180;
    プロキシ送信タイムアウト 180;
    プロキシ読み取りタイムアウト 180;
    proxy_set_header ホスト $host;
    proxy_set_header X-Forwarder-For $remote_addr;

    root html; # ここでフォルダーを指定します # プロジェクトのルート全体。私は面倒だったので同じファイルに直接書きました # たくさんある場合は、複数の conf ファイルを設定し、include を使用して関連付けることができます location / {
      try_files $uri $uri/ /index.html; # ここで、htmlフォルダ内のindex.htmlが指定されていることがわかります
    }
    
    #プロジェクト1
    # 以下は、現在の vue プロジェクトの config/index.js の build.assetsPublicPath 構成です。
    # これは、Vueプロジェクトで設定されたルーターのベースでもあります
    場所 ^~ /project1 {
      try_files $uri $uri/ /project1/index.html; # ここでは、htmlフォルダの下のproject1フォルダのindex.htmlが指定されていることがわかります。
    }
    
    #プロジェクト2
    # プロジェクト2の設定場所はここです ^~ /project2 { # 
      try_files $uri $uri/ /project2/index.html; # ここでは、htmlフォルダの下のproject2フォルダのindex.htmlが指定されていることがわかります。
    }
    
    # これは、project1 が構成のために呼び出す必要のあるインターフェースです。場所 /api/pro1 { # これは、vue プロジェクトの prod.env.js の構成 BASE_API です。 
      proxy_redirect オフ;
      proxy_set_header ホスト $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://p1_server; # ここでの p1_server は上記の設定に対応します。upstream p1_server {}、ここでクラスタリングを行うことができますが、必要ないので、単純に設定します}
    
     # これは、project1 が構成場所 /api/pro2 のために呼び出す必要のあるインターフェースです { # これは、vue プロジェクトの prod.env.js の構成 BASE_API です
      proxy_redirect オフ;
      proxy_set_header ホスト $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://p2_server; # ここでの p2_server は上記の設定に対応します。upstream p2_server {}、ここでクラスタリングを行うことができますが、必要ないので、単純に設定します}

    # ...
  }

  # ...
}

最後に、私が修正したindex.htmlのコードを投稿しました

追記なので追記したコードはそのまま掲載し、他は…

...
<p><em>nginx をご利用いただきありがとうございます。</em></p> <!-- 表示場所 -->

<!-- 開始: 追加 -->
<時間>
<a href="/project1" rel="external nofollow" >プロジェクト 1</a> | <a href="/project2" rel="external nofollow" >プロジェクト 2</a>
<!-- 終了: 追加 -->

</body> <!-- 表示目的のため -->

最終デバッグ

すべての設定が完了したら、nginx を起動できます。方法がわからない場合は、自分で解決してください。

起動は成功しました。ブラウザに http://localhost:8080 と入力すると確認できます。

プロジェクト1をクリックすると、リンクがhttp://localhost:8080/project1になることがわかります。

プロジェクト 2 をクリックすると、リンクが http://localhost:8080/project2 に変わります。これはまさに予想どおりであり、成功です。

【形而上学の強引な説明】その日も設定はしたのですが、起動するとすぐにエラーが出たので結局諦めました。しかし、翌日、確認する準備ができたとき、起動したときにはすべて問題ありませんでした。私はとても混乱しました! 私と同じ問題に遭遇した場合は、そのまま放置してください。翌日には解決されるかもしれません。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue プロジェクトを nginx にデプロイする方法 (履歴モード)
  • nginx で Vue プロジェクトをデプロイする方法
  • nginx で vue プロジェクトをデプロイするときに js css ファイルが見つからない問題の解決策
  • Vue プロジェクト nginx を非ルート ディレクトリにデプロイするときに空白が更新される問題を解決する
  • vue プロジェクトを nginx/tomcat サーバーにデプロイする実装
  • Vue.js プロジェクト nginx デプロイメント チュートリアル
  • Vue をパッケージ化して Nginx にデプロイすると CSS スタイルが有効にならない問題を解決する方法
  • サーバーはNginxを使用してVueプロジェクトをデプロイします

<<:  CocosCreatorプロジェクト構造の仕組みの詳細な説明

>>:  SQL文の最適化の一般的な手順の詳細な説明

推薦する

SpringBoot アプリケーションの Docker デプロイメントの実装手順

目次序文DockerファイルDockerfile とは何ですか? Dockerfile 構文Spri...

VMware IOInsight を使用して、仮想マシンのストレージ パフォーマンスの監視を改良する

例: VMware IOInsight は、VM のストレージ I/O 動作を理解するのに役立つツー...

Vue でログインと登録テンプレートを実装するためのサンプルコード

テンプレート 1: ログイン.vue <テンプレート> <p class=&quo...

HTML テーブル マークアップ チュートリアル (2): テーブル境界属性 BORDER

デフォルトでは、テーブルの境界線は 0 ですが、テーブルの境界線を設定できます。基本的な構文<...

WeChatミニプログラムの開発をスピードアップするためのヒント

1. app.jsonを使用してページを作成する私たちの通常の開発習慣によれば、新しいページを作成す...

セマンティックタグを使用して、IE6、7、8と互換性のあるHTMLを記述します。

HTML5 では、ヘッダー、フッター、ナビゲーションなどのセマンティック タグが追加されているため...

Linux コンパイル最適化で習得しなければならないいくつかの姿勢のまとめ

01. コンパイルオプションとカーネルコンパイルLinux カーネル (英語: linux kern...

Docker x509 の安全でないレジストリ問題を解決する

Docker をインストールした後、会社が構築したプライベート サーバー Harbor からプルしよ...

CSS3 アドバンス LESS で星空アニメーションを実装するサンプルコード

この記事では、星空アニメーションを実現するための高度な CSS3 LESS のサンプルコードを次のよ...

CSS3は、ズームと回転を実現するためにscale()とrotate()を使用します。

1. scale() メソッドズームとは「縮小」と「拡大」を意味します。 CSS3 では、scal...

MySQLデータベースの一般的な最適化操作のまとめ(経験共有)

序文データ中心のアプリケーションの場合、データベースの品質はプログラムのパフォーマンスに直接影響する...

純粋な HTML タグにどれくらい精通していますか?

以下の HTML タグには、基本的に既存のタグがすべて含まれています。数分かけて 1 つずつ参照する...

MySQLデスクトップツールSQLyogのリソースとアクティベーション方法は、白黒のコマンドラインに別れを告げます

では、早速リソースについて見ていきましょう。 123WORDPRESS.COM ダウンロードSQLy...