1

ОписаниеDocker апач и Nginx порт конфликт

У меня есть проект со следующими конфигурациями:

1) Основной сайт написан на PHP

2) API написано в NodeJS

Поскольку я разрабатываю несколько машин, работающих под управлением разных операционных систем, я решил использовать докер, чтобы я мог запускать проект на любой машине, которую я использую.

Я пытаюсь иметь Nginx в качестве обратного прокси-сервера, что серверы на API и веб-сайт следующим образом:

1) example.com -> Сайт

2) api.example.com -> API

Однако кажется, что Apache автоматически назначает порт 80, даже если я его не выставил. Это вызывает конфликт с nginx, который также работает в одном поле. Есть ли способ предотвратить автоматическое связывание apache/php с портом 80 хоста.

Я попытался отобразить порт на другой порт, но это заставило apache/php просто добавить дополнительный порт, как вы можете видеть здесь ниже:

docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED      STATUS    PORTS       NAMES 
fc830d3562e4  apache_website "docker-php-entrypoin" 3 seconds ago  Up 2 seconds  80/tcp, 0.0.0.0:80->8000/tcp  apache_website_run_7 

докер-Compose файл

version: '2' 
services: 
    nginx: 
    build: nginx 
    ports: 
    - "80:80" 
    expose: 
     - "80" 
    restart: always 
    depends_on: 
    - website 
    - api 
    api:  
    image: node 
    command: node /var/www/index.js 
    restart: always 
    website: 
    build: php:7.1-apache   
    ports: 
    - "80:800" 
    restart: unless-stopped 

Nginx dockerfile

FROM nginx 
    COPY nginx.conf /etc/nginx/nginx.conf 

    EXPOSE 80 

Nginx конфигурационный файл

worker_processes 4; 

events { worker_connections 1024; } 

http { 
    include mime.types; 
    # fallback in case we can't determine a type 
    default_type application/octet-stream; 

    upstream example.com { 
    server website:80 fail_timeout=0; 
    } 

    server { 
    listen 80; 
    client_max_body_size 4G; 

    keepalive_timeout 5; 

    root /opt/app/public; 

    location/{ 
     try_files $uri @proxy_to_app; 
    } 

    server_name example.com; 

    location @proxy_to_app { 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     proxy_set_header Host $http_host; 

     proxy_redirect off; 
     proxy_pass http://example.com; 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /opt/app/public; 
    } 
    } 

    # API 
    #======================================================================== 
    upstream api.example.com { 
    server api:80 fail_timeout=0; 
    } 
    server { 
    listen 80; 
    client_max_body_size 4G; 

    keepalive_timeout 5; 

    root /opt/app/public; 

    location/{ 
     try_files $uri @proxy_to_app; 
    } 

    server_name api.example.com; 

    location @proxy_to_app { 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 


     proxy_pass http://api.example.com; 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /opt/app/public; 
    } 
    } 
} 

Как предотвратить Apache/PHP от привязки к порту хоста 80? Я хотел бы сохранить порт для межконтейнерных соединений, однако я не хочу, чтобы порт был открыт для хоста.

Я хотел бы разоблачить порт 80 только для nginx.

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

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

+1

Ваш докер скомпонует файл _explicitly_ предоставляет порт 80 –

+0

@ Дана Фаррелла да это для nginx.Однако nginx не запускается, потому что порт уже занят Apache/PHP (веб-сайт). – thedethfox

+0

- это то, что ямль случайно отформатирован? –

ответ

1

https://docs.docker.com/compose/compose-file/#/ports объясняет, что порт хоста является первым. Вы объясняете порт 80 для nginx и для apache. Для nginx вы подвергаете контейнер 80 в качестве хоста 80 и в контейнере 800 apache в качестве порта 80.

Вероятно, вы только что вернули номера.

+0

Да, действительно, это была работа. Кажется, что у меня номера были отменены. однако это только предотвращает привязку apache к порту 80 хоста и, вместо этого, к порту 800. Однако это не объясняет, почему он автоматически перехватывает порт 80 хоста. Если никто другой не приходит с объяснением к завтрау, тогда я дам вам вопрос даже если он не отвечает, почему контейнер прикрепляет его к порту 80 хоста. – thedethfox

+2

Он не подключается автоматически к порту 80. У вас оба явно связаны с портом 80 хоста в вашей докере-компоновке. По умолчанию открытые порты не отображаются вообще. –