繁体   English   中英

Nginx Symfony2 暂存配置

[英]Nginx Symfony2 Staging Config

我正在尝试将 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”

您的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;
}

我把配置改成这样:

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/”的正确方法是什么?

谢谢大家的帮助,不幸的是我无法让它工作。 我想我必须了解更多关于 nginx 配置的信息才能处理这些问题,然后才能在生产中使用它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM