使用 nginx 和 docker 测试本地子域

Posted

技术标签:

【中文标题】使用 nginx 和 docker 测试本地子域【英文标题】:testing local subdomain with nginx and 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!

【问题讨论】:

你找到答案了吗?我正在尝试这样做 我们最终能够使它在生产中工作,我将在下面发布解决方案 【参考方案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

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

【讨论】:

以上是关于使用 nginx 和 docker 测试本地子域的主要内容,如果未能解决你的问题,请参考以下文章

单个服务器上的多个子域。码头工人 + NGINX @ EC2

coreOS 系统上的子域

在 Elastic Beanstalk 上使用 Nginx 在子域上配置 Laravel

每个域和子域的 Plesk nginx 配置

使用docker安装nginx

使用docker安装nginx