Re: Проксирование http и https в одном конигурационном файле, на порты отличные от 80 и 443

Maxim Dounin mdounin at mdounin.ru
Wed Dec 11 14:14:04 UTC 2013


Hello!

On Wed, Dec 11, 2013 at 06:04:55AM -0500, mnsold wrote:

> Подскажите, как можно организовать прокисрование http и https в одном
> конфигурационном файле, если есть несколько веб-серверов порты у которых
> отличаются от 80 и 443.
> Опишу общий вариант, чтобы было понятнее о чем речь, думаю в организациях, у
> которых множество сервисов, такое или очень похожее часто встречается.
> 
> Для упрощения пусть будут несколько веб-серверов
> (apache,tomcat,glassfish,jbos ... и т.д.) на одном сервере (в жизни конечно
> не васе прям так, но доля правды есть, да и заменить один хост на хост в
> сети не так и сложно).
> 
> Пусть будет сервер в лок сети с установленым на нем ПО:
> - nginx, порты http=80 https=443, он же проксирует все во нешний мир.
> - apache, порты http=8080 https=8083
> - glassfish, порты http=8181 https=8183
> 
> 1. Каким образом нужно написать конфиг для проксирования, чтобы http и https
> были в одном конфиге?
> 2. Каким образом нужно написать конфиг для проксирования, чтобы http и https
> были в одном конфиге, при условии, что приложения на apache/glassfish
> находятся не в корне веб сервера?
> 2й вариант наиболее интересен!

Для начала имеет смысл понять две простые вещи:

1) Весь конфиг nginx'а может быть записан в одном файле, 
nginx.conf.  Все попытки разделения на множество маленьких 
файликов по доменам - это лишь средство для упрощения 
автоматизации, обычно применяемое в линуксе.  Если вам хочется 
записать всё в "одном конфиге" - просто напишите всё в nginx.conf, 
и с головой будет в порядке.

2) Несколько блоков server{} в рамках одного nginx.conf - это 
нормально, и это хороший, годный способ писать простую 
конфигурацию.  Если у вас два разных виртуальных сервера, которые 
обрабатываются по разному - напишите для них разные блоки 
server{}, и с головой будет в порядке.

[...]

> в одном из location указать проксирование на apache
> 	if ( $scheme = "http" ) {
>           proxy_pass http://localhost:8080;
>         }
>         if ( $scheme = "https" ) {
>           proxy_pass https://localhost:8083;
>         }

[...]

> то в location можно проксирование прописать следующим образом без
> использования if
> proxy_pass $scheme://127.0.1.1; | proxy_pass $scheme://127.0.1.1/app;
> или
> proxy_pass $scheme://127.0.1.2; | proxy_pass $scheme://127.0.1.2/app;

Не надо делать ни так, ни так.  Если хочется, чтобы запросы, 
пришедшие по https, проксировались с использованием https, а 
запросы, пришедшие по http, проксировались без него, то 
правильно делать так:

    server {
        listen 80;

        location / {
            proxy_pass http://upstream;
        }
    }

    server {
        listen 443 ssl;

        location / {
            proxy_pass https://upstream;
        }
    }

Блоки server{} - это инструмент, специально предназначенный для 
того, чтобы задавать разную обработку для разных виртуальных 
серверов.  Его и надо использовать для решения таких задач.

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

-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru