Вопрос: nginx HTTPS, работающий с той же конфигурацией, что и HTTP


Есть ли способ совместного использования конфигурационных директив по двум nginx server {} блоки? Я бы хотел избежать дублирования правил, так как HTTPS и HTTP-контент моего сайта обслуживаются с точно такой же конфигурацией.

В настоящее время это выглядит так:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Могу ли я сделать что-то вроде:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}

169
2018-05-21 16:18


Источник




Ответы:


Вы можете объединить это в один серверный блок следующим образом:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Официальное руководство


231
2018-05-21 18:54



Ах, я понятия не имел, что nginx был достаточно интеллектуальным, чтобы игнорировать директивы SSL, если они загружены через порт 80. Удивительно! - ceejayoz
nginx - это все виды WIN. - Jauder Ho
и если у вас несколько сайтов на одном сервере, стоит упомянуть, что «дефолт» не является обязательным - luchaninov
Так элегантно это больно ... - Alix Axel
не работает здесь ... "Простой HTTP-запрос был отправлен в порт HTTPS" - gcstr


Чтобы прояснить принятый ответ, вам нужно опустить

SSL on;

и вам просто нужно следующее для версии nginx после 0.8.21

listen 443 ssl;

Справка:

Nginx Docs - настройка одного HTTP / HTTPS-сервера


77
2018-06-13 06:19



Спасибо! Я не мог понять, почему ничего на http не работает. Удаление SSL; работал. - Chris Cummings


Я не знаю, как вы это предлагаете, но, безусловно, легко и удобно.

Переместите общие настройки сервера в отдельный файл, то есть «serverFoo.conf», а затем include он в отдельном server {} блоки вроде:

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}

25
2018-05-21 18:38



+1 = работает для меня. (Не удалось заставить его работать с другим методом.) - lackey
Кроме того, в другом примере не учитывается «proxy_pass», если он действует как балансировщик нагрузки. - Mike Purcell
Этот вариант отлично подходит, если server_name для каждого порта отличается - iDev247
Не используйте ssl, используйте listen 443 ssl; теперь один. - danger89
Это единственное решение, которое работает с последним nginx 1.10.1. По какой-то причине два listen линии не интерпретируются правильно, а перемещают их в отдельные server{} исправляет его. - Artur Bodera


Развернувшись на уже полезные ответы, вот более полный пример:

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}

7
2018-05-10 17:48



Я знаю, что это довольно старый ответ, но поскольку он очень полный, я просто хотел указать другим, которые могут его использовать, чтобы вы отключили протокол SSLv3 как уязвимый для уязвимости POODLE: disablessl3.com  Вместо этого используйте: ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - user147787


Чтобы добавить к сообщению Игоря / Яудера, если вы слушаете определенный IP-адрес, вы можете использовать:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;

4
2018-02-25 13:11