Назад | Перейти на главную страницу

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
  }
}

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

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

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

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

SSL on;

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

listen 443 ssl;

Ссылка:

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

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

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

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

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

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;
}

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

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