thinkphp5 的 nginx 配置文件 伪静态

今天在tp5高级群遇到人询问tp5支持pathinfo的nginx配置怎么写的问题,
发了一份配置文件给管理员共享在群里面了。
不过那份文件里面没有做一些说明,
所以这里做一下解释。

首先我们假定几个条件:
1,配置文件使用vhost方式,如果单主机的酌情修改;
2,假定配置的域名是 mydomain.vm;
3,假定用户使用的是 linux 操作系统;
4,假定项目文件部署在 /app/www/mydomain.vm 目录下;
5,假定 nginx 的日志放在 /app/logs/nginx 目录下。

下面是配置文件的具体内容:

  1. server {
  2.     listen 80;
  3.     server_name    mydomain.vm    www.mydomain.vm;
  4.     access_log    /app/logs/nginx/mydomain_access.log;
  5.     error_log    /app/logs/nginx/mydomain_error.log;
  6.     set        $root    /app/www/mydomain.vm/public;
  7.     location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
  8.     {
  9.         root $root;
  10.     }
  11.     location / {
  12.         root    $root;
  13.         index    index.html index.php;
  14.         if ( f $request_filename) {
  15.             break;
  16.         }
  17.         if ( !-e $request_filename) {
  18.             rewrite ^(.*)/index.php/$1 last;
  19.             break;
  20.         }
  21.     }
  22.     location ~ .+\.php($|/) {
  23.         set $script $uri;
  24.         set $path_info “”;
  25.         if ($uri ~ “^(.+\.php)(/.+)“) {
  26.             set $script $1;
  27.             set $path_info $2;
  28.         }
  29.         fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
  30.         fastcgi_index    index.php?IF_REWRITE=1;
  31.         fastcgi_param    PATH_INFO    $path_info;
  32.         fastcgi_param    SCRIPT_FILENAME    $root$fastcgi_script_name;
  33.         fastcgi_param    SCRIPT_NAME    $script;
  34.         include        fastcgi_params;
  35.     }
  36. }

 

关于配置文件的几个需要关注的地方:
1,如果用户没有修改过 nginx 初始的 log 文件路径,那么通常是在 /var/logs/nginx 目录下,修改一下这个配置文件中对应的部分即可;
2,配置文件中做了动静分离,但是考虑到开发环境经常需要变动静态内容,所以没有设置缓冲,如果需要的话,在静态解析部分增加 expires 指令即可;
3,以上配置文件在 debian / ubuntu 发行版中可以直接使用,如果是在 centos / gentoo 这样的发行版中可能需要略作调整;
4,配置文件中直接使用了 php7.0 的 fpm 方式,如果是 5.4/5.6 版本,对应修改一下 fastcgi_pass 的参数,需要提醒的是 5.4/5.6 的 .sock 很可能路径是在 /run 下面,而不是 /run/php 下面。

当然,如果大家使用的是 debian 发行版的话,这个配置文件可以直接放置在项目工程目录里面,然后再在 /etc/nginx/sites-enabled 目录下做一个链接即可,例如:

  1. #cd /etc/nginx/sites-enabled
  2. #ln -s /app/www/mydomain.vm/profile/nginx_vhost_profile ./01_mydomain
  3. #nginx -s reload

 

就可以生效了。

=========华丽的分割线=========
2016-7-13补充:
在新版的nginx下面,上面的配置会出现一点问题,主要是 path_info 在某些情况下会取到错误的值,导致 tp5 框架误认为模块名为 ‘E’。
下面提供的是最新版本的配置文件,适用于最新版的 nginx。实测已经解决了这个问题。

  1. server {
  2.     listen 80;
  3.     server_name    mydomain.vm    www.mydomain.vm;
  4.     access_log    /app/logs/nginx/mydomain_access.log;
  5.     error_log    /app/logs/nginx/mydomain_error.log;
  6.     set        $root    /app/www/mydomain.vm/public;
  7.     location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
  8.     {
  9.         root $root;
  10.     }
  11.     location / {
  12.         root    $root;
  13.         index    index.html index.php;
  14.         if ( f $request_filename) {
  15.             break;
  16.         }
  17.         if ( !-e $request_filename) {
  18.             rewrite ^(.*)/index.php/$1 last;
  19.             break;
  20.         }
  21.     }
  22.     location ~ .+\.php($|/) {
  23.         fastcgi_pass    unix:/run/php/php7.0fpm.sock;
  24.         fastcgi_split_path_info ^((?U).+.php)(/?.+)$;
  25.         fastcgi_param PATH_INFO $fastcgi_path_info;
  26.         fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  27.         fastcgi_param    SCRIPT_FILENAME    $root$fastcgi_script_name;
  28.         include        fastcgi_params;
  29.     }
  30. }