docker - Docker 上的 Websocket 与 nginx
问题描述
我正在尝试构建一个包含两部分的服务:后端和前端。两者都在不同的 docker 容器上,并通过 docker-compose 配置和 nginx 容器进行通信。
对于 https 访问,一切都很好,但是当我尝试使用 websocket 时,我有一个升级错误,即使 Nginx 配置得到了这个信息
错误信息 :websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'Connection' header
我正在使用fasthttp
andfasthttp/websocket
作为我的 Golang 后端。代码在 localhost 上运行(没有 nginx 配置),但是 Docker + nginx 的组合似乎破坏了一些东西。前端使用react
并且是一个简单的let socket = new WebSocket(
wss.mydomain.com/ws/uploadPicture/);
编辑 :
ctx.Request.Header.ConnectionUpgrade()
之前使用时upgrader.Upgrade
,结果是true
,但是ctx.Response.Header.ConnectionUpgrade()
是假的
谢谢 !
Golang 后端
var upgrader = websocket.FastHTTPUpgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(ctx *fasthttp.RequestCtx) bool {
return true
},
}
func InitRouter() func(*fasthttp.RequestCtx) {
router := fasthttprouter.New()
router.GET("/ws/uploadPicture/", doWS)
return router.Handler
}
func doWS(ctx *fasthttp.RequestCtx) {
err := upgrader.Upgrade(ctx, func(conn *websocket.Conn) {
//SHOULD DO STUFF
})
if (err != nil) {
logs.Error(err.Error()) //HIT THIS ERROR
return
}
}
...
fasthttp.ListenAndServe(`:8000`, InitRouter())
Nginx.conf
#############################################################################
## NGINX CONFIGURATION FOR THE WEBAPP
#############################################################################
upstream webapp {
server webapp:3000;
keepalive 4;
}
server {
listen [::]:443 ssl;
listen 443 ssl;
server_name mydomain.com;
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://webapp;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
#############################################################################
## NGINX CONFIGURATION FOR THE PROXY
#############################################################################
upstream proxy {
server proxy:8000;
keepalive 4;
}
server {
listen [::]:443 ssl;
listen 443 ssl;
server_name api.mydomain.com;
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Credentials' true;
proxy_pass http://proxy;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
#############################################################################
## NGINX CONFIGURATION FOR THE PROXY
#############################################################################
upstream proxyws {
server proxy:8000;
keepalive 4;
}
server {
listen [::]:443 ssl;
listen 443 ssl;
server_name wss.mydomain.com;
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_pass http://proxyws;
}
}
码头工人组成
#############################################################################
## IMAGE FOR THE PROXY
#############################################################################
proxy:
container_name: proxy
build: ./src/Proxy
restart: always
env_file: .env
ports:
- "8000:8000"
#############################################################################
## IMAGE FOR THE WEBAPP
#############################################################################
webapp:
container_name: webapp
build: ./src/Webapp
restart: always
volumes:
- ./src/Webapp:/home/app
- /home/app/.next
- /home/app/node_modules
ports:
- 3000:3000
#############################################################################
## IMAGE THE NGINX & CERTBOT FOR REVERSE PROXY
#############################################################################
nginx:
image: nginx:latest
container_name: nginx
volumes:
- ./data/nginx:/etc/nginx/conf.d
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
ports:
- 80:80
- 443:443
解决方案
我是 fasthttp 的 websocket 包的维护者。该问题已在 master 分支上修复。
下载它:
go get github.com/fasthttp/websocket@master
请再试一次。
如果问题仍然存在,请在https://github.com/fasthttp/websocket/issues中打开一个问题
很快,我将发布一个新版本。
推荐阅读
- macros - 如何匹配宏中的方法?
- javascript - Angular ng build --prod 在对象中结合数组和字符串抛出错误
- angular - Angular 6 - 将字节数组转换为 .docx
- python - python子进程和shlex
- php - 如果用户未登录,如何在 woocommerce 中隐藏付款选项?
- android - Firebase 应用程序邀请电子邮件中的链接不起作用
- eclipse - Eclipse - pyqt 应用程序在 MAC 的单独窗口中打开
- r - R - 用于排序变量的 ggplot
- haskell - 是什么使镜头中的 lengthOf 效率低下?
- php - php数组的数组合并