Задать вопрос
nepster-web
@nepster-web

Как правильно проксировать с https?

Есть некий сервер, на котором стоит nginx в качестве сервера.
Есть docker, который поднят на данном сервере и держит приложение во внутренней сети, к примеру: http://192.167.117.1:8080.

Задача сделать проксирование с основного nginx на внутреннюю сеть с использованием https.

Задачу порешал примерно вот таким образом:
server {
    server_name  www.example.com;
    rewrite ^(.*) https://example.com$1 permanent;
}

server {
    server_name  www.example.com;
    rewrite ^(.*) https://example.com$1 permanent;
}

server {
       listen         80;
       server_name    example.com;
       return         301 https://$server_name$request_uri;
}

server {

    server_name *.example.com example.com;

    listen   443;

    ssl    on;
    ssl_certificate    /var/www/example.com/ssl/ssl-bundle.crt;
    ssl_certificate_key    /var/www/example.com/ssl/example.com.key;

    # side note: only use TLS since SSLv2 and SSLv3 have had recent vulnerabilities
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # 301 редирект со страниц со слешем на страницы без слеша в конце URL
    rewrite ^/(.*)/$ /$1 permanent;

    charset utf-8;
    client_max_body_size 128M;

    gzip  on;

    # Минимальная длина ответа, при которой модуль будет жать, в байтах
    gzip_min_length  1000;

    # Разрешить сжатие для всех проксированных запросов
    gzip_proxied     any;

    # MIME-типы которые необходимо жать
    gzip_disable "msie6";

    # Compress all output labeled with one of the following MIME-types.
    gzip_types
      application/atom+xml
      application/javascript
      application/json
      application/rss+xml
      application/vnd.ms-fontobject
      application/x-font-ttf
      application/x-web-app-manifest+json
      application/xhtml+xml
      application/xml
      font/opentype
      image/svg+xml
      image/x-icon
      text/xml
      text/css
      text/plain
      text/javascript
      text/x-component;

    # Запрещает сжатие ответа методом gzip для IE6  (старый вариант gzip_di$
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    # Уровень gzip-компрессии
    gzip_comp_level  6;


    location / {
        proxy_pass       http://192.167.117.1:8080;
        proxy_set_header Host 192.167.117.1:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_buffering off;
        break;
    }

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|txt|rtf|css|js)$ {
        expires max;
        add_header Pragma public;
       #add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        proxy_pass http://192.167.117.1:8080;
    }

}


Однако приложение внутри докера не понимает, что оно работает через https, подскажите, пожалуйста, как это можно донастроить?
  • Вопрос задан
  • 514 просмотров
Подписаться 2 Оценить 2 комментария
Решения вопроса 2
Lynn
@Lynn
nginx, js, css
Зависит от приложения.
Обычно эту информацию доносят с помощью заголовков, например
proxy_set_header X-Forwarded-Proto https; или proxy_set_header X-HTTPS yes; или как-то аналогично.

Ещё это может настраиваться где-то в самом приложении.

В общем, смотрите документацию к своему приложению/фреймворку
Ответ написан
Комментировать
nepster-web
@nepster-web Автор вопроса
В общем разобрался в проблеме на уровне приложения и постараюсь описать решение.

Приложение, это сайт на laravel, который работает на docker. Основной nginx сервера, который работает на https проксирует все запросы на nginx docker`a, который работает на http. Соответственно, когда мы попадаем в само приложение, оно думает, что работает на http.

У нас есть несколько вариантов решения данной проблемы:
1. Поднять приложение на docker тоже через https
2. Передать спец. заголовок через nginx
3. Настроить https через приложение.

Так уж вышло, что мне не подошли первые два варианта, поскольку появляются дополнительные сложности при переключении окружений (а так-же тестирование с локалки, где нет https).

Поэтому все было решено через приложение примерно таким способом:

AppServiceProvider.php
...
        if (env('APP_ENV') === 'production') {
            URL::forceScheme('https');
            $this->app->make(Request::class)->server->set('HTTPS', true);
        }
...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы