0

我编写了一个闪亮的Web 应用程序并使用ShinyProxy将其部署在服务器上。通过 IP 地址和端口 8080 直接访问应用程序可以正常工作。但是,我需要将其连接到 URL。在 ShinyProxy网站上有一个关于它如何与 Nginx 一起工作的解释:

server {
  listen                80;
  server_name           shinyproxy.yourdomain.com;
  rewrite     ^(.*)     https://$server_name$1 permanent;
}

server {
  listen                443;
  server_name           shinyproxy.yourdomain.com;
  access_log            /var/log/nginx/shinyproxy.access.log;
  error_log             /var/log/nginx/shinyproxy.error.log error;

  ssl on;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  ssl_certificate       /etc/ssl/certs/yourdomain.com.crt;
  ssl_certificate_key   /etc/ssl/private/yourdomain.com.key;

   location / {
       proxy_pass          http://127.0.0.1:8080/;

       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_read_timeout 600s;

       proxy_redirect    off;
       proxy_set_header  Host             $http_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;
     }

}

不幸的是,我需要使用 Apache,即 Apache/2.4.43 (Debian)。我尝试了各种配置,但我没有让它工作。只需将目标 URL 连接到服务器上的端口,我就可以首先加载应用程序。虽然加载应用程序后,屏幕立即变灰,应用程序无响应。发生这种情况是因为简单地将 URL 链接到 IP 地址并不能正确说明 Web 套接字的使用。

有谁知道正确的 Apache 文件应该是什么样子?如何将不需要用户身份验证的应用程序连接到 URL(例如上面提到的 shinyproxy.yourdomain.com)?

4

1 回答 1

1

如果您有 websocket 端点的唯一 URL,只需加载 mod_proxy_wstunnel 并首先定位该流量。在下面的示例中,/Silly/ws 是 websocket 端点:

ProxyPassMatch ^/(Silly/ws)$ ws://localhost:9080/$1
ProxyPass / http://localhost:9080/

当前版本的 Apache 不能很好地处理单个 URL 用于非升级和升级流量的情况。如果您遇到这种情况,您可以使用这样的片段有条件地在任何代理 URL 上执行 websockets:

ProxyPass / http://localhost:9080/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:9080/$1" [P,L]

未来的 2.4.x 版本可能会支持一个简单的场景,比如当前的 httpd 主干:

ProxyPass / ws:/localhost:9080/
ProxyPass / http://localhost:9080/
于 2020-08-09T17:00:20.327 回答