Apache 反向代理和 ShinyProxy
Apache Reverse Proxy and ShinyProxy
我写了一个 shiny web application and deploy it on a server using ShinyProxy. Accessing the app directly via the IP address and port 8080 works fine. However, I need to connect it to a URL. On the ShinyProxy website 有一个关于它如何与 Nginx 一起工作的解释:
server {
listen 80;
server_name shinyproxy.yourdomain.com;
rewrite ^(.*) https://$server_name 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 地址并不能正确说明网络套接字的使用。
有谁知道正确的 Apache 文件应该是什么样子的?如何将不需要用户身份验证的应用程序连接到 URL(例如上面提到的 shinyproxy.yourdomain.com)?
如果您有一个唯一的 URL 用于 websocket 端点,只需加载 mod_proxy_wstunnel 并首先定位该流量。在下面的示例中,/Silly/ws 是 websocket 端点:
ProxyPassMatch ^/(Silly/ws)$ ws://localhost:9080/
ProxyPass / http://localhost:9080/
当前版本的 Apache 不能很好地处理单个 URL 用于 non-upgraded 和升级流量的情况。如果你有这种情况,你可以使用这样的代码片段有条件地在任何代理 URLs:
上做 websockets
ProxyPass / http://localhost:9080/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:9080/" [P,L]
未来的 2.4.x 版本可能会支持像当前 httpd trunk 这样的简单场景:
ProxyPass / ws:/localhost:9080/
ProxyPass / http://localhost:9080/
我写了一个 shiny web application and deploy it on a server using ShinyProxy. Accessing the app directly via the IP address and port 8080 works fine. However, I need to connect it to a URL. On the ShinyProxy website 有一个关于它如何与 Nginx 一起工作的解释:
server {
listen 80;
server_name shinyproxy.yourdomain.com;
rewrite ^(.*) https://$server_name 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 地址并不能正确说明网络套接字的使用。
有谁知道正确的 Apache 文件应该是什么样子的?如何将不需要用户身份验证的应用程序连接到 URL(例如上面提到的 shinyproxy.yourdomain.com)?
如果您有一个唯一的 URL 用于 websocket 端点,只需加载 mod_proxy_wstunnel 并首先定位该流量。在下面的示例中,/Silly/ws 是 websocket 端点:
ProxyPassMatch ^/(Silly/ws)$ ws://localhost:9080/
ProxyPass / http://localhost:9080/
当前版本的 Apache 不能很好地处理单个 URL 用于 non-upgraded 和升级流量的情况。如果你有这种情况,你可以使用这样的代码片段有条件地在任何代理 URLs:
上做 websocketsProxyPass / http://localhost:9080/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:9080/" [P,L]
未来的 2.4.x 版本可能会支持像当前 httpd trunk 这样的简单场景:
ProxyPass / ws:/localhost:9080/
ProxyPass / http://localhost:9080/