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

Псевдоним каталогов Nginx неправильно передается в fcgi

У меня есть виртуальный хост веб-сайта example.com, который статически обслуживается из / home / erealms / www.

Однако на веб-сайте выполняется серия сценариев Perl, которые расположены в разных каталогах. Итак, я пытаюсь достичь следующего:

http://example.com/               -> /home/erealms/www
http://example.com/erealms        -> /home/erealms/ethereal/main
http://example.com/erealms/admin  -> /home/erealms/ethereal/mgmt/admin
http://example.com/erealms/config -> /home/erealms/ethereal/mgmt/config

Во всех каталогах кроме http://example.com/ будут файлы perl, .pl, которые будут обслуживаться через fcgiwrapper.

Вот моя текущая конфигурация:

server {
    add_header Cache-Control public;
    access_log /var/log/nginx/access.log main buffer=32k;
    error_log /var/log/nginx/error.log error;
    expires max;
    limit_req zone=gulag burst=200 nodelay;
    listen 80;
    server_name example.com;
    index index.html index.htm default.html default.htm;
    root /home/erealms/www;

    location ~* (\.jpg|\.png|\.css)$ {
        if ($http_referer !~ ^(http://rpn.ishikawa.sne.jp) ) {
            return 405;
        }
    }
    location = /favicon.ico {
        return 204;
    }
    location /erealms/config {
        root /home/erealms/ethereal/mgmt/config/;
        gzip off;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:8000;
        fastcgi_param SCRIPT_FILENAME /home/erealms/ethereal/mgmt/config$fastcgi_script_name;
    }
    location /erealms/admin {
        root /home/erealms/ethereal/mgmt/admin/;
        gzip off;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:8000;
        fastcgi_param SCRIPT_FILENAME /home/erealms/ethereal/mgmt/admin$fastcgi_script_name;
    }
    location /erealms {
        alias /home/erealms/ethereal/main;
        gzip off;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:8000;
        fastcgi_param SCRIPT_FILENAME /home/erealms/ethereal/main$fastcgi_script_name;
    }
}

Вы заметите, что у меня есть директивы root и alias, потому что я пытался понять, что, черт возьми, происходит. Но вот что странно. Ниже я указал, какие каталоги запрашиваются, и где nginx сообщает fcgiwrapper о доступе к ним:

http://example.com/erealms        -> /home/erealms/ethereal/main/erealms
http://example.com/erealms/admin  -> /home/erealms/ethereal/mgmt/admin/erealms/admin
http://example.com/erealms/config -> /home/erealms/ethereal/mgmt/config/erealms/config

А пока, просто чтобы эта чертова штука заработала для дальнейшего тестирования, я только что создал ленивые символические ссылки, указывающие туда, где они должны быть, но, очевидно, это не очень элегантное решение. Если бы кто-нибудь мог указать мне в правильном направлении, чтобы исправить эту текущую настройку, ИЛИ если у вас, возможно, есть идея более элегантного решения для этой конфигурации, я был бы очень признателен.

Не знаю, как отвечать на ваши вопросы в SF, но вот что я в итоге сделал:

server {
    add_header      Cache-Control public;
    access_log      /var/log/nginx/access.log main buffer=32k;
    error_log       /var/log/nginx/error.log error;
    expires         max;
    limit_req       zone=gulag burst=200 nodelay;
    listen          80;
    server_name     rpn.ishikawa.sne.jp;
    root            /home/erealms/www;
    index           index.html;
    location ~* (\.jpg|\.png|\.css)$ {
            if ($http_referer !~ ^(http://rpn.ishikawa.sne.jp) ) {
                    return 405;
            }
    }
    location = /favicon.ico {
            return 204;
    }
    location ~ /erealms/config(/.*\.pl)$ {
            alias   /home/erealms/ethereal/mgmt/config;
            gzip off;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/tmp/cgi.sock;
            fastcgi_param SCRIPT_FILENAME /home/erealms/ethereal/mgmt/config/$1;
    }
    location ~ /erealms/admin(/.*\.pl)$ {
            alias   /home/erealms/ethereal/mgmt/admin;
            gzip off;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/tmp/cgi.sock;
            fastcgi_param SCRIPT_FILENAME /home/erealms/ethereal/mgmt/admin/$1;
    }
    location ~ /erealms(/.*\.pl)$ {
            alias   /home/erealms/ethereal/main;
            gzip off;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/tmp/cgi.sock;
            fastcgi_param SCRIPT_FILENAME /home/erealms/ethereal/main/$1;
    }
}

Теперь, к сожалению, это привело к некоторым другим ошибкам, когда я в конечном итоге просто буду использовать бэкэнд apache для обслуживания динамического контента с интерфейсом nginx, но я подумал, что оставлю это здесь, если кто-то еще столкнется с аналогичной проблемой.