【问题标题】:docker and nginx: How to reverse proxy multiple postgresql databasesdocker 和 nginx:如何反向代理多个 postgresql 数据库
【发布时间】:2021-08-21 06:25:40
【问题描述】:

我有一个包含多个 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,端口8028(nginx 端口)和pg.docker.db,端口8028(nginx 端口),并使用nginx 在内部使用postgresqlpostgresql2 将它们反向代理到不同的docker 容器

在主机/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;
}

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

【问题讨论】:

  • 您必须制定自己的协议并为此创建切换器进程。 PostgreSQL 协议对此没有概念,我假设 Nginx 在这里只是一个 TCP 代理

标签: postgresql docker nginx


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2020-11-28
    • 2021-11-13
    • 2020-04-16
    • 2015-02-09
    • 1970-01-01
    • 2018-05-31
    • 2018-10-10
    相关资源
    最近更新 更多