【问题标题】:Proxy_pass to url NGINX with a Meteor ServerProxy_pass 到带有 Meteor 服务器的 url NGINX
【发布时间】:2018-07-13 02:28:12
【问题描述】:

我已经配置了一个流星服务器并设置了 nginx 配置。但是,当配置动态子域以指向 Web 应用程序的特定部分时,该路由有效,它会在加载流星文件时在浏览器上产生 404 错误。

我正在尝试将所有*.domain.com 指向http://localhost:3000/booking/

我的配置是:

server {

        server_name *.domain.com;
        listen 80;

        location / {
            proxy_pass http://localhost:3000/booking/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade; #for websockets
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
         }

}

404 出现在 Meteor JS 文件中。

如果我删除上面的 nginx 子域配置并转到一个子域,它可以正常工作,加载路由应用程序。我假设我缺少正确加载应用程序的内容。

仅当我 proxy_pass 到 URL <url>/booking 内的路由时才会出现此问题

【问题讨论】:

  • 你的网址变成http://localhost:3000/booking/380......js?meteor....,我认为这完全无效?这就是 404 的原因。它位于 http://localhost:3000/3850....js
  • 是的,根 URL 发生了变化,需要指向没有 booking 的根。我该怎么做?
  • @Allreadyhome,所以,如果你确实从proxy_pass 中删除/booking/,那么整个事情都会奏效吗?那么什么是行不通的——你真正想做的是什么,你在做这件事时遇到了什么问题?!
  • @Allreadyhome 你试过我的设置了吗?

标签: nginx meteor reverse-proxy


【解决方案1】:

我有一个类似的设置,我在几个子域上配置了不同的 Meteor 应用程序,并在域根目录上配置了一个静态网站,所有这些都指向不同的端口。

这是我的设置步骤。

文件夹结构、位置和代理通道

首先要考虑的是文件夹结构。根据您的子域的 VHost-root 目录,您的子域的应用程序文件夹有一个相对路径。

想象一下下面的设置:

/www (dir, usually under /var)
  /domain (dir)
    /websitexy (dir, a static website is deployed under this dir)
    /subdomain (dir)
      /books (dir, subdomain app is deployed under this dir)

对于这样的设置,我使我的 nginx 配置指向子域中的应用程序位置:

location /books {

我在第一次启动我的应用程序时遇到了类似的问题。我发现的一件事是,在我的私人 ip/port 组合上设置 proxy_pass 时,我的配置有效:

proxy_pass http://172.x.x.x:3000;

这还涉及在此条目的端口号之后删除路由名称 (/books)。现在您的代理通行证涉及您的子域内的所有路由。

路由注意事项

请注意,此处的路由可能会造成混淆。通过设置location 属性,您可以在 nginx 级别(服务器的目录结构)设置路由,这就是您的代理通道中没有路由的原因。

您的应用程序可能定义了自己的内部路由。重要的是,您的应用程序的内部路由器会根据它的应用程序您的根目录检索所有请求。这就是为什么让代理传递不要在端口号后面包含任何路径很重要的原因。

Websocket

我已经阅读了一些关于nginx and websocket 连接的文章。基本上我的初始设置来自这篇文章,看起来像来自this documentation article

location /app {
    proxy_pass 172.x.x.x;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

我还必须添加 proxy_read_timeoutproxy_send_timeout,否则 websocket 协议存在问题:

默认情况下,如果代理服务器关闭连接 60 秒内不传输任何数据。可以增加此超时 使用 proxy_read_timeout 指令

所以我也设置了超时值:

proxy_read_timeout 36000s;
proxy_send_timeout 36000s;
proxy_set_header Connection "upgrade";

阅读更多关于 herehere 的信息。

总结我的设置如下(使用您的应用凭据):

location /books {
    proxy_pass http://172.x.x.x:3000;
    proxy_http_version 1.1;
    proxy_read_timeout 36000s;
    proxy_send_timeout 36000s;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
}

因此,为了解决您的问题,您可以检查您的虚拟主机目录(部署您的应用程序的目录,请参阅上面的文件夹结构)并相应地更改您的 locationproxy_pass 设置。

如果这不起作用,您可能需要添加更多错误输出,例如尝试连接时的日志摘录。

【讨论】:

    【解决方案2】:

    有不同的方法来解决这个问题。

    1 - 如果出现 404,请尝试使用后备选项而不在 url 中预订

    server {
    
            server_name *.domain.com;
            listen 80;
    
            location / {
                proxy_pass http://localhost:3000/booking/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade; #for websockets
                proxy_set_header Connection $connection_upgrade;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
                error_page 404 = @fallback;
             }
    
          location @fallback {
                proxy_pass http://localhost:3000/$request_uri;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade; #for websockets
                proxy_set_header Connection $connection_upgrade;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
          }
    
    }
    

    2 - 为 js 和 css 设置单独的块

    server {
    
            server_name *.domain.com;
            listen 80;
    
            location / {
                proxy_pass http://localhost:3000/booking/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade; #for websockets
                proxy_set_header Connection $connection_upgrade;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
             }
    
          location ~ \.(js|css|font)$ {
                proxy_pass http://localhost:3000/$request_uri;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
          }
    
    }
    

    【讨论】:

    • 这样做会产生proxy_pass" cannot have URI part in location given by regular expression 错误
    • 这成功地允许重新启动 nginx 服务器,但在项目找不到 Meteor JS 的情况下存在相同的 404 问题。您可以通过这里 bob.badgerbookings.com 看到这一点。转到badgerbookings.com 可以正常加载项目。
    • 您可以尝试将proxy_intercept_errors on; 也添加到此配置中吗?我想我可能错过了,它的情况是 404 直接回复给客户
    • 使用两种配置进行测试时仍然出现相同的 404 错误。我想知道 Meteor 项目中是否需要设置一些东西?
    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2017-09-06
    • 2016-06-09
    • 2016-03-10
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多