单个nginx配置中的多个NextJ应用程序

z4bn682m  于 2023-10-17  发布在  Nginx
关注(0)|答案(3)|浏览(144)

我有一个根目录/var/www/html/在上面的根目录我有多个项目示例project1project2
我想在nginx配置的单个文件中托管两个NextJ应用程序。
下面是我的nginx配置文件

location / {
            root /var/www/html/project1/;
            proxy_pass http://localhost:3000/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_hide_header Cache-Control;
            add_header Cache-Control "no-cache, no-store";
    }
    location /_next/static/ {
            alias /var/www/html/project1/.next/static/;
            expires 365d;
            access_log off;
    }
    location /blog/ {
            rewrite /blog/(.*) /$1 break;
            proxy_cache my_cache;
            root /var/www/html/project2/;
            proxy_pass http://localhost:3003/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_hide_header Cache-Control;
            add_header Cache-Control "no-cache, no-store";
    }
    location /blog/_next/static/ {
            alias /var/www/html/project2/.next/static/;
            expires 365d;
            access_log off;
    }

当我在生产服务器上运行项目2,即mydomain.com/blog时,chunk是从root而不是从blog提供服务的,例如:

mydomain.com/_next/static/chunks/4574.41d99ce27dfde7f6.js

预期结果-mydomain.com/blog/_next/static/chunks/4574.41d99ce27dfde7f6.js

**Edit-**我们也可以使用next.js.js。我的代码

const blogAppRewrites = [
  {
    source: "/",
    destination: "/blog",
  },
];

module.exports = {
  async rewrites() {
    return blogAppRewrites;
  },
};
iih3973s

iih3973s1#

这可能是因为您为第二个应用程序设置别名和proxy_pass的方式。在/blog/_next/static/ location中,使用别名directiv。但是对于/blog/位置,您使用的是root指令。我认为这可能是导致服务器在错误的位置查找文件,导致不正确的URL。您可以在/blog/位置中使用try_files指令,以允许Nginx从预期位置提供静态文件,并将剩余的请求路由到相应的代理。尝试这样的事情,

location /blog/ {
    rewrite /blog/(.*) /$1 break;
    root /var/www/html/project2/;
    try_files $uri @blog;  
}

location @blog {
    proxy_pass http://localhost:3003/;
    # Other proxy settings...
}
5lhxktic

5lhxktic2#

试试这个

location / {
    root /var/www/html/project1/;
    proxy_pass http://localhost:3000/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_hide_header Cache-Control;
    add_header Cache-Control "no-cache, no-store";
}

location /_next/static/ {
    alias /var/www/html/project1/.next/static/;
    expires 365d;
    access_log off;
}

location /blog/ {
    rewrite ^/blog/(.*) /$1 break; # Modified rewrite rule
    proxy_cache my_cache;
    root /var/www/html/project2/;
    proxy_pass http://localhost:3003/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_hide_header Cache-Control;
    add_header Cache-Control "no-cache, no-store";
}

location /blog/_next/static/ {
    alias /var/www/html/project2/.next/static/;
    expires 365d;
    access_log off;
}

这里的关键变化是位置/博客/块。重写规则已经修改,在将URI传递给上游服务器之前,从URI中删除了/blog/前缀。这确保了URL被第二个Next.js应用程序正确处理,并且块将从预期的/blog/_next/static/目录中提供。
在进行此更改之后,您的NGINX配置应该为两个Next.js应用程序提供正确子目录中的块。

0tdrvxhp

0tdrvxhp3#

您是否尝试过将基本路径添加到第二个项目中-这样它就知道它是从服务器获得的,并从服务器请求文件?
所以我觉得你应该试着

module.exports = {
  basePath: '/blog',
}

在您的项目2的next.config.js中。
就像这里描述的:https://nextjs.org/docs/pages/api-reference/next-config-js/basePath

相关问题