Nginx在不同的位置托管应用程序

rod*_*gas 9 php nginx

我正在尝试在特定位置的nginx + php-fpm中提供CachetHQ.文档给出了这个作用的例子status.example.com(有效):

server {
    listen 80;
    server_name status.example.com;

    root /var/www/Cachet/public;
    index index.php;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php$ {
         include fastcgi_params;
         fastcgi_pass 127.0.0.1:9000;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_index index.php;
         fastcgi_keep_conn on;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,status.example.com我想服务于,而不是服务example.com/status.

我原以为这会起作用,但是从error.log我看到它正在尝试/etc/nginx/htmlindex.php,但它应该是/mnt/data/site/www-cachet/public/index.php:

location /status/ {
    index index.php;
    root /mnt/data/site/www-cachet/public;

    try_files $uri index.php$is_args$args;

    location ~ ^/status/.+\.php$ {
        root /mnt/data/site/www-cachet/public;
        include fastcgi_params;
        fastcgi_pass   unix:/tmp/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_keep_conn on;
    }
}
Run Code Online (Sandbox Code Playgroud)

rod*_*gas 1

经过几个小时尝试了很多组合后,我让它工作的方式是:

location ^~  /status {
    alias /mnt/data/site/www-cachet/public;
    try_files $uri $uri/ @status;

    location = /status/ {
        rewrite /status/$ /status/index.php;
    }

    location ~ ^/status/(.+\.php)$ {
        fastcgi_pass unix:/tmp/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /mnt/data/site/www-cachet/public/$1;
        include fastcgi_params;
    }
}

location @status {
    rewrite /status/(.*)$ /status/index.php?/$1 last;
}
Run Code Online (Sandbox Code Playgroud)

最重要的是fastcgi_param,我必须将其设置为绝对路径而不是$document_root$fastcgi_script_name类似的路径。我不确定这是否是一个好的做法,但是添加alias到块中是行不通的,并且 nginx 或 FastCGI 都没有向我们显示它们试图读取的文件的路径。

尽管如此,我还是无法让 CachetHQ 正常工作。问题是源代码中的所有路径都是绝对路径,因此它们不会指向托管文件的子目录。解决方案是做一些我从一开始就不愿意做的事情:将其托管在子域中。