Nginx - Symfony 4 多应用 - 同一域名

Nginx - Symfony 4 多应用 - 同一域名

我正在尝试在同一个服务器块(同一个域)中设置 2 个 Symfony 4 应用程序,但 php 不会呈现 php 文件。这是我的配置:

server {
    server_name mydomain.com;
    root /var/www/;

    location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
        access_log off;
        expires max;
    }

    location ~ ^/app1(/.*)$ {
        alias /home/app1/html/public;
        try_files $uri /index.php$is_args$args;

        location ~ ^/index\.php(/|$) {
                fastcgi_pass   php_stream;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include        fastcgi_params;
                fastcgi_param  SCRIPT_FILENAME $request_filename;
        }
    }

    location ~ ^/app2(/.*)$ {
        alias /home/app2/html/public/;
        try_files $uri /index.php$is_args$args;

        location ~ ^/index\.php(/|$) {
                fastcgi_pass   php_stream;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include        fastcgi_params_;
                fastcgi_param  SCRIPT_FILENAME $realpath_root$request_filename;
                fastcgi_param  DOCUMENT_ROOT $realpath_root;
        }
    }

    location / {
        root /var/www/;
    }
}

如果我将静态文件放在应用程序文件夹中,它可以工作,但不能处理 php 文件。它会处理根文件夹 /var/www/index.php 中的 php 文件,而不是公共应用程序文件夹中的 php 文件。这就像没有考虑到别名指令一样。

有人知道如何解决这个问题吗?

答案1

“如果在使用正则表达式定义的位置内使用别名,则该正则表达式应该包含捕获,并且别名应该引用这些捕获(0.7.40),例如:

location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
    alias /data/w3/images/$1;
}

“ 看http://nginx.org/en/docs/http/ngx_http_core_module.html#alias

答案2

看来我的问题是由于 nginx 中的一个错误(关于在同一个块中使用别名和 try_file)。这个错误已经存在 6 年多了,无法纠正以避免副作用(如果我理解得没错的话)。这是一个实际有效的解决方法:

upstream app1.fake {
    server 127.0.0.1;
}

upstream app2.fake {
    server 127.0.0.1;
}

upstream app1_stream {
    server unix:/var/run/php-fpm-app1.sock1 weight=100 max_fails=5 fail_timeout=5;
    server unix:/var/run/php-fpm-app1.sock2 weight=100 max_fails=5 fail_timeout=5;
}

upstream app2_stream {
    server unix:/var/run/php-fpm-app2.sock1 weight=100 max_fails=5 fail_timeout=5;
    server unix:/var/run/php-fpm-app2.sock2 weight=100 max_fails=5 fail_timeout=5;
}

server {
    server_name mydomain;

    listen 80;

    root /var/www/;
    index index.html;

    location /app1 {
        proxy_pass http://app1.fake;
    }

    location /app2 {
        proxy_pass http://app2.fake;
    }
}

server {
    server_name app1.fake;
    root /home/app1/html/public;

    location / {
        try_files $uri /index.php$is_args$args;
    }
        location ~ ^/index\.php(/|$) {
                fastcgi_pass app1_stream;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
                fastcgi_param DOCUMENT_ROOT $realpath_root;
        }
}

server {
    server_name app2.fake;
    root /home/app2/html/public;

    location / {
        try_files $uri /index.php$is_args$args;
    }
        location ~ ^/index\.php(/|$) {
                fastcgi_pass app2_stream;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
                fastcgi_param DOCUMENT_ROOT $realpath_root;
        }
}

相关内容