thinkphp5 的 nginx 配置文件

首先我們假定幾個條件:
1,配置文件使用vhost方式,如果單主機的酌情修改;
2,假定配置的域名是 mydomain.vm;
3,假定用戶使用的是 linux 操作系統;
4,假定項目文件部署在 /app/www/mydomain.vm 目錄下;
5,假定 nginx 的日誌放在 /app/logs/nginx 目錄下。

下面是配置文件的具體內容:

server {
    listen 80;
    server_name    mydomain.vm    www.mydomain.vm;
    access_log    /app/logs/nginx/mydomain_access.log;
    error_log    /app/logs/nginx/mydomain_error.log;
    set        $root    /app/www/mydomain.vm/public;
    location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
    {
        root $root;
    }
    location / {
        root    $root;
        index    index.html index.php;
        if ( -f $request_filename) {
            break;
        }
        if ( !-e $request_filename) {
            rewrite ^(.*)$ /index.php/$1 last;
            break;
        }
    }
    location ~ .+\.php($|/) {
        set $script $uri;
        set $path_info "";
        if ($uri ~ "^(.+\.php)(/.+)") {
            set $script $1;
            set $path_info $2;
        }
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
        fastcgi_index    index.php?IF_REWRITE=1;
        fastcgi_param    PATH_INFO    $path_info;
        fastcgi_param    SCRIPT_FILENAME    $root$fastcgi_script_name;
        fastcgi_param    SCRIPT_NAME    $script;
        include        fastcgi_params;
    }
}

複製代碼
關於配置文件的幾個需要關注的地方:
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 目錄下做一個鏈接即可,例如:

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

複製代碼
就可以生效了。

=========華麗的分割線=========
2016-7-13補充:
在新版的nginx下面,上面的配置會出現一點問題,主要是 path_info 在某些情況下會取到錯誤的值,導致 tp5 框架誤認爲模塊名爲 ‘E’。
下面提供的是最新版本的配置文件,適用於最新版的 nginx。實測已經解決了這個問題。

server {
    listen 80;
    server_name    mydomain.vm    www.mydomain.vm;
    access_log    /app/logs/nginx/mydomain_access.log;
    error_log    /app/logs/nginx/mydomain_error.log;
    set        $root    /app/www/mydomain.vm/public;
    location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
    {
        root $root;
    }
    location / {
        root    $root;
        index    index.html index.php;
        if ( -f $request_filename) {
            break;
        }
        if ( !-e $request_filename) {
            rewrite ^(.*)$ /index.php/$1 last;
            break;
        }
    }
    location ~ .+\.php($|/) {
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
        fastcgi_split_path_info ^((?U).+.php)(/?.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param    SCRIPT_FILENAME    $root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章