Jos*_*e A 7 nginx https mask websocket
现在有一个应用程序允许人们通过公开一个由Atmosphere提供支持的 AngularJS Web 服务器通过 Web 连接到桌面应用程序。桌面应用程序会公开当前人员的 IP 地址,以便拥有该地址的任何人都可以连接。
我试图通过我的服务器(example.com)代理来掩盖这个 IP。我的服务器目前托管一系列应用程序(Ruby on Rails + Elastic Search、Logstash、Kibana - ELK)并由 Nginx 客户端代理。
我已经设法通过节点 HTTP 代理(本地)成功屏蔽了 IP 地址,现在我正在尝试在使用 Nginx 时使其工作。AngularJS 应用程序使用 Websockets,所以我需要代理 HTTP 和 WS 请求。
我非常接近弄清楚一切。我在没有 Nginx 的情况下进行了本地测试,并且 IP 地址被正确屏蔽。我在让 Nginx 通过同一位置重定向 HTTP 和 Websockets 时遇到了挑战(请参阅代码)。
从所有教程和服务器故障帖子中,我看到 Websockets 通常指向不同的位置,而 Nginx 会优雅地升级连接。
我现在面临一个挑战,我试图通过相同的位置 HTTP/2 和 Websockets 协议进行代理。我已经诉诸邪恶的黑客,例如在location
块内使用 IF (但它们没有奏效)。
理想情况下,我希望 Websockets 指向与 HTTP 不同的位置,这将解决问题。我目前的问题是我没有 AngularJS 应用程序的源代码,以便我这样做。
Atmosphere 服务器似乎通过查询参数检测到 Websockets 连接(这是它连接到的 URL):
ws://the-user-ip/?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.3.2-javascript&X-Atmosphere-Transport=websocket&Content-Type=application/json&X-atmo-protocol=true.
Run Code Online (Sandbox Code Playgroud)
这是我当前来自 Nginx 的配置的一部分:
upstream ipmask_docker_app {
server ipmask:5050;
}
server {
server_name "~^\d+\.example\.co$";
# listen 80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# HTTPS config omitted due to conciseness.
location / {
# https://www.digitalocean.com/community/questions/error-too-many-redirect-on-nginx
# proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
# proxy_ignore_headers Set-Cookie;
# proxy_hide_header Set-Cookie;
# proxy_hide_header X-powered-by;
# 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 https;
proxy_set_header Host $http_host;
proxy_pass http://ipmask_docker_app;
proxy_http_version 1.1;
# Enables Websockets
# https://www.nginx.com/blog/websocket-nginx/
# /sf/answers/3267279011/
# Have the http_version 1.1 disabled. I want to know if it works
# THIS IS EVIL:
set $ws_header_upgrade '';
set $ws_value_upgrade '';
set $ws_header_connection '';
proxy_set_header 'Debug Header' $query_string;
if ($args ~* "X-Atmosphere-tracking-id") {
set $ws_header_upgrade Upgrade;
set $ws_value_upgrade $http_upgrade;
set $ws_header_connection "Upgrade";
}
proxy_set_header $ws_header_upgrade $ws_value_upgrade;
proxy_set_header Connection $ws_header_connection;
# limit_req zone=one;
access_log /var/www/cprint/log/nginx.access.log;
error_log /var/www/cprint/log/nginx.error.log;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我似乎无法将proxy_set_header Host $http_host;
和proxy_set_header Upgrade $http_upgrade
放在同一个location
块中。这就是为什么我尝试匹配的 query_string失败X-Atmosphere-tracking-id
并设置标题以升级它,以防它匹配它。
否则,如果我升级连接,我将无法看到加载的网页,因为它似乎不是代理 HTTP 协议而是代理 WS。
升级 Websockets 的唯一方法是让它指向不同的location
吗?或者有没有办法通过将它们指向同一个地方来升级(HTTP 和 WS)?
谢谢!
mkg*_*001 10
我发现的最简单的方法是根据“升级”标题跳转到不同的位置:
server {
# ...
location / {
try_files /nonexistent @$http_upgrade;
}
location @websocket {
# websocket related stuff
}
location @ {
# web related stuff
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8853 次 |
最近记录: |