怎样将 Angular 项目部署到 Nginx 子目录中

Lasted 2020-11-27 19:50:37

项目开发完成后,如果要把项目部署到 Nginx 的二级目录,需要进行一些设置才能找到资源文件。下面用一个新建的 Welcome 项目部署到 Nginx 的 /admin 子目录下来讲解部署过程。

创建项目

创建一个 Welcome 项目,如果是部署到根目录,直接使用 ng build --prod 编译后部署到 Nginx ,修改 rewrite 规则即可。

ng new ng-build
编译生成环境项目
ng build --prod

如果把上面生成的项目直接复制到根目录即可成功部署项目,如果是需要路由的项目需要配置 Nginx 的 rewrite。上面编译的项目放到二级目录 /admin 下面页面会出现空白,错误提示找不到 runtime 和 main 等文件。

可通过下面的方法解决二级目录问题。

修改 HTML base

修改编译后 index.html 文件的 base 为 /admin/ 如下所示:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>NgBuild</title>
  <base href="/admin/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
</body>
</html>

编译时增加参数

编译时增加 --base-href 参数,指定需要部署的目录。

ng build --base-href /admin/ --prod

修改 angular.json

在 angular.json 文件中找到 production 下面的 fileReplacements,在同级后面添加 baseHref 参数,表示部署时的二级目录,如下所示:

...
"production": {
  "fileReplacements": [
    {
      "replace": "src/environments/environment.ts",
      "with": "src/environments/environment.prod.ts"
    }
  ],
  "baseHref": "/admin/",
  "optimization": true,
  "outputHashing": "all",
  "sourceMap": false,
  ...

以上三种方法都可以完成 Nginx 二级目录的部署。

配置 Nginx

如果 Angular 项目带有 Router(路由)功能,需要设置 Nginx 的 rewrite 如下所示。

server {
  root /html;
  location /admin/ {
    try_files $uri $uri/ /index.html;
  }
}