使用Meteor Server将Proxy_pass发送到url NGINX

时间:2018-02-02 14:50:10

标签: nginx meteor reverse-proxy

我已经配置了流星服务器并设置了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文件中。

enter image description here

如果我删除上面的nginx子域配置并转到子域它可以正常工作,加载路由应用程序。我假设我错过了正确加载应用程序的东西。

仅当我proxy_pass到网址<url>/booking

内的路由时,才会出现此问题

2 个答案:

答案 0 :(得分:0)

我有类似的设置,我在几个子域上配置了不同的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;
}

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

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

答案 1 :(得分:0)

解决问题的方法有很多种。

1 - 如果是404,请尝试后备选项而不在网址中预订

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;
      }

}