1. 程式人生 > >nginx+php+laravel配置

nginx+php+laravel配置

如果laravel專案路徑在/home/project/laravel目錄下

則nginx配置如下


       location ~ \.php$ {
            root           /home/laravel/public/;
           


            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
             include        fastcgi_params;
        }
        location / {
			try_files $uri $uri/ /index.php?$query_string;

        }

這樣配置之後,輸入127.0.0.1/即可訪問laravel專案,

 

但是這樣不符合我的要求,,假如我在/home/laravel2/下面又建了一個laravel專案,那麼我必須去修改nginx配置才能訪問新專案,而且舊專案就不能訪問了。

 

我想要的效果是類似如tomcat的webapps功能,只要我在這個路徑下新建專案,那麼我什麼都不用做就可以訪問。

 

首先要搞明白的是——nginx如何處理的php請求

其次——laravel是如何找到對應路由的。

 

  1. nginx代理php實際上也是一種反向代理,nginx將請求交給php-fpm;php-fpm處理了請求之後再交給nginx
  2. 與一般的nginx反代不同的是,php-fpm能夠獲取位址列上的內容,而不是nginx反代之後的地址;因此laravel實際上也是根據地址欄上的uri來找對應的路由
  3. 檢視php的報錯資訊發現,laravel實際上有幾個比較重要的變數,分別是DOCUMENT_ROOT,DOCUMENT_URI,REQUEST_URI,SCRIPT_NAME;這類變數有很多,大概關注這幾個就行了。(php可以通過$_SERVER['']來檢視)
  4. DOCUMENT_ROOT是專案路徑,一般指向public目錄,DOCUMENT_URI不是很清楚,就laravel框架寫成"/index.php";SCRIPT_NAME相同;最重要的是REQUEST_URI,這裡就是位址列上的uri,所以只要修改這裡的值就可以實現功能了;
  5. REQUEST_URI是怎麼來的呢?看nginx配置項有一個fastcgi_param,這個指令的作用是給php-fpm傳遞引數
  6. 我現在要用127.0.0.1/php/s/public/133訪問/home/larvel/s/ 下的laravel專案的133路由,因此location匹配規則如下 /php/([^/]+)/public/(.+),第一個括號內的值代表larvavel所在目錄,相當於webapps下的第一級目錄名稱,public為固定,也可以不要,第二個括號內為uri匹配,是我真正要交給laravel解析的uri,在此時應該就是133

 

故,完整配置如下

 

 location ~ /([^/]+)/(.+)/index.php$ {
            root           /home/larvels/$1/public/;
            include        fastcgi_params;
            fastcgi_param DOCUMENT_URI "/index.php";
            fastcgi_param REQUEST_URI /$2;
            fastcgi_param SCRIPT_NAME "/index.php";


            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
            
        }
        location ~ /php/([^/]+)/public/(.+) {
			try_files $uri $uri/ /$1/$2/index.php?$query_string;

        }