Nginx Symfony2 Staging Config

时间:2015-11-10 09:31:17

标签: php symfony nginx

我试图配置nginx来为一个symfony项目提供多个版本。

发布文件夹结构:
    在/ var / WWW /我的项目/发行/ 24 /
    在/ var / WWW /我的项目/发行/ 46 /
    / var / www / my-project / releases / 47 /

我想调用类似" http://my-server/my-project/release/47"的网址。 wich shuold访问服务器上的/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;
    }
}

此配置会产生以下错误:

  

[error] 2272#0:* 169重写或内部重定向循环,同时内部重定向到" /my-project/release/47app.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp。 phpapp.phpapp.php"

3 个答案:

答案 0 :(得分:0)

您的<?php $user_id =$fgmembersite->UserID(); $db_host = 'localhost'; $db_name= 'site'; $db_table2= 'tablesite'; $db_user = 'root'; $db_pass = ''; $con2 = mysql_connect($db_host,$db_user,$db_pass) or die("خطا در اتصال به پايگاه داده"); $selected=mysql_select_db($db_name, $con2) or die("خطا در انتخاب پايگاه داده"); mysql_query("SET CHARACTER SET utf8"); $dbresult=mysql_query("SELECT * FROM $db_table2 WHERE id_user != '$user_id'",$con2); echo'* نام کاربری که به او خدمت داده اید: ','<br/>'; echo '<select name="users" dir="rtl">'; while($amch=mysql_fetch_assoc($dbresult)) { echo '<option value="'.$amch['id_user'].'">'.$amch['username'].'</option>'; } echo '</select>'; ?><br/> 容器中缺少root指令 - 架构上的默认值是server吗?否则,添加一个root指令:

/var/www

root /var/www; 无法找到匹配项,并会通过向其附加try_files来重写该网址。生成的URL与您的其他位置块不匹配,因此会一次又一次地重写。

app.php指令的最后一个词是错误的。您有try_files $2应该在哪里(可能是从之前的实验继承而来)。

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

try_files

答案 1 :(得分:0)

我将配置更改为:

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

现在打电话给&#34; http://my-server/my-project/release/47&#34;正确指向&#34; /var/www/my-project/releases/47/web/app.php"。

现在的问题是网址&#34; my-project / release / 47&#34;到达symfony路由器,无法找到到此URL的路由。

现在什么是保持网址显示的正确方法,例如&#34; // my-server / my-project / release / 47&#34;在浏览器,但到达symfony为&#34; // my-server /&#34;?

答案 2 :(得分:0)

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

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

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