2013-08-19 6 views
16

Мне нужно использовать Nginx в качестве прокси-сервера SSL, который перенаправляет трафик на разные задние концы в зависимости от субдомена.nginx proxy на основе хоста при использовании https

Кажется, что везде я должен определить несколько разделов «server {», но это не работает корректно для SSL. При этом я всегда буду обрабатывать SSL на первом виртуальном хосте, поскольку имя сервера неизвестно до тех пор, пока вы не обработаете трафик https.

Сценарий:

  • один IP-адрес
  • Один SSL Wildcard подстановочные
  • Несколько движки, который должен быть доступен как следующее:

    https://one.mysite.com/ -> http://localhost:8080 
    https://two.mysite.com/ -> http://localhost:8090 
    

Nginx говорит " если «злой: http://wiki.nginx.org/IfIsEvil, но что еще я могу сделать?

Я пробовал это, но он не работает, я получаю ошибку 500, но ничего в журналах ошибок.

server { 
    listen 443; 
    server_name *.mysite.com; 

    ssl on; 
    ssl_certificate ssl/mysite.com.crt; 
    ssl_certificate_key ssl/mysite.com.key; 

    location/{ 
     if ($server_name ~ "one.mysite.com") { 
      proxy_pass http://localhost:8080; 
     } 
     if ($server_name ~ "two.mysite.com") { 
      proxy_pass http://localhost:8090; 
     } 
    } 

Неужели кому-то удалось выполнить это с помощью Nginx? Любая помощь/альтернативы, ссылка, будет высоко оценена.

ответ

27

Я нашел решение, которое в основном для определения SSL опции и сертификат SSL вне блока "сервера":

ssl_certificate ssl/mysite.com.crt; 
ssl_certificate_key ssl/mysite.com.key; 
ssl_session_timeout 5m; 
ssl_protocols  SSLv3 TLSv1; 
ssl_ciphers   ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+EXP; 
ssl_prefer_server_ciphers on; 

server { 
    listen 80; 
    server_name *.mysite.com; 
    rewrite^https://$host$request_uri? permanent; 
} 
server { 
    listen 443 ssl; 
    server_name one.mysite.com; 

    ssl on; 

    location/{ 
     proxy_pass http://localhost:8080; 
    } 
} 
server { 
    listen 443 ssl; 
    server_name two.mysite.com; 

    ssl on; 

    location/{ 
     proxy_pass http://localhost:8090; 
    } 
} 

Ключевые вещи:

  • "Ssl на"; это единственное, что должно быть в «серверных» блоках, которые прослушивают https, вы также можете выставить его снаружи, но что сделает блоки «сервера», которые прослушивают порт 80, использовать протокол https, а не ожидаемый http.
  • Поскольку «ssl_certificate», «ssl_ciphers: и другие« ssl_ * »находятся за пределами« серверного »блока, Nginx выполняет разгрузку SSL без имени server_name. Это то, что он должен делать, поскольку дешифрование SSL не может произойти на основе .. любое имя хоста, так как на данном этапе зашифрован URL
  • JAVA и локон не выходят из строя сейчас работать Там нет server_name - хозяин мисс матч
+7

Спасибо, эта информация была очень полезной для меня. FYI: Я узнал, что когда вы используете 'listen 443 ssl;' вам также не нужно делать 'ssl on ;, потому что nginx включит для вас режим SSL. Источник: http://nginx.org/en/docs/http/ngx_http_core_module.html#listen – Tom

1

согласно http://www.informit.com/articles/article.aspx?p=1994795, у вас должно быть два раздела «сервер» с двумя разными именами серверов. В каждом из них вы должны указать свои ssl_ * директивы.

+0

Есть одна проблема с этим, позвольте мне объяснить это с помощью примера: если у вас есть два «сервера», разделы с прослушиванием SSL в порту 443 Nginx выполнит SSL-decription, используя первый виртуальный хост, потому что он все еще не знает, какой у вас домен. После того, как домен может быть сопоставлен, он выполнит директивы правильного виртуального хоста, но SSL-decription произойдет на неправильном виртуальном хосте. JAVA и завиток (возможно, больше клиентов SSL) провалится, потому что существует несоответствие имени хоста и фактически используемого домена. –

+1

Это то, что фиксирует SNI. Наиболее разумно современные браузеры поддерживают его сейчас, что значительно упрощает жизнь. – rubyruy

4

короткий ответ заключается в использовании Server Name Indication.. Это должно работать по умолчанию в обычных браузерах и cURL.

 Смежные вопросы

  • Нет связанных вопросов^_^