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

Записи с подстановочными знаками с Nginx для обработки пользовательских доменов

Вот моя 4-х, 5-часовая проблема:

Я установил многосайтовый экземпляр WordPress, который будет обрабатывать сайты на domain.com, subdomain.domain.com и customdomain.com. Будет N сайтов, использующих customdomain.com, поэтому я бы предпочел не создавать записи для каждого. На сервере у меня Nginx перед Apache.

Я бы хотел создать в Nginx запись с подстановочными знаками для обработки всех пользовательских доменов. Сейчас это выглядит примерно так:

server {
    listen 80;
    server_name _;
    root /home/server_user/web/production;
    client_max_body_size 50M;
    client_body_buffer_size 128k;

    location / {
        access_log      off;
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host $proxy_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

При такой настройке он будет передавать запросы в Apache и обслуживать динамический контент, но возвращает 404 для всего статического контента. Если я изменю server_name на customdomain.com, Nginx снова начнет обслуживать статический контент. Когда я меняю server_name на _ или любой другой универсальный шаблон, Nginx падает лицом вниз.

Любые идеи?

Решение (по крайней мере, с моей конфигурацией):

В вашей записи с подстановочными знаками директива listen также должна включать default:

listen 80 default;

Не добавляйте директиву server_name, потому что это приведет к некрасивым и неожиданным сбоям в работе.

Реквизит для Макс Катлер за то, что помог мне разобраться в этом.

Ссылаясь на официальная документация, у вас есть следующие возможности:

server {
  server_name   example.com  *.example.com  www.example.*;
}

server {
  server_name _ *;
}

server {
  server_name example.com *;
}

Обратите внимание, что это было изменено в 0.6.x и теперь:

server {
  server_name _;
}

Начиная с nginx 0.7.12, поддерживается пустое имя сервера, чтобы перехватывать запросы без заголовка Host:

server {
  server_name "";
}