7

我想以这样的方式配置 Nginx 网络服务器:

  • 对 URI 的请求/index.php应由public_html/frontend/web/index.php
  • 对 URI 的请求/admin/index.php应由public_html/backend/web/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

4 回答 4

15

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

答案的其余部分是建议列表。

我将把我的答案分成两部分。在第一部分中,我将告诉您根据您所需的 URL 请求实现目标的最简单和最快的方法,但它部分破坏了应用程序结构,虽然没有什么严重的。

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

一、共享主机部署

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

让我根据这个指南写一个简单的列表:

  1. 将内容从/backend/web移至/frontend/web/admin
  2. 更正脚本中的路径/frontend/web/admin/index.phpindex-test.php如果你使用它)

就是这样,您的后端位于/adminURL 的同一域中。此外,请阅读指南中有关 cookie 的最后一节。高级模板旨在为每个环境使用不同的域,因此该指南描述了共享主机的后端配置,以使前端和后端的 cookie 保持分离。

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

二、Nginx 配置

错误

我不是专业的 nginx 管理员,但我可以根据我的个人经验和文档描述您的配置中的问题。不幸的是,我无法提供文档链接,因为我目前的评级不允许我发布超过 2 个链接。

服务器上下文root

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

server {
    # Beginning of your configuration
    # ...

    root /srv/http/yii2/public/frontend/web;

    # The rest of your configuration
    # ...
}

没有更高的上下文根是一个常见的陷阱

root代替alias

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

location /admin {
    alias          $host_path/backend/web;

    # The rest of location
    # ...
}

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

工作但编写不佳的配置

我发布此示例配置和评论仅供您理解,不用于生产用途,我不鼓励您将其应用到您的生产中(直到您确定它是安全和健全的)。

它可以工作,但它有一个烦人的缺陷:如果你直接请求它(如 ),后端找不到 Yii2 入口脚本/admin/index.php,所以它必须与enablePrettyUrlset totrueshowScriptNameset to 一起使用false,但是它会在后端 web 根目录中找到任何其他 PHP 脚本。

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/admin

我希望我的回答能帮助您部署 Yii2 高级项目并更多地了解 nginx,但是您的问题已经 6 个月了。

于 2015-01-11T18:57:21.127 回答
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;
    }
}
于 2015-06-23T09:52:42.383 回答
0

尝试指定配置 Nginx :我在域配置文件中使用“高级”模板的配置,为此指定前端:

听frontend.site.loc:80;# 用于前端

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

于 2016-03-01T18:37:03.210 回答
0

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

于 2017-11-06T15:12:13.647 回答