nginx+php+laravel配置
阿新 • • 發佈:2018-11-09
如果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是如何找到對應路由的。
- nginx代理php實際上也是一種反向代理,nginx將請求交給php-fpm;php-fpm處理了請求之後再交給nginx
- 與一般的nginx反代不同的是,php-fpm能夠獲取位址列上的內容,而不是nginx反代之後的地址;因此laravel實際上也是根據地址欄上的uri來找對應的路由
- 檢視php的報錯資訊發現,laravel實際上有幾個比較重要的變數,分別是DOCUMENT_ROOT,DOCUMENT_URI,REQUEST_URI,SCRIPT_NAME;這類變數有很多,大概關注這幾個就行了。(php可以通過$_SERVER['']來檢視)
- DOCUMENT_ROOT是專案路徑,一般指向public目錄,DOCUMENT_URI不是很清楚,就laravel框架寫成"/index.php";SCRIPT_NAME相同;最重要的是REQUEST_URI,這裡就是位址列上的uri,所以只要修改這裡的值就可以實現功能了;
- REQUEST_URI是怎麼來的呢?看nginx配置項有一個fastcgi_param,這個指令的作用是給php-fpm傳遞引數
- 我現在要用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;
}