Настройка поведения веб-сервера Discourse с помощью outlets

Резюме

Начиная с этого коммита, конфигурация nginx по умолчанию для Discourse включает так называемые «outlets» (точки вставки) — поддерживаемый способ добавления дополнительных директив в конфигурацию nginx в соответствующих местах.

Это изменение позволяет перейти к более надежному подходу к управлению конфигурацией и поведением веб-сервера, тогда как ранее мы полагались на относительно хрупкие команды поиска и замены.

Со временем мы адаптируем наши собственные шаблоны конфигурации для использования outlets.

Использование

Существует три поддерживаемых раздела outlets:

  • before-server: директивы конфигурации контекста http
  • server: директивы конфигурации контекста server
  • discourse: директивы конфигурации контекста location — они применяются к запросам, перенаправляемым в Discourse

Примеры

Ниже приведено несколько примеров того, как использовать эти outlets в вашем файле конфигурации app.yml для достижения поставленных целей.

Их можно добавлять в любом месте, где можно использовать команду run или file; я рекомендую делать это в хуке after_code, чтобы сборка могла быстро завершиться ошибкой, если в синтаксисе есть проблемы.

Добавление заголовка ответа

Этот пример добавляет заголовок к каждому ответу, пересылаемому в Discourse:

hooks:
  after_code:
    - file:
        path: /etc/nginx/conf.d/outlets/discourse/clacks-overhead.conf
        chmod: 444
        contents: |
          add_header x-clacks-overhead "GNU Terry Pratchett";

Результат:

○ → curl -I https://example.contoso.com/
HTTP/2 200 
…
x-clacks-overhead: GNU Terry Pratchett

Добавление статического файла по одному пути

Этот пример добавляет статический файл, обслуживаемый nginx по одному пути, вне обычного дерева Discourse.

hooks:
  after_code:
    - file:
        path: /etc/nginx/conf.d/outlets/server/well-known-important-file.conf
        chmod: 444
        contents: |
          location = /.well-known/important-file {
            default_type application/json;
            root /var/www/static/;
          }
    - file:
        path: /var/www/static/.well-known/important-file
        chmod: 444
        contents: |
          {"content-free":true}

Результат:

○ → curl -i https://example.contoso.com/.well-known/important-file
HTTP/2 200 
server: nginx
date: Fri, 07 Mar 2025 23:22:38 GMT
content-type: application/json
content-length: 22
last-modified: Fri, 07 Mar 2025 23:12:08 GMT
strict-transport-security: max-age=63072000
accept-ranges: bytes

{"content-free":true}

Я думаю, что я действительно взволнован этим, за исключением того, что… я плохо это понимаю. Дает ли нам второй пример возможность обслуживать статическую страницу по нашему выбору?

Именно так.

Это не очень масштабируемое решение с точки зрения управления контентом, но оно имеет преимущество в простоте реализации.

Спасибо, Майкл, хотя бы я понял достаточно, чтобы разобраться, что происходит.

Отлично, спасибо за подсказки