nginx - Socket.io + Flask 和前端 HTTPS 反向代理 & 后端 HTTP 反向代理
问题描述
因此,如果我尝试通过 https 访问网站,我的客户端 websocket 将无法连接到网络服务器。通过http它可以工作。我的设置如下:
我在传递请求的机器上本地有一个 python socketio webserver 和一个 http 反向代理(后端代理)。这工作得很好。
现在我有一个前端 https 反向代理,它将连接传递到后端,此时它会中断。websockets 现在无法连接。如果我的前端代理使用 http 它会再次工作。
客户端错误信息:
The connection to wss://frontend.example.com/socket.io/?EIO=3&transport=websocket&sid=92f50dc52f374c79baca0ecfd14f15b6 was interrupted while the page was loading.
我使用 flask-socketio 库并使用以下命令启动 python 应用程序:
app = f.Flask(__name__)
socketio = sockio.SocketIO(app)
socketio.run(app)
$ netstat -tulpen
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN 1000 86048 5619/python3.7
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 115411 6903/nginx: master
后端 nginx 配置:
server {
listen 0.0.0.0:80 ;
listen [::]:80 ;
server_name backend.example.com ;
location / {
proxy_pass http://127.0.0.1:5000;
}
location /socket.io {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header Accept-Encoding "";
}
}
前端 nginx 配置:
server {
listen 0.0.0.0:443 ssl http2 ;
listen [::]:443 ssl http2 ;
server_name frontend.example.com ;
location /.well-known/acme-challenge {
root /var/lib/acme/acme-challenge;
auth_basic off;
}
ssl_certificate /var/lib/acme/frontend.example.com/fullchain.pem;
ssl_certificate_key /var/lib/acme/frontend.example.com/key.pem;
ssl_trusted_certificate /var/lib/acme/frontend.example.com/full.pem;
location / {
set $nix_proxy_target "http://backend.example.com";
proxy_pass $nix_proxy_target;
}
location /socket.io {
set $nix_proxy_target "http://backend.example.com";
proxy_pass $nix_proxy_target;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header Accept-Encoding "";
}
}
解决方案
所以我发现这个错误是由socketio本身引起的,因为它的跨源策略没有设置为正确的url。
解决方案是添加以下内容:
socketio = sockio.SocketIO(
app, engineio_logger=DEBUG, cors_allowed_origins=["https://frontend.example.com"]
)
推荐阅读
- python - 如何将字典的键转换为单列熊猫数据框?
- visual-studio-code - 如何设置 Visual Studio Code 来编译和运行 C 代码?
- ansible - Ansible 模板忽略行尾差异 LF CRLF。插件?
- c# - 使用 TopShelf 创建 Windows 服务时出现“错误 1053 服务未响应”错误
- c# - 为什么计数器在线程池中不起作用
- javascript - 如何在 javascript 或 jquery 中使用变量作为数组键
- actionscript-3 - 在 AS3 中好的 Cast 有什么要求?
- c - 在嵌套 C 结构的部分初始化中苦苦挣扎 - 在“->”标记之前预期“=”
- unit-testing - 使用 CHAI 的测试设置器和获取器
- matlab - 使用 matlab GUI 编辑 .txt 文件中的特定数字 使用搜索/替换