Nginnx配置Yii 2高级应用程序模板

时间:2014-07-05 10:38:25

标签: nginx yii2

我无法配置Nginx服务器:

  • 将发送public_html/frontend/web/index.php文件以响应“index.php”请求。
  • 将发送public_html/backend/web/index.php文件以响应“admin / index.php”请求。

建议我在哪里错了。这是我的配置:

server {
    listen        80;
    server_name   yii2.lo;
    server_tokens off;

    client_max_body_size 128M;
    charset       utf-8;

    access_log    /var/log/nginx/yii2-access.log main buffer=50k;
    error_log     /var/log/nginx/yii2-error.log notice;

    set           $host_path      "/srv/http/yii2/public";
    set           $yii_bootstrap  "index.php";

    index         $yii_bootstrap;

    location / {
        root          $host_path/frontend/web;
        try_files $uri $uri/ /$yii_bootstrap?$args;

    }

    location /admin {
        root          $host_path/backend/web;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index           $yii_bootstrap;

        # Connect to php-fpm via socket
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;

        fastcgi_connect_timeout     30s;
        fastcgi_read_timeout        30s;
        fastcgi_send_timeout        60s;
        fastcgi_ignore_client_abort on;
        fastcgi_pass_header         "X-Accel-Expires";

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  HTTP_REFERER     $http_referer;
        include fastcgi_params;
    }

    location ~* \.(js|css|less|png|jpg|jpeg|gif|ico|woff|ttf|svg|tpl)$ {
        expires 24h;
        access_log off;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        log_not_found off;
        access_log off;
    }

    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

4 个答案:

答案 0 :(得分:14)

长话短说:使用下面提供的第一种方法。

答案的其余部分是建议清单。

我将分两部分分开我的回答。 在第一部分中,我将告诉您根据所需的URL请求实现目标的最简单,最快捷的方法,但它部分打破了应用程序结构,但并不严重。

在第二部分中,我将描述您在配置文件中出错的地方,我将向您展示一个写得不好的配置,以满足您的需求。

予。共享主机部署

我强烈建议你使用它。这是来自Yii 2文档的official way,用于使后端在同一个域中工作,尽管它有助于将项目部署到共享主机。并且它不需要任何额外的nginx配置,只是前端根的基本配置。

让我根据本指南写一个简单的清单:

  1. 将内容从/backend/web移至/frontend/web/admin
  2. 正确的脚本' /frontend/web/admin/index.php(和index-test.php中的路径,如果您使用它)
  3. 总而言之,您的后端位于/admin网址的同一个域中。另外,请阅读有关cookie的指南的最后一部分。高级模板旨在为每个环境使用不同的域,因此该指南描述了共享主机的后端配置,以防止前端和后端的cookie分离。

    当然,请不要忘记修改/environments文件,以便使用/init脚本正确初始化项目。

    II。 Nginx配置

    我不是故乡的nginx管理员,但我可以根据自己的个人经验和文档描述配置中的错误。不幸的是,我无法提供文档链接,因为我目前的评分不允许我发布超过2个链接。

    服务器上下文root

    您的服务器上下文中没有root指令。因此,当~ \.php$位置匹配时,它根本没有root并使用默认的nginx根。尝试在root上下文中设置常用server指令,然后默认情况下所有位置都会使用它。例如:

    server {
        # Beginning of your configuration
        # ...
    
        root /srv/http/yii2/public/frontend/web;
    
        # The rest of your configuration
        # ...
    }
    

    没有更高的上下文根是常见的pitfall

    root代替alias

    其次,当匹配位置时,uri 会附加到该位置的根目录,这是服务器尝试查找的路径。因此,您的/admin位置会建议服务器搜索$host_path/backend/web/admin。在您的情况下,您应该使用alias指令告诉服务器匹配的位置uri引用别名路径,而不是附加到root:

    location /admin {
        alias          $host_path/backend/web;
    
        # The rest of location
        # ...
    }
    

    我建议您阅读有关locationrootalias指令的相关nginx文档。

    工作但写得不好的配置

    我发布此示例配置的评论只是为了您的理解,不是为了生产用途,我建议您将其应用于您的生产(直到您肯定它是安全的)和声音)。

    它有效,但它有一个恼人的缺陷:如果您直接请求后端(如/admin/index.php),后端找不到Yii2条目脚本,因此它必须与设置为{{1}的enablePrettyUrl一起使用}和true设置为showScriptName,但它会在后端Web根目录中找到任何其他PHP脚本。

    false

    此外,将server { # The beginning of your configuration # ... # By default we will provide frontend root /srv/http/yii2/public/frontend/web; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location /admin { # We use /web/index here to make backend call to php scripts # distinct from frontend call index /web/index.php; alias $root_base/backend/web; try_files $uri $uri/ /web/index.php?$args; # Rewrite PHP requests from /admin to /web # However, Yii2 entry script returns 404 location ~ ^/admin/.*\.php$ { rewrite ^/admin/(.*)$ /web/$1; } } location ~ ^/web/.*\.php$ { # Make sure this location cannot be called externally internal; # Remember, that the uri of this location # will be appended to this root! root $root_base/backend; # PHP settings for backend } location ~ \.php$ { # PHP settings for frontend } # The rest of your configuration # ... } 属性添加到Yii2后端配置中的baseUrl组件,并将其设置为request

    我希望我的回答可以帮助您部署Yii2高级项目并更多地了解nginx,不过您的问题是6个月之久。

答案 1 :(得分:2)

这是我的工作配置,基于已接受的答案。我的项目backend目录已重命名为admin

# Example config for nginx
# frontend is available on yii-application.local/
# backend (admin) is available on yii-application.local/admin
# make sure that @app/frontend/config/main.php and @app/admin/config/main.php components sections are configured properly
# e.g. @app/frontend/config/main.php
#   'homeUrl' => '',
#   ...
#   'components' => [
#         'request' => [
#              'baseUrl' => '',
#          ],
#          'urlManager' => [
#              'enablePrettyUrl' => true,
#              'showScriptName' => false,
#          ],
#   ]
#
# e.g. @app/admin/config/main.php
#   'homeUrl' => '/admin',
#   ...
#   'components => [
#        'request' => [
#            'baseUrl' => '/admin',
#        ],
#        'urlManager' => [
#            'enablePrettyUrl' => true,
#            'showScriptName' => false,
#        ],
#   ]
server {
    set $project_root /home/yii/apps/yii-advanced;
    set $fcgi_server unix:/opt/php/var/run/php5-fpm.sock;

    charset utf-8;
    client_max_body_size 128M;

    listen 80;
    server_name yii-application.local;

    root $project_root/frontend/web;    
    index index.php;

    access_log  /home/yii/apps/yii-advanced/logs/access-backend.log;
    error_log   /home/yii/apps/yii-advanced/logs/error-backend.log;

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

    location /admin {
        index /web/index.php;
        alias $project_root/admin/web;
        try_files $uri $uri/ /web/index.php?$args;

        location ~ ^/admin/.*\.php$ {
            rewrite ^/admin/(.*)$ /web/$1;
            fastcgi_pass $fcgi_server;
            include fastcgi.conf;
        }
    }

    location ~ ^/web/.*\.php$ {
        internal;
        root $project_root/admin;
        fastcgi_pass $fcgi_server;
        include fastcgi.conf;
    }

    location ~* \.php$ {
        try_files $uri =404;
        fastcgi_pass $fcgi_server;
        include fastcgi.conf;
    }

    location ~* \.(htaccess|htpasswd|svn|git) {
        deny all;
    }
}

答案 2 :(得分:0)

尝试指定配置Nginx: 我使用" Advanced"的配置模板 在域配置文件中,为so:

指定前端

听frontend.site.loc:80; #for frontend

指定后端域: listen backend.site.loc:80; #for backend

答案 3 :(得分:0)

这家伙在创建高级应用程序nginx配置方面做得非常好(使用子域,恕我直言是最好的设置):https://gist.github.com/Kison/45ec9ce3c1ebf422cbd42bd5ce04d8e4