Как использовать nginx (установлен в Docker) для обратного прокси-сервера MySQL (также установлен в Docker)

Вот docker-compose.yaml

services:
  nginx:
    image: nginx:1.23.3
    container_name: nginx
    volumes:
      - /lnmpg/nginx/conf.d:/etc/nginx/conf.d:ro,cached
      - /lnmpg/nginx/nginx.conf:/etc/nginx/nginx.conf :ro
      - /lnmpg/nginx/log:/var/log/nginx
      - /lnmpg/nginx/html:/usr/share/nginx/html
    ports:
      - "80:80"
      - "443:443"
      - "33060:3306"
    environment:
        - TZ=Asia/Shanghai
    restart: always
    networks:
      - nginx-mysql
  mysql:
      image: mysql:5.7.41
      # ports:
      # - "3307:3306"
      environment:
          - TZ=Asia/Shanghai
          - MYSQL_ROOT_PASSWORD=Xqw@1023
      volumes:
          - /lnmpg/mysql/init:/docker-entrypoint-initdb.d
          - /lnmpg/mysql/my.cnf:/etc/mysql/my.cnf :ro
          - /lnmpg/mysql/data:/var/lib/mysql
          - /lnmpg/mysql/log:/var/log/mysql 
      restart: always
      networks:
        - nginx-mysql

А вот nginx.conf

stream {
    log_format basic '$remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time';
    access_log logs/stream-access.log debug buffer=32k;
    server {
        listen 33060;
        proxy_pass mysql:3306;
           }  
       }

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Я не знаю, что пошло не так, просто не смог подключиться к mysql с портом 33060 хоста. Если я отменю комментарий к портам в docker-compose.yml, я смогу получить к нему обычный доступ с помощью 3307. Эти два контейнера находятся под одним и тем же сеть: nginx-mysql, поэтому mysql:3306 в nginx.conf должен распознаваться контейнером докеров как mysql's ip:3306 Я неправильно понял функцию network или мои файлы конфигурации были неправильными? Кстати эти два докера находятся в одном файле docker-composer. Так что networks не надо, верно?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не можете этого сделать. nginx в основном является прокси для HTTP (протокол передачи гипертекста). Это не поможет вам подключиться к совершенно другому протоколу, такому как MYSQL.

Возможно, вы можете объяснить в своем вопросе, почему вы пытаетесь проксировать доступ к MySQL в первую очередь.

Я только что видел, как кто-то сделал это, кроме того, они сказали, что это более безопасно для баз данных. И иногда к базе данных нельзя получить прямой доступ из Интернета, поэтому им нужен сервер перехода, как и nginx. На самом деле, мне также любопытно , действительно ли это необходимо делать?

StupidPz 29.01.2023 23:36

Спасибо @StupidPz Не знал этого. Вход в него прямо сейчас.

Pablo Santa Cruz 02.02.2023 18:46
Ответ принят как подходящий

То, что вы делаете, должно работать. Однако я могу заметить небольшую ошибку, заключающуюся в том, что вы сопоставляете порт 3306 с контейнером Nginx, но он прослушивает порт 33060. Думаю, я бы заставил Nginx прослушивать порт 3306, изменив строку в файле конфигурации на

listen 3306;

При желании вы также можете изменить файл docker-compose, чтобы вместо этого он отображал порт 33060 в контейнере.

Я не могу определить, что не так с вашими файлами, но вот минимальная работающая установка:

nginx.conf

events { }

stream {
  server {
    listen 3306;
    proxy_pass mysql:3306;
  }
}

докер-compose.yml

version: '3'

services:
  proxy:
    image: nginx
    ports:
      - 3306:3306
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
  mysql:
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=myrootpassword
      - MYSQL_DATABASE=mydatabase
      - MYSQL_USER=myuser
      - MYSQL_PASSWORD=mypassword

Запустите и протестируйте с помощью

docker-compose up -d
docker run --rm --add-host host.docker.internal:host-gateway mysql mysql -h host.docker.internal -u myuser -pmypassword -e "show databases;"

попытался изменить порт прослушивания nginx на 3306 и изменил сопоставление портов на «3306: 3306», но это все равно не работает.

StupidPz 30.01.2023 14:02

Я не могу определить, что не так с вашими файлами. Я добавил свою минимальную настройку, которую использовал для тестирования. Я надеюсь, что вы можете работать с этим, чтобы выяснить, что не так.

Hans Kilian 30.01.2023 14:35

наконец выяснить причину. ` :ro` , не должно быть пробела перед :ro

StupidPz 30.01.2023 16:04

Другие вопросы по теме

Как настроить traefik для правильной маршрутизации трафика из определенного домена в определенный контейнер nginx
Spring Boot Microservices — сервер конфигурации не может получить файл свойств (добавление источника свойства: ресурс конфигурации) в Docker
Prometheus не отображает пользовательские метрики из службы localhost на конечной точке `/metrics`
Перенос docker-compose на кластер docker-swarm с одним узлом
Ошибка при запуске Docker Mailserver через docker-compose up: для запуска Dovecot требуется хотя бы одна почтовая учетная запись
Не удается подключиться к серверному приложению websocket внутри docker-compose
Переменная среды AWS ECS недоступна [Python]
Как использовать nginx (установлен на докере) обратный прокси-сервер gitlab (также установлен на докере)
Docker с Redis через Procfile.dev в выводе iTerm2 не читается
Превышено максимальное количество повторных попыток с URL-адресом: Не удалось установить новое соединение: [Errno 111] Отказано в соединении