【问题标题】:How to serve two sites with one nginx docker container?如何使用一个 nginx docker 容器服务两个站点?
【发布时间】:2019-12-09 11:41:35
【问题描述】:

我有一个使用npm webpack构建的webapp,生成一个文件夹,我将文件夹推送到centos文件夹,然后启动一个nginx docker来服务它,它工作正常,一些文件如下: nginx.yml:

version: '2'
services:
    nginx:
        image: nginx:1.14.0
        volumes:
            - ./../www:/usr/share/nginx/html
            # ./../www is /home/example1/www
            - ./nginx/site.conf:/etc/nginx/conf.d/default.conf
            - ./ssl:/etc/nginx/ssl
        ports:
            - "443:443"
            - "80:80"

和 site.conf:

server {
    listen 80 default;
    server_name example1.com www.example1.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443;
    index index.html;
    server_name localhost;
    error_log /var/log/nginx/error.log;

    ssl related ...

    location / {
        root /usr/share/nginx/html;
    }
    location /api {
        proxy_pass http://www.example1.com:8080/api;
    }
}

现在我想服务另一个站点(例如example2.com),所以我用npm webpack生成另一个文件夹,将它推送到/home/example2/www,因为这次nginx将服务两个站点,我删除

- ./../www:/usr/share/nginx/html

来自 nginx.yml 并在site.conf中添加一个端口为8081的服务器部分,并添加

root /home/example1/www;
root /home/example2/www;

在 site.conf 的每个服务器部分。然而这两个网站都不起作用,我在互联网上搜索,大多数帖子都建议设置一个 nginx-proxy,并将每个 webapp 托管在其他 docker 容器上。

一个 nginx docker 容器是否可以为两个站点提供服务? 以及如何?

【问题讨论】:

  • Ngnix 内置了反向代理支持,所以答案是肯定的。但 Docker 的一大优势是它的微服务方法。
  • 谢谢,受限于服务器数量,解决方案越简单越好。你能告诉为什么上面的配置不起作用吗?
  • 您是否尝试使用一个域创建两个网站,但使用前缀,例如/api
  • 两个站点:example1.com 和 example2.com,都访问同一主机中的 web api 应用程序(另一个 spring boot docker),我怀疑删除 ./../www: /usr/share/ nginx/html 导致了这个问题。
  • 找到了解决办法,在容器中创建两个文件夹,并将容器保存到一个新镜像中,在 nginx.yml 中创建两个卷。明天将发布答案。

标签: docker nginx


【解决方案1】:

nginx 映像包括位于 /etc/nginx/conf.d 中的所有 *.conf 文件。尝试运行此验证:docker run --rm -it nginx cat /etc/nginx/nginx.conf

这意味着您应该能够在其中放置任意数量的 conf 文件,而 nginx 会为它提供服务。

这意味着您可以像这样对站点文件和 conf 文件进行 volumize:

services:
    nginx:
        image: nginx:1.14.0
        volumes:
            - ./../www:/usr/share/nginx/html
            - ./../example1:/home/example1/www
            - ./nginx/site.conf:/etc/nginx/conf.d/default.conf
            - ./nginx/site2.conf:/etc/nginx/conf.d/site2.conf

在 site2.conf 中:

server_name example2.com www.example2.com;

location / {
    root /home/example1/www;
}

【讨论】:

  • 是的,除了需要基于运行的容器创建新镜像,因为原镜像不包含/home/example1/www,下次重启后会消失。
  • 我不知道你的意思。你是说example1源文件和example2不在同一个地方?
  • 是的,example1 和 example2 是不同的应用程序
  • 喜欢不同的 Dockerfile?为什么说 example1/www 将“在下次重新启动后消失”?我不明白你在说什么。
  • 我的意思是 /home/example1/www 不是 nginx 映像的一部分
猜你喜欢
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
相关资源
最近更新 更多