【问题标题】:testing local subdomain with nginx and docker使用 nginx 和 docker 测试本地子域
【发布时间】:2019-01-26 12:03:20
【问题描述】:

我正在尝试在我的 Mac 上本地设置一个简单的 Web 堆栈。

  • nginx 作为反向代理
  • react web 应用 #1 将在 localhost 上提供服务
  • react web 应用程序 #2 将在 demo.localhost 上提供

我正在使用 docker-compose 一次旋转所有服务,这是文件:

version: "3"

services:
    nginx:
      container_name: nginx
      build: ./nginx/
      ports:
        - "80:80"
      networks:
        - backbone
    landingpage:
      container_name: landingpage
      build: ./landingpage/
      networks:
        - backbone
      expose:
        - 3000
    frontend:
      container_name: frontend
      build: ./frontend/
      networks:
        - backbone
      expose:
        - 3001

networks:
  backbone:
    driver: bridge

这里是 nginx 配置文件(使用 Dockerfile 中的 COPY 命令复制到容器中):

worker_processes  1;

events {
    worker_connections  1024;
}

http {
      include /etc/nginx/mime.types;
      gzip  on;
      gzip_http_version 1.1;
      gzip_comp_level 2;
      gzip_types text/plain text/css
      application/x-javascript text/xml
      application/xml application/xml+rss
      text/javascript;

      upstream landingpage {
          server landingpage:3000;
      }

      upstream frontend {
          server frontend:3001;
      }

      server {
          listen 80;
          server_name localhost;
          location / {
              proxy_pass http://landingpage;
          }
      }

      server {
          listen 80;
          server_name demo.localhost;
          location / {
              proxy_pass http://frontend;
          }
      }
}

我可以成功运行docker-compose up,但只能打开web应用,而demo.localhost没有。

我还更改了我的 Mac 上的主机文件内容,所以我有

127.0.0.1 localhost
127.0.0.1 demo.localhost

无济于事。

恐怕我错过了什么,因为我既不是 Web 开发专家,也不是 docker 或 nginx!

【问题讨论】:

  • 你找到答案了吗?我正在尝试这样做
  • 我们最终能够使它在生产中工作,我将在下面发布解决方案

标签: docker nginx localhost subdomain local


【解决方案1】:

这对我有用。不同之处可能是我使用的是假域名,但我不能肯定。我也在使用 ssl,因为我无法让 Firefox 通过 http 访问假域名。我正在将子域路由到 Couchdb。 webclient 服务是parcel-bundler 开发服务器。

/etc/hosts

127.0.0.1   example.local
127.0.0.1   www.example.local
127.0.0.1   db.example.local

develop/docker-compose.yaml

version: '3.5'

services:
  nginx:
    build:
      context: ../
      dockerfile: develop/nginx/Dockerfile
    ports:
      - 443:443
  couchdb:
    image: couchdb:3
    volumes:
      - ./couchdb/etc:/opt/couchdb/etc/local.d
    environment:
      - COUCHDB_USER=admin
      - COUCHDB_PASSWORD=password
  webclient:
    build:
      context: ../
      dockerfile: develop/web-client/Dockerfile
    volumes:
      - ../clients/web/src:/app/src
    environment:
      - CLIENT=web
      - COUCHDB_URL=https://db.example.local

开发/nginx/Dockerfile

FROM nginx
COPY develop/nginx/conf.d/* /etc/nginx/conf.d/
COPY develop/nginx/ssl/certs/* /etc/ssl/example.local/

develop/nginx/conf.d/default.conf

server {
    listen 443 ssl;
    ssl_certificate      /etc/ssl/example.local/server.crt;
    ssl_certificate_key  /etc/ssl/example.local/server.key.pem;
    server_name  example.local www.example.local;
    location / {
        proxy_pass http://webclient:1234;
    }
}

server {
    listen 443 ssl;
    ssl_certificate      /etc/ssl/example.local/server.crt;
    ssl_certificate_key  /etc/ssl/example.local/server.key.pem;
    server_name db.example.local;
    location / {
        proxy_pass http://couchdb:5984/;
    }
}

develop/web-client/Dockerfile

FROM node:12-alpine
WORKDIR /app

COPY clients/web/*.config.js ./
COPY clients/web/package*.json ./
RUN npm install

CMD ["npm", "start"]

Here is the blog 显示如何生成自签名证书。

【讨论】:

    【解决方案2】:

    供参考:我们能够使用 AWS ligthsail 远程运行此程序,使用以下设置

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
      include /etc/nginx/mime.types;
      gzip  on;
      gzip_http_version 1.1;
      gzip_comp_level 2;
      gzip_types text/plain text/css
      application/x-javascript text/xml
      application/xml application/xml+rss
      text/javascript;
    
      upstream landingpage {
          server landingpage:5000;
      }
    
      upstream frontend {
          server frontend:5000;
      }
    
      server {
          listen 80;
          if ($http_x_forwarded_proto != 'https') {
            return 301 https://$host$request_uri;
          }
          server_name domain.com www.domain.com;
          location / {
              proxy_pass http://landingpage;
          }
      }
    
      server {
          listen 80;
          if ($http_x_forwarded_proto != 'https') {
            return 301 https://$host$request_uri;
          }
    
          server_name demo.domain.com www.demo.domain.com;
          location / {
              add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex";
              proxy_pass http://frontend;
          }
      }
    }
    

    为两个反应应用程序使用以下 dockerfile(基本上为两个服务公开端口 5000)

    FROM node:latest 
    
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    
    COPY package.json /usr/src/app/
    RUN npm install --verbose
    
    COPY . /usr/src/app
    
    RUN npm run build --production
    RUN npm install -g serve
    
    EXPOSE 5000
    CMD serve -s build
    

    很遗憾,我无法提供有关在本地计算机上执行此操作的更多详细信息

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 1970-01-01
      • 2012-04-23
      • 2018-11-10
      • 1970-01-01
      • 2013-02-22
      • 2021-12-23
      • 2018-04-03
      • 2020-08-08
      相关资源
      最近更新 更多