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

NGINX использует корневую директиву в if-clause

У меня есть докер-контейнер NGINX, который получает запросы на порт 8089 (обратное проксирование NGINX в моей основной системе). Затем он должен получить переменную $ host, чтобы определить правильный корневой каталог для обслуживания. В моем журнале ошибок NGINX жалуется на то, что «здесь не допускается использование корневой директивы».
Как я могу добиться того же без ошибок?
Вот мой файл конфигурации NGINX:

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        set $handle 0;
        if ($host = 'lsg.example.com') {
                set $handle 2;
        }
        if ($host = 'www.example.com') {
                set $handle 1;
        }
        if ($handle = 0) {
                return 501;
        }
        if ($handle = 1) {
                root /var/www/laravel/public; #root directive not allowed here
                index index.php index.html index.htm;
        }
        if ($handle = 2) {
                root /var/www/pizza/public;
                index index.php index.html index.htm;
        }
        # Laravel params:
        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }
        location ~ \.php$ {
                try_files $uri /index.php =404;
                fastcgi_pass php-upstream;
                fastcgi_index index.php;
                fastcgi_buffers 16 16k;
                fastcgi_buffer_size 32k;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                #fixes timeouts
                fastcgi_read_timeout 600;
                include fastcgi_params;
        }
        location ~ /\.ht {
                deny all;
        }
        location /.well-known/acme-challenge/ {
                root /var/www/letsencrypt/;
                log_not_found off;
        }
        error_log /var/log/nginx/laravel_error.log;
        access_log /var/log/nginx/laravel_access.log;
}

Оказывается, я могу просто использовать директиву server_name, чтобы различать разные переменные $ host. В любом случае спасибо за любую помощь!

Похоже, у вашего сервера нет соединения с контейнером докеров, работающим на том же хосте. В вашем примере у вас есть апстрим-ларадок, который обслуживает запросы к 127.0.0.1:8089.

Убедитесь, что ваш докер-контейнер предоставляет этот порт, и вы можете сделать успешный запрос к нему с хоста, на котором работает ваш веб-сервер:

curl http://127.0.0.1:8089