【问题标题】:Nginx Symfony2 Staging ConfigNginx Symfony2 暂存配置
【发布时间】:2020-08-10 05:18:55
【问题描述】:

我正在尝试配置 nginx 以服务于一个 symfony 项目的多个版本。

发布文件夹结构:
/var/www/my-project/releases/24/
/var/www/my-project/releases/46/
/var/www/my-project/releases/47/

我想调用像“http://my-server/my-project/release/47”这样的 URL,它应该访问 /var/www/my-project/releases/47/web/app.php在服务器上。

我尝试了一段时间,但找不到最终解决方案,任何帮助都会很棒!

我的最后一次尝试:

server {
    server_name my-server;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri $uri$2app.php$is_args$args;
    }

    location ~ /my-project/release/([-a-zA-Z0-9]+)/app\.php(/|$) {
        root /var/www/my-project/releases/$1/web;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/app.php;
        fastcgi_param HTTPS off;

        error_log /var/log/nginx/my-project_$1_error.log;
        access_log /var/log/nginx/my-project_$1_access.log;

        # Prevents URIs that include the front controller. This will 404:
        # http://domain.tld/app.php/some-path
        # Remove the internal directive to allow URIs like this
        internal;
    }
}

此配置产生以下错误:

[错误] 2272#0: *169 重写或内部重定向周期,同时内部重定向到“/my-project/release/47app.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp .php"

【问题讨论】:

    标签: php symfony nginx


    【解决方案1】:

    您的server 容器中缺少root 指令——/var/www 是您架构的默认值吗?否则,添加根指令:

    root /var/www;
    

    try_files 无法找到匹配项,并将通过附加 app.php 来重写 URL。生成的 URL 与您的其他位置块不匹配,因此会一次又一次地重写。

    try_files 指令的最后一个术语是错误的。 $2 应该是 /web/ 的位置(可能继承自之前的实验)。

    使用try_files 进行一般性重写是个坏主意,因为任何输入错误的 URL 都可能导致重写循环。试试:

    location / {
      rewrite ^(/my-project/release/[-a-zA-Z0-9]+)$ $1/app.php;
    }
    

    【讨论】:

    • 感谢您的帮助,您的回答让我更进一步!
    【解决方案2】:

    我将配置更改为:

    server {
        server_name my-server;
        root /var/www;
    
        location / {
            rewrite ^(/my-project/release/[-a-zA-Z0-9]+)$ $1/app.php;
        }
    
        location ~ /my-project/release/([-a-zA-Z0-9]+)/app\.php(/|$) {
            alias /var/www/my-project/releases/$1/web;
    
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root/app.php;
            fastcgi_param HTTPS off;
    
            error_log /var/www/my-project/releases/$1/app/logs/nginx_error.log;
            access_log /var/www/my-project/releases/$1/app/logs/nginx_access.log;
    
            # Prevents URIs that include the front controller. This will 404:
            # http://domain.tld/app.php/some-path
            # Remove the internal directive to allow URIs like this
            internal;
        }
    }
    

    现在像“http://my-server/my-project/release/47”这样的调用正确指向“/var/www/my-project/releases/47/web/app.php”。

    现在的问题是 url “my-project/release/47” 到达 symfony 路由器,它找不到到这个 url 的路由。

    现在有什么正确方法可以让 url 在浏览器中显示为“//my-server/my-project/release/47”,但在 symfony 中显示为“//my-server/”?

    【讨论】:

    • 我对 symfony 不熟悉,但 URL 可能是通过 fastcgi_params 文件中的 fastcgi_param REQUEST_URI $request_uri; 参数传递给它的。也许您可以尝试将值显式设置为/my-server
    【解决方案3】:

    感谢大家的帮助,很遗憾我无法正常工作。我认为我必须了解更多关于 nginx 配置的信息才能处理此类问题,然后才能在生产中使用它。

    我的问题的解决方法是为每个版本创建一个自己的 nginx conf。该文件将在构建过程中创建,然后传输到网络服务器,复制到/etc/nginx/conf.d/[releasename].conf 并由sudo service nginx reload 激活。

    当不再需要发布时,发布目录中的卸载脚本会删除源代码和配置。

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多