首页 > 解决方案 > docker 和 nginx:如何反向代理多个 postgresql 数据库

问题描述

我有一个带有多个 postgresql 数据库的 docker 容器:

version: "3.7"
services:
  nginx:
    image: nginx:1.18.0-alpine
    ports:
      - 8028:80
    volumes:
      - ./nginx/localhost/conf.d:/etc/nginx/conf.d
    depends_on:
      - webapp
    networks:
      - postgresql_network

  postgresql:
    image: "postgres:13-alpine"
    restart: always
    volumes:
      - type: bind
        source: ../DO_NOT_DELETE_POSTGRESQL_DATA
        target: /var/lib/postgresql/data
    environment:
      POSTGRES_DB: db1
      POSTGRES_USER: simha
      POSTGRES_PASSWORD: krishna
      PGDATA: "/var/lib/postgresql/data/pgdata"
    networks:
      - postgresql_network

  postgresql2:
    image: "postgres:13-alpine"
    restart: always
    volumes:
      - type: bind
        source: ../DO_NOT_DELETE_POSTGRESQL_DATA2
        target: /var/lib/postgresql/data
    environment:
      POSTGRES_DB: db2
      POSTGRES_USER: simha
      POSTGRES_PASSWORD: krishna
      PGDATA: "/var/lib/postgresql/data/pgdata"
    networks:
      - postgresql_network

networks:
  postgresql_network:
    driver: bridge

现在我可以为每个 postgresq 实例公开两个不同的端口,并从主机以不同的方式访问它们(如 localhost 5432 和 localhost 5445)

但不是那样,我想使用不同的域名来处理它们。

比如pg1.docker.db,port 8028(nginx 端口)和pg.docker.db,port 8028(nginx 端口),并使用 nginx 在内部将它们反向代理到不同的 docker 容器,使用postgresqlpostgresql2

在主机中,/etc/hosts我将拥有

127.0.0.1 pg1.docker.db
127.0.0.1 pg2.docker.db

我不确定,但类似的东西。有人能说我做得对吗

## WEBSERVER

upstream webapp {
    server webapp:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://webapp;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
}


## POSTGRESQL DBS

upstream postgres {
    server postgresql:5432;
}

upstream postgres2 {
    server postgresql2:5432;
}

server {
    listen 80 so_keepalive=on;
    server_name db1.domain.my;
    proxy_pass postgres;
}

server {
    listen 80 so_keepalive=on;
    server_name db2.domain.my;
    proxy_pass postgres2;
}

我发现人们使用streamand http。以上是否也有效。或者我应该做点什么

标签: postgresqldockernginx

解决方案


根据域名重定向 http 请求非常简单。你可以使用这样的东西:

http {
    server {
        listen 80;
        server_name pg1.docker.db
        location / {
            ...
        }
    }
    server {
        listen 80;
        server_name pg2.docker.db;
        location / {
            ...
        }
   }
} 

但是这里的问题是 nginx 只将 http 请求转发到服务器,所以除非你的容器后面有一个基于 Web 的接口,否则它不会正常工作。


推荐阅读