Laravel框架加載出錯require(): open_basedir restriction in effect
錯誤詳情
Laravel運行環境 Linux Nginx
**Warning**: require(): open_basedir restriction in effect. File(/home/wwwroot/ssmanager/vendor/autoload.php) is not within the allowed path(s): (/home/wwwroot/ssmanager/public/:/tmp/:/proc/) in **/home/wwwroot/ssmanager/public/index.php**on line **24**
**Warning**: require(/home/wwwroot/ssmanager/vendor/autoload.php): failed to open stream: Operation not permitted in **/home/wwwroot/ssmanager/public/index.php** on line **24**
**Fatal error**: require(): Failed opening required '/home/wwwroot/ssmanager/public/../vendor/autoload.php' (include_path='.:/usr/local/php/lib/php') in **/home/wwwroot/ssmanager/public/index.php** on line **24**
解決方法
找到Nginx中的fastcgi.conf配置文件,一般位于fastcgi.conf文件中
/usr/local/nginx/conf/fastcgi.conf
打開文件找到如下部分
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param ?REDIRECT_STATUS ? ?200;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
將其$document_root變量修改為項目目錄(或者刪掉這行),例如我現在的項目是ssmanager(Laravel項目),只需將$document_root修改為ssmanager所在的目錄。
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/ssmanager/:/tmp/:/proc/";
重啟Nginx服務器
/etc/init.d/nginx restart
錯誤分析
fastcgi_param是什么
fastcgi_param屬于ngx_http_fastcgi_module模塊的參數,用于設置傳給FastCgi服務器的參數及設置PHP配置項,其中包含用戶訪問IP等及一些其他的Webserver信息;通過PHP_ADMIN_VALUE選項可以給PHP進行配置
(自PHP 5.3.3 起,可以通過 web 服務器設置 PHP 的配置)PHP官方文檔
fastcgi_param 語法:
名稱?? ?選項
Syntax?? ?fastcgi_param parameter value [if_not_empty]
Default?? ?-
Context?? ?http, server, location
其中value可以包含文本,變量及其組合。僅當在當前級別上沒有定義fastcgi_param指令時,定義的指令才可以從前一級繼承。
下面列出一些常規參數,可以看出fastcgi_param的具體用法
fastcgi_param ?SCRIPT_FILENAME ? ?$document_root$fastcgi_script_name;
fastcgi_param ?QUERY_STRING ? ? ? $query_string;
fastcgi_param ?REQUEST_METHOD ? ? $request_method;
fastcgi_param ?CONTENT_TYPE ? ? ? $content_type;
fastcgi_param ?CONTENT_LENGTH ? ? $content_length;
fastcgi_param ?SCRIPT_NAME ? ? ? ?$fastcgi_script_name;
fastcgi_param ?REQUEST_URI ? ? ? ?$request_uri;
fastcgi_param ?DOCUMENT_URI ? ? ? $document_uri;
fastcgi_param ?DOCUMENT_ROOT ? ? ?$document_root;
fastcgi_param ?SERVER_PROTOCOL ? ?$server_protocol;
fastcgi_param ?REQUEST_SCHEME ? ? $scheme;
fastcgi_param ?HTTPS ? ? ? ? ? ? ?$https if_not_empty;
fastcgi_param ?GATEWAY_INTERFACE ?CGI/1.1;
fastcgi_param ?SERVER_SOFTWARE ? ?nginx/$nginx_version;
fastcgi_param ?REMOTE_ADDR ? ? ? ?$remote_addr;
fastcgi_param ?REMOTE_PORT ? ? ? ?$remote_port;
fastcgi_param ?SERVER_ADDR ? ? ? ?$server_addr;
fastcgi_param ?SERVER_PORT ? ? ? ?$server_port;
fastcgi_param ?SERVER_NAME ? ? ? ?$server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param ?REDIRECT_STATUS ? ?200;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
通過觀察可以看出,我們在使用PHP中的$_SERVER[SERVER_ADDR]獲取WEBSERVER相關參數時,其實就是與fastcgi_param的參數對應的。
在編譯 PHP 時添加--enable-force-cgi-redirect選項,REDIRECT_STATUS和PHP_ADMIN_VALUE則會生效
PHP_ADMIN_VALUE
PHP_ADMIN_VALUE 為一個運行池傳遞附加的環境變量,或者更新 PHP 的配置值
在FPM中,可以使用不同的設置來運行多個進程池。 這些設置可以針對每個進程池單獨設置。
還可以在為一個運行池傳遞附加的環境變量,或者更新 PHP 的配置值。PHP官方文檔
可以得出 Nginx 通過制定 PHP_ADMIN_VALUE 來給 PHP 設定 open_basedir 配置項
OPEN_BASEDIR
open_basedir作用是將 PHP 所能打開的文件限制在指定的目錄樹中,包括文件本身。
當一個腳本試圖用例如 fopen() 或者 gzopen() 打開一個文件時,該文件的位置將被檢查。當文件在指定的目錄樹之外時 PHP 將拒絕打開它。所有的符號連接都會被解析,所以不可能通過符號連接來避開此限制。
其實open_basedir有些注意的地方
open_basedir 指定的限制實際上是前綴,不是目錄名。也就是說“open_basedir = /dir/incl”也會允許訪問“/dir/include”和“/dir/incls”,如果它們存在的話。如果要將訪問限制在僅為指定的目錄,用斜線結束路徑名。例如:“open_basedir = /dir/incl/”
總結
知道了fastcgi_param,PHP_ADMIN_VALUE,open_basedir是什么,就可以知道問題出現在, Nginx 中使用 PHP_ADMIN_VALUE 配置了 PHP 的用于控制PHP自身能打開目錄樹的open_basedir選項,想要解決問題,可以通過指定對應目錄樹或者刪除此配置即可(簡單粗暴)。
open_basedir php授權目錄設置
php為了安全性考慮,有一項 open_basedir 的設置。根據你web服務器環境,open_basedir可以在幾個地方設置。
首先 在php.ini中配置。
;open_basedir =
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root:/tmp/:/proc/:/you_web_path"; 如果發現配置項前是有分號,表明php.ini中沒有該設置。那就很可能是在? php-fpm? 中的 fastcgi.conf中配置了。php-fpm中的配置會覆蓋php.ini的配置。
/you_web_path 是你要添加的讓php可以訪問的路徑。多個路徑直接分號隔開
如果也給服務器有多個項目,無論是在php.ini或者fastcgi.cong中設置,都是針對所有項目。那能不能只針對某個項目設置呢?
答案是肯定的。還可以在項目根目錄中通過 .user.ini 進行配置。
.user.ini配置
首先,要使.user.ini生效,要設置php.ini 中的
user_ini.filename =?".user.ini"
user_ini.cache_ttl = 300
關于這兩個配置的意義,請看php手冊?http://php.net/manual/zh/configuration.file.per-user.php
注釋掉 fastcgi.conf 中的?open_basedir? 的配置。
在項目根目錄 創建 .user.ini文件,寫入如下內容
1
open_basedir=/tmp/:/proc/:/you_web_path
/you_web_path 是你要添加的讓php可以訪問的路徑。多個路徑直接分號隔開
重啟一下php-fpm 服務即可。
測試中還發現這三個地方配置的優先級如下
“php.ini” > “nginx fastcgi fastcgi_param” > “php-fpm.conf”
php下open_basedir的配置
在下載了YII2.0框架并成功配置了nginx之后,發現還是無法訪問,查看錯誤日志發現報錯信息有中有
require(): open_basedir restriction in effect。
遂去網上查找,后發現是php的配置項open_basedir限制了require()訪問的路徑。
open_basedir 將php所能打開的文件限制在指定的目錄樹中,包括文件本身。當程序要使用例如fopen()或file_get_contents()打開一個文件時,這個文件的位置將會被檢查。當文件在指定的目錄樹之外,程序將拒絕打開。
在linux系統中,open_basedir主要在php.ini和fastcgi.conf文件中配置,
php.ini中配置如下:
open_basedir="指定目錄";
fastcgi.conf中配置如下:
fastcgi_param PHP_VALUE "open_basedir=指定目錄";
在windows下,主要在php.ini和apache的http.conf文件中配置,http.conf中配置如下:
php_admin_value open_basedir "指定目錄"。
用open_basedir指定的限制實際上是前綴,不是目錄名。 也就是說 open_basedir=/home/fdipzone 也會允許訪問/home/fdipzone_abc,如果要將訪問限制為目錄,請使用斜線結束路徑名,例如:open_basedir=”/home/fdipzone/”。如果要設置多個目錄,window使用;分隔目錄,linux使用:分隔目錄。
使用open_basedir可以限制程序可操作的目錄和文件,提高系統安全性。但會影響I/O性能導致系統執行變慢,因此需要根據具體需求,在安全與性能上做平衡。
=====補充======
將網上找到的一些和502 Bad Gateway錯誤有關的問題和排查方法列一下,先從FastCGI配置入手:
1.查看FastCGI進程是否已經啟動
NGINX 502錯誤的含義是sock、端口沒被監聽造成的。我們先檢查fastcgi是否在運行
2.檢查系統Fastcgi進程運行情況
除了第一種情況,fastcgi進程數不夠用、php執行時間長、或者是php-cgi進程死掉也可能造成nginx的502錯誤
運行以下命令判斷是否接近FastCGI進程,如果fastcgi進程數接近配置文件中設置的數值,表明worker進程數設置太少
netstat?-anpo?|?grep?"php-cgi"?|?wc?-l
server {
listen 80;
server_name evch.com;
root /home/wwwroot/vevchatspace/public;
# add_header X-Frame-Options "SAMEORIGIN";
# add_header X-XSS-Protection "1; mode=block";
# add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
# location ~ \.php$ {
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
# fastcgi_pass unix:/tmp/php-cgi.sock;
# fastcgi_index index.php;
# include fastcgi_params;
#}
#location ~ \.php(.*)$ {
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi.sock; #監聽的是這個
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_VALUE open_basedir=/home/wwwroot/vevace/:/tmp/:/proc/; #這里加上這句
#fastcgi_param PATH_INFO $1;
fastcgi_param PATH_INFO $fastcgi_path_info;
#fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
鏈接:https://www.jianshu.com/p/a862ce3d13fb
參考:https://www.cnblogs.com/guohong-hu/p/9350076.html
Laravel PHP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。