Yii 2 Advanced App模板的Nginnx配置 [英] Nginnx config for Yii 2 Advanced App Template

查看:80
本文介绍了Yii 2 Advanced App模板的Nginnx配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过以下方式配置Nginx Web服务器:

I would like to configure the Nginx web-server in such a way that:

  • /index.php URI的请求应由public_html/frontend/web/index.php
  • 处理
  • /admin/index.php URI的请求应由public_html/backend/web/index.php
  • 处理
  • Requests to the /index.php URI should be handled by public_html/frontend/web/index.php
  • Requests to the /admin/index.php URI should be handled by public_html/backend/web/index.php

请告诉我我错了的地方.这是我的配置:

Advice please where I'm wrong. Here is my config:

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

推荐答案

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

Long story short: use the first method provided below.

其余的答案是建议列表.

The rest of the answer is a list of recommendations.

我将答案分为两个部分. 在第一部分中,我将告诉您根据所需的URL请求实现目标的最简单,最快的方法,但这部分地破坏了应用程序的结构,虽然没什么大不了的.

I'm going to separate my answer in two sections. In the first part, I will tell you the easiest and the fastest way to achieve your goal according to your desired URL requests, but it partly breaks the app structure, nothing serious, though.

在第二部分中,我将向您描述您在配置文件中出错的地方,并向您展示满足您需要的,写得不好的配置.

In the second part, I will describe you where you made mistakes in your configuration file and I will show you a poorly written configuration for your needs which works.

我强烈建议您使用此功能.这是Yii 2文档中的一种官方方式,可以使后端工作在同一环境下域,尽管它有助于将项目部署到共享主机.而且它不需要任何其他的nginx配置,只需一个用于前端root的基本配置即可.

I highly encourage you to use this. This is an official way from Yii 2 documentation to make backend work at the same domain, although it helps to deploy a project to a shared hosting. And it doesn't require any additional nginx configuration, just a basic one for frontend root.

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

Let me write a simple list according to this guide:

  1. 将内容从/backend/web移动到/frontend/web/admin.
  2. /frontend/web/admin/index.php(和index-test.php,如果使用的话)中更正脚本的路径
  1. Move contents from /backend/web to /frontend/web/admin.
  2. Correct scripts' paths in /frontend/web/admin/index.php (and index-test.php, if you use it)

仅此而已,您的后端位于/admin URL的同一域中.此外,请阅读指南的最后一部分,关于cookie.该高级模板旨在针对每种环境使用不同的域,因此该指南介绍了用于共享主机的后端配置,以使前端和后端的cookie保持独立.

That's all, you have your backend at the same domain at /admin URL. Additionally, read the last section of the guide regarding cookies. The advanced template was designed to use different domains for each environment, therefore the guide describes backend config for shared hosting to keep cookies from frontend and backend separate.

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

Of course, don't forget to modify your /environments files for proper initialization of your project with /init script.

我不是专业的nginx管理员,但是根据我的个人经验和文档,我可以描述您的配置中有什么问题.不幸的是,我无法提供文档链接,因为我的当前评分不允许发布2个以上的链接.

I'm not a profressional nginx administrator, but I can describe what's wrong in your configuration based on my personal experience and the documentation. Unfortunately, I won't be able to provide links to the documentation, because my current rating won't allow me to post more than 2 links.

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

You do not have root directive in your server context. Thus, when ~ \.php$ location is matched, it doesn't have root at all and uses default nginx root. Try setting common root directive in the server context, then all locations will have it by default. For example:

server {
    # Beginning of your configuration
    # ...

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

    # The rest of your configuration
    # ...
}

常见的陷阱.

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

Secondly, when a location is matched, the uri is appended to the location's root and that's the path the server attempts to look for. Thus, your /admin location suggests that the server search for $host_path/backend/web/admin. In your situation, you should use alias directive which tells the server that the matched location uri refers to alias path, not appended to root:

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

    # The rest of location
    # ...
}

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

I recommend that you read related nginx documentation about location, root and alias directives.

我在此示例配置中发布了注释,仅供您理解,不用于生产用途,我劝您将其应用于生产(直到您确信它是安全无害的).

I post this sample configuration with comments for your understanding only, not for production use, I dicourage you to apply it for your production (until you're positive it's safe and sound).

它可以工作,但是有一个令人讨厌的缺陷:如果直接请求后端(例如/admin/index.php),后端将找不到Yii2输入脚本,因此必须在enablePrettyUrl设置为trueshowScriptName设置的情况下使用到false,但是它在后端Web根目录中找到了其他任何PHP脚本.

It works, but it has an annoying defect: backend cannot find Yii2 entry script if you request it directly (like /admin/index.php), so it must be used with enablePrettyUrl set to true and showScriptName set to false, however it finds any other PHP script in the backend web root.

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
    # ...
}

此外,将baseUrl属性添加到Yii2后端配置中的request组件并将其设置为/admin.

Additionally, add baseUrl property to the request component in your Yii2 backend config and set it to /admin.

我希望我的回答能帮助您部署Yii2高级项目并进一步理解nginx,尽管您的问题已有6个月了.

I hope my answer will help you deploying your Yii2 advanced project and understanding nginx more, nevertheless your question is 6 months old.

这篇关于Yii 2 Advanced App模板的Nginnx配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆