我已经配置了流星服务器并设置了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>/booking
答案 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_timeout
和proxy_send_timeout
,因为websocket协议存在问题:
默认情况下,如果代理服务器执行连接,则会关闭连接 不会在60秒内传输任何数据。可以增加此超时 使用proxy_read_timeout指令
所以我也设置了超时值:
proxy_read_timeout 36000s;
proxy_send_timeout 36000s;
proxy_set_header Connection "upgrade";
总结我的设置如下(使用您的应用凭据):
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目录(部署应用程序的目录,请参阅上面的文件夹结构)并相应地更改location
和proxy_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;
}
}