docker - 通过 nginx 和 letsencrypt ssl 使用 docker 运行 Shiny 的应用程序

标签 docker nginx shiny reverse-proxy lets-encrypt

我想通过 nginx 反向代理和使用 docker 的 letsencrypt ssl 在我的域 ( www.myapp.com ) 上运行我的应用程序 (myapp)。一切看起来都很好,但我看不到我的应用程序在我的域上运行。

如果我在不使用反向代理和 SSL 的情况下运行我的 docker 应用程序,我可以看到我的应用程序在我的域上运行。

我做了以下事情:

  1. 运行代理
$ cd
$ mkdir certs

$ docker run -d -p 80:80 -p 443:443 \
    --name nginx-proxy \
    -v $HOME/certs:/etc/nginx/certs:ro \
    -v /etc/nginx/vhost.d \
    -v /usr/share/nginx/html \
    -v /var/run/docker.sock:/tmp/docker.sock:ro \
    --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true \
    jwilder/nginx-proxy

  1. 运行 Let's Encrypt 配套容器:
$ docker run -d \
    --name nginx-letsencrypt \
    --volumes-from nginx-proxy \
    -v $HOME/certs:/etc/nginx/certs:rw \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    jrcs/letsencrypt-nginx-proxy-companion

  1. 我的应用 dockerfile:
# get shiny server and R from the rocker project
FROM rocker/shiny:4.0.5

RUN apt-get update && apt-get install -y \
    sudo \
    gdebi-core \
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libxt-dev \
    libssl-dev \
    libxml2 \
    libxml2-dev \
    libsodium-dev

# install R packages required 
# Change the packages list to suit your needs
RUN R -e "install.packages(c('shiny', 'shinythemes', 'dygraphs', 'shinyWidgets', 'manipulateWidget', 'DT', 'zoo', 'shinyjs','emayili', 'wordcloud2', 'rmarkdown', 'xts', 'shinyauthr', 'curl', 'jsonlite', 'httr'), repos='http://cran.rstudio.com/')"

# copy the app directory into the image
WORKDIR /srv/shiny-server/myapp/app
COPY app .

# run app
EXPOSE 80
CMD ["R", "-e", "shiny::runApp('/srv/shiny-server/myapp/app',  host = '0.0.0.0', port = 8080)"]


  1. 最后,我构建并运行了我的 docker 应用程序:
$ cd /srv/shiny-server/myapp
$ sudo docker build -t myapp .

$ docker run -d \
    --name mysite \
    -e 'LETSENCRYPT_EMAIL=info@myapp.com' \
    -e 'LETSENCRYPT_HOST=myapp.com' \
    -e 'VIRTUAL_HOST=myapp.com' myapp

不幸的是,当我访问我的域时,我看到一个包含以下消息的页面:

http://myapp.com -> 502 错误网关 nginx/1.21.6

https://myapp.com -> 500 内部服务器错误 nginx/1.21.6

我看不到我的应用正在运行。

如果我在运行 nginx-proxy 和 nginx-letsencrypt 容器后运行以下命令,

$ docker run -d \
    --name nginx \
    -e 'LETSENCRYPT_EMAIL=info@myapp.com' \
    -e 'LETSENCRYPT_HOST=myapp.com' \
    -e 'VIRTUAL_HOST=myapp.com' nginx

我能看到:

http://myapp.com -> 欢迎使用 nginx!

https://myapp.com -> 500 内部服务器错误 nginx/1.21.6

如果我只运行 nginx-proxy 和 nginx-letsencrypt 容器,我会得到以下信息:

http://myapp.com -> 503 服务暂时不可用 nginx

https://myapp.com -> 503 服务暂时不可用 nginx

最佳答案

也许这里有多个问题。

  1. 端口
    在您的 Dockerfile 中,您编写了 EXPOSE 80,然后您开始使用端口 8080 Shiny 。
    您应该改为编写 EXPOSE 8080。当您启动应用程序容器时,您可能必须指定 VIRTUAL_PORT .

  2. SSL 证书
    我认为,nginx 对证书不满意。 500 总是意味着服务器端有问题。
    查看nginx的日志(docker logs nginx-proxy)。
    一般来说,我建议避免 dockerized 证书(它们非常复杂并且经常导致错误)。看看我的其他答案的第 4 点:Can't enable ssl by docker-letsencrypt-nginx-proxy-companion

  3. 未使用的坐骑
    也许我错了,但我认为有些卷是没有必要的。比如-v/etc/nginx/vhost.d

祝你好运。

关于docker - 通过 nginx 和 letsencrypt ssl 使用 docker 运行 Shiny 的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73266324/

相关文章:

docker - 将静态文件从Docker容器复制到非空命名卷

python - 使用 docker 时 ImportError : No module named appengine. ext

node.js - 如何更改谷歌计算中的权限以便 Node 可以写入文件?

regex - 在 Nginx 中,如何匹配整个 URL 和查询字符串并重定向到 URL 和查询字符串

css - Shiny 的 tabsetPanel 中的背景颜色

image - 改为从本地 docker 镜像中拉取

docker - curl 在 docker 构建期间不起作用

python - uwsgi_response_write_body_do() 超时——但是 uwsgi_read_timeout 没有帮助(x-post)

r - 如何在 Shiny 中保存传单 map

R Shiny : Strange behavior of the brush functionality with ggplot2