shiny如何监听非127.0.0.1的请求以及指定端口

Shiny 服务器中,默认情况下,它只监听 127.0.0.1(本地回环地址),这意味着外部设备无法访问。如果你希望 Shiny 监听外部请求(如局域网或公网),可以通过以下方法配置 host 选项。


方法 1:修改 runApp()shinyApp()host 参数

默认情况下,Shiny 服务器使用 127.0.0.1 作为 host,你可以将其改为 0.0.0.0,让它监听所有可用的网络接口。

示例:使用 runApp()

library(shiny)

# 运行 Shiny 应用,监听所有 IP 地址
runApp("app_directory", host = "0.0.0.0", port = 3838)

示例:使用 shinyApp()

library(shiny)

ui <- fluidPage(
  titlePanel("Shiny 监听所有 IP 请求"),
  sidebarLayout(
    sidebarPanel(),
    mainPanel(h3("外部设备可以访问"))
  )
)

server <- function(input, output) {}

# 运行 Shiny 服务器,监听所有 IP 地址
shinyApp(ui, server, options = list(host = "0.0.0.0", port = 3838))

解释:

  • host = "0.0.0.0":让 Shiny 监听 所有 IP 地址(包括本机、局域网和公网)。
  • port = 3838:设置服务器端口为 3838(可修改为其他端口)。

方法 2:修改 options(shiny.host)

全局配置 中设置 shiny.host,确保 Shiny 监听外部请求:

options(shiny.host = "0.0.0.0")
shinyApp(ui, server)

或者:

options(shiny.host = "0.0.0.0", shiny.port = 3838)
runApp("app_directory")

方法 3:使用 Shiny Server 监听外部请求

如果你运行的是 Shiny Server(如 Ubuntu 服务器上部署的 Shiny),你需要编辑 Shiny Server 配置文件/etc/shiny-server/shiny-server.conf)。

  1. 打开配置文件:
    sudo nano /etc/shiny-server/shiny-server.conf
    
  2. 找到 listen 相关的行,修改为:
    server {
        listen 3838 0.0.0.0;
    }
    
  3. 保存并重启 Shiny Server:
    sudo systemctl restart shiny-server
    

这样,Shiny Server 就可以监听外部请求了!


方法 4:确保防火墙和端口开放

如果 Shiny 仍然无法访问,请检查:

  1. 本机防火墙 是否阻止了端口:
    sudo ufw allow 3838/tcp  # Ubuntu/Debian
    sudo firewall-cmd --add-port=3838/tcp --permanent  # CentOS/RHEL
    sudo firewall-cmd --reload
    
  2. 云服务器(如 AWS、GCP、Aliyun) 需要在安全组规则中开放 3838 端口。

方法 5:使用 nginx 反向代理(推荐公网访问)

如果你希望 Shiny 在公网可访问,建议用 nginx 反向代理,而不是直接暴露 Shiny 端口:

  1. 安装 nginx
    sudo apt install nginx  # Ubuntu/Debian
    sudo yum install nginx  # CentOS
    
  2. 编辑 nginx 配置:
    sudo nano /etc/nginx/sites-available/shiny
    
  3. 添加以下内容:
    server {
        listen 80;
        server_name your_domain_or_ip;
    
        location / {
            proxy_pass http://127.0.0.1:3838/;
            proxy_redirect off;
            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;
        }
    }
    
  4. 启用配置:
    sudo ln -s /etc/nginx/sites-available/shiny /etc/nginx/sites-enabled/
    sudo systemctl restart nginx
    
  5. 外部设备可以通过 http://your_domain_or_ip 访问 Shiny 应用!

总结

方案 适用场景 关键代码
方法 1:runApp() 设置 host 直接运行 Shiny 应用 runApp("app", host = "0.0.0.0", port = 3838)
方法 2:全局 options 代码级别修改 options(shiny.host = "0.0.0.0")
方法 3:Shiny Server 配置 部署在 Shiny Server listen 3838 0.0.0.0;
方法 4:开放防火墙端口 服务器防火墙问题 sudo ufw allow 3838/tcp
方法 5:nginx 反向代理 公网访问安全优化 proxy_pass http://127.0.0.1:3838/;

你可能感兴趣的:(运维,前端,数据库)