nginx+php出現(xiàn)No input file specified解決辦法
今天在自己本地的開發(fā)環(huán)境突然出現(xiàn)了No input file specified錯誤,反復檢查返現(xiàn)自己的配置文件和配置路徑以及權限都沒有問題。經(jīng)過反復的排查終于發(fā)現(xiàn)了問題,現(xiàn)將問題及解決分享如下:
問題原因分析
在GitHub上下載了一個開源的tp5項目,之前自己本地的網(wǎng)站運行都沒有問題。但是安裝了這個開源項目后就發(fā)現(xiàn)本地其他網(wǎng)站都無法訪問了。訪問就是No input file specified錯誤。在網(wǎng)上也找了解決辦法,但是都不是,看來這個錯誤有點兒詭異。
后來反復嘗試,重啟電腦后問題得到解決但是再次運行下載的tp5開源項目后其他網(wǎng)站又出現(xiàn)了這樣的錯誤No input file specified 而且只有這一個網(wǎng)站運行沒有問題。
據(jù)此將錯誤圈定在該開源項目的nginx配置文件中。再來看看該配置文件:
server { listen 80; server_name local.test.com; access_log /data/wwwlogs/local.test.com.log combined; error_log /data/wwwlogs/local.test.com_error.log error; index index.html index.htm index.php; root /data/php/test; add_header X-Powered-Host $hostname; fastcgi_hide_header X-Powered-By; if (!-e $request_filename) { rewrite ^/(.+?\.php)/?(.*)$ /$1/$2 last; rewrite ^/(.*)$ /index.php/$1 last; } location ~ \.php($|/){ fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; set $real_script_name $fastcgi_script_name; if ($real_script_name ~ "^(.+?\.php)(/.+)$") { set $real_script_name $1; } fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param PHP_VALUE open_basedir=$document_root:/tmp/:/proc/; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { access_log off; error_log off; expires 30d; } location ~ .*\.(js|css)?$ { access_log off; error_log off; expires 12h; }
在以上的配置中其他都是常規(guī)的配置。因為我使用cgi。在fastcgi參數(shù)中有一行可能大家也注意到了。
fastcgi_param PHP_VALUE open_basedir=$document_root:/tmp/:/proc/;
就是這句。這句的主要作用是設置fastcgi的可操作目錄從而防止跨站的,將open_basedir限定在了本項目的目錄和/tmp/以及/proc/中。
問題解決
剛剛說了是在配置的fastcgi配置中多了一句防止跨站的語句。那么這句話他其實是影響了整個fastcgi的參數(shù),這樣因為我的其他網(wǎng)站的路徑是/data/php/xxx/這樣的目錄,而不在本開源項目的目錄/data/php/test/所以fastcgi就無法找到。
所以在這句之前加#注釋這句或者刪除這句重啟系統(tǒng)或重啟nginx就可以了。
線上部署的建議
那么到底要不要使用這句呢?在線上環(huán)境中當然是可以的。在線上項目部署中對于open_basedir中最好別使用$document_root這樣的變量。如果有多個項目在線上服務器中那么可以把所以項目放置在一個統(tǒng)一的目錄中。例如我的線上是wwwroot目錄下放置其他網(wǎng)站。例如/wwwroot/test1 /wwwroot/test2那么我可以配置為
fastcgi_param PHP_VALUE open_basedir=/wwwroot/:/tmp/:/proc/;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。