我编写了一个shiny Web应用程序,并使用ShinyProxy将其部署在服务器上。直接通过IP地址和端口8080访问应用程序可以正常工作。但是,我需要将其连接到URL。在ShinyProxy website上,有一个关于它如何与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)?
答案 0 :(得分: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/