Обратный прокси Nginx с Docker LetsEncrypt

Кто-нибудь видит, что я сделал не так с моим обратным прокси-сервером Nginx? Я получаю 502 Bad Gateway, и я не могу понять, где мои порты неправильные.

Nginx

/ etc / nginx / sites-enabled / default

upstream reverse_proxy {
  server 35.237.158.31:8080;
}

server {
  listen 80;
  server_name 35.237.158.31;

  location / {                                                      
    proxy_pass http://reverse_proxy;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_cache_bypass $http_upgrade;
  }

}

/etc/nginx/sites-enabled/jesse.red [VHOST]

upstream jessered {
    server 127.0.0.1:2600; # <-- PORT 2600
}
server {

  server_name jesse.red;
  #root /var/www/jesse.red/;

    # ---------------------------------------------------------------
    # Location
    # ---------------------------------------------------------------
    location / {
        proxy_pass          http://jessered;
        #proxy_http_version  1.1;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection 'upgrade';
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_cache_bypass  $http_upgrade;
        proxy_read_timeout  90;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/jesse.red/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/jesse.red/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = jesse.red) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

  server_name jesse.red;
    listen 80;
    return 404; # managed by Certbot
}                      

Докер

Ниже он работает на 2600

$ docker ps

9d731afed500        wordpress:php7.0-fpm-alpine   "docker-entrypoint.s…"   3 days ago          Up 17 hours         9000/tcp, 0.0.0.0:2600->80/tcp   jesse.red

/var/www/jesse.red/docker-compose.yml

version: '3.1'
services:
  jessered:
    container_name: jesse.red
    image: wordpress:4-fpm-alpine
    restart: always
    ports:
      - 2600:80 # <-- PORT 2600
    env_file:
      - ./config.env  # Contains .gitignore params

Тестирование Docker

docker-compose logs

Attaching to jesse.red
jesse.red | WordPress not found in /var/www/html - copying now...
jesse.red | Complete! WordPress has been successfully copied to /var/www/html
jesse.red | [03-Jul-2018 11:15:07] NOTICE: fpm is running, pid 1
jesse.red | [03-Jul-2018 11:15:07] NOTICE: ready to handle connections

Система

$ ps aux | grep 2600

Ниже используется порт 2600.

root      1885  0.0  0.1 232060  3832 ?        Sl   Jul02   0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 2600 -container-ip 172.20.0.2 -container-port 80

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


person JREAM    schedule 03.07.2018    source источник
comment
Какой сетевой запрос (URL) возвращает ошибку 502 Bad Gateway? Это с вашего локального компьютера или через Интернет?   -  person Mike Lippert    schedule 17.08.2018


Ответы (1)


При обработке запросов Nginx выбирает серверный блок следующим образом:

Проверьте директиву listen на соответствие IP: порт, если совпадений нет, проверьте соответствие IP-порта ИЛИ. IP-адреса без порта считаются портом 80.

На основе этих совпадений он затем проверяет заголовок Host запроса на соответствие директиве server_name в согласованных блоках. Если он находит совпадение, то этот сервер обрабатывает запрос, если нет, то при условии, что директива default_server не установлена, запрос будет передан на сервер, указанный первым в вашей конфигурации.

Итак, у вас server_name 35.237.158.31; на порту 80 и server_name jesse.red; также на порту 80

IP-адреса должны быть частью директивы listen, а не server_name, хотя это может совпадать для некоторых запросов. Предполагая, что к нему обращаются из внешнего мира, маловероятно, что jesse.red будет в чьих-либо заголовках хоста.

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

  1. / и т.д. / nginx / сайты-включены / по умолчанию
  2. /etc/nginx/sites-enabled/jesse.red

и теперь все ваши запросы на порт 80 без совпадения хоста или с IP-адресом в поле хоста передаются через прокси:

upstream reverse_proxy {
  server 35.237.158.31:8080;
}

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

person miknik    schedule 03.07.2018