【发布时间】:2019-07-05 13:12:10
【问题描述】:
我正在努力正确配置 nginx,以确保它可以处理 Express(端口 8081)和 Socket.io(端口 3000)的代理。这是我的配置,目前为整个请求产生 502 错误,而不仅仅是 Socket.io:
server {
root /var/www/example.com/public/;
index index.html index.htm index.nginx-debian.html;
server_name example.com;
location /socket.io/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:3000/;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / {
#try_files $uri $uri/ =404;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8081/;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
}
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name example.com;
return 404; # managed by Certbot
}
据我了解,我需要确保 Socket.io 使用的 Websocket 升级到 HTTP,但这是我努力掌握我需要做的事情的地方。大概 Socket.io 和 Express 都需要在不同的端口上运行,然后需要按照我上面的配置代理到 nginx。
如果我禁用 Express 代理并仅使用 nginx 来提供文件,那么我的资产就会被提供,但显然我需要它来处理 Express 和 Socket.io。
编辑:我正在运行 nginx 1.14,但查看 nginx 博客文章表明我至少需要 1.3 ......但它看起来已经有几年历史了,所以不确定为什么 Ubuntu 包管理器如此过时。由于上游,我没有收到配置错误,但错误日志中的连接被拒绝。
非常感谢任何帮助!
【问题讨论】:
-
1.您是否使用this example,允许在 1 个端口上工作? ~ 2. 是否需要对旧浏览器提供支持? Browsers released after 2013原生支持Websocket,需要这个重库吗?
-
嘿,我很确定我的配置与第 1 点相同,在那里或附近。我希望它们在不同的端口上。我开始重构以使用 Websocket 有点晚了,但我会尝试在未来找到时间:)
-
我希望这是两个共享代码的应用程序(否则它具有中等意义......)。在我看来,您使用的语法也被调用来处理其他块。你read this了吗?我认为,你应该使用
location ^~ /socket.io/ -
我最终将它们都绑定在同一个端口上,效果很好:) 我把事情复杂化了!
标签: node.js express nginx socket.io