導航:首頁 > 編程語言 > nginxphp499

nginxphp499

發布時間:2023-09-05 09:12:43

A. 如何正確配置Nginx+php

其實沒多復雜
1. 將nginx和php都裝好了
2. 然後配置nginx,將php請求分發給php-fpm處理
linux下的配置文件一般在/usr/local/nginx/conf/nginx.conf
找到下面字樣,並取消注釋,且注意這個$document_root這個地方(原本應為$script***的,改成$document_root)
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

3.啟動nginx和php-fpm,然後寫個phpinfo腳本測試下成功與否就可以了

B. 訪問php頁面出現504 Gateway Timeout 怎麼解決

情況一:由於nginx默認的fastcgi進程響應緩沖區太小造成
這種情況下導致fastcgi進程被掛起,如果fastcgi服務隊這個掛起處理不是很好的話,就可能提示「504 Gateway Time-out」錯誤。
情況一解決辦法:
默認的fastcgi進程響應的緩沖區是8K,我們可以設置大一點,在nginx.conf里,加入:fastcgi_buffers 8 128k
這表示設置fastcgi緩沖區為8塊128k大小的空間。
情況一解決辦法(改進):
在上述方法修改後,如果還是出現問題,我們可以繼續修改nginx的超時參數,將參數調大一點,如設置為60秒:
send_timeout 60;
經過這兩個參數的調整,結果沒有再提示「504 Gateway Time-out」錯誤,說明效果還是挺不錯的,問題基本解決。
情況二:PHP環境的配置問題
這里我們需要對php-fpm和nginx進行配置修改。因為這種情況下,也會出現「504 Gateway Time-out」錯誤提示。
情況二解決辦法( php-fpm配置修改):
將max_children由之前的10改為30,這樣操作是為了保證有充足的php-cgi進程可以被使用。
將request_terminate_timeout由之前的0秒改成60秒,這樣使php-cgi進程處理腳本的超時時間提高到60秒,可以防止進程被掛起以提高利用效率。
情況二解決辦法(nginx配置修改):
為了減少fastcgi的請求次數,盡量維持buffers不變,我們要更改nginx的幾個配置項,如下:
將fastcgi_buffers由4 64k改為2 256k;
將fastcgi_buffer_size 由64k改為128k;
將fastcgi_busy_buffers_size由128k改為256k;
將fastcgi_temp_file_write_size由128k改成256k。
情況二解決辦法修改完,我們需要重新載入php-fpm和nginx的配置,然後再進行測試。之後就沒有發現「504 Gateway Time-out」錯誤,效果也還是不錯的!

C. 如何正確配置Nginx + PHP

對很多人而言,配置Nginx+PHP無外乎就是搜索一篇教程,然後拷貝粘貼。聽上去似乎也沒什麼問題,可惜實際上網路上很多資料本身年久失修,漏洞百出,如果大家不求甚解,一味的拷貝粘貼,早晚有一天會為此付出代價。
假設我們用PHP實現了一個前端控制器,或者直白點說就是統一入口:把PHP請求都發送到同一個文件上,然後在此文件里通過解析「REQUEST_URI」實現路由。
此時很多教程會教大家這樣配置Nginx+PHP:
server {
listen 80;
server_name foo.com;
root /path;
location / {
index index.html index.htm index.php;
if (!-e $request_filename) {
rewrite . /index.php last;
}
}
location ~ .php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path$fastcgi_script_name;

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
這裡面有很多錯誤,或者說至少是壞味道的地方,大家看看能發現幾個。

我們有必要先了解一下Nginx配置文件里指令的繼承關系:Nginx配置文件分為好多塊,常見的從外到內依次是「http」、「server」、「location」等等,預設的繼承關系是從外到內,也就是說內層塊會自動獲取外層塊的值作為預設值(有例外,詳見參考)。
參考:UNDERSTANDING THE NGINX CONFIGURATION INHERITANCE MODEL

讓我們先從「index」指令入手吧,在問題配置中它是在「location」中定義的:
location / {
index index.html index.htm index.php;
}
一旦未來需要加入新的「location」,必然會出現重復定義的「index」指令,這是因為多個「location」是平級的關系,不存在繼承,此時應該在「server」里定義「index」,藉助繼承關系,「index」指令在所有的「location」中都能生效。
參考:Nginx Pitfalls

接下來看看「if」指令,說它是大家誤解最深的Nginx指令毫不為過:
if (!-e $request_filename) {
rewrite . /index.php last;
}
很多人喜歡用「if」指令做一系列的檢查,不過這實際上是「try_files」指令的職責:
try_files $uri $uri/ /index.php;
除此以外,初學者往往會認為「if」指令是內核級的指令,但是實際上它是rewrite模塊的一部分,加上Nginx配置實際上是聲明式的,而非過程式的,所以當其和非rewrite模塊的指令混用時,結果可能會非你所願。
參考:IfIsEvil and How nginx 「location if」 works

下面看看「fastcgi_params」配置文件:
include fastcgi_params;
Nginx有兩份fastcgi配置文件,分別是「fastcgi_params」和「fastcgi.conf」,它們沒有太大的差異,唯一的區別是後者比前者多了一行「SCRIPT_FILENAME」的定義:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
注意:$document_root 和 $fastcgi_script_name 之間沒有 /。
原本Nginx只有「fastcgi_params」,後來發現很多人在定義「SCRIPT_FILENAME」時使用了硬編碼的方式,於是為了規范用法便引入了「fastcgi.conf」。
不過這樣的話就產生一個疑問:為什麼一定要引入一個新的配置文件,而不是修改舊的配置文件?這是因為「fastcgi_param」指令是數組型的,和普通指令相同的是:內層替換外層;和普通指令不同的是:當在同級多次使用的時候,是新增而不是替換。換句話說,如果在同級定義兩次「SCRIPT_FILENAME」,那麼它們都會被發送到後端,這可能會導致一些潛在的問題,為了避免此類情況,便引入了一個新的配置文件。
參考:FASTCGI_PARAMS VERSUS FASTCGI.CONF – NGINX CONFIG HISTORY
此外,我們還需要考慮一個安全問題:在PHP開啟「cgi.fix_pathinfo」的情況下,PHP可能會把錯誤的文件類型當作PHP文件來解析。如果Nginx和PHP安裝在同一台伺服器上的話,那麼最簡單的解決方法是用「try_files」指令做一次過濾:
try_files $uri =404;
參考:Nginx文件類型錯誤解析漏洞

依照前面的分析,給出一份改良後的版本,是不是比開始的版本清爽了很多:
server {
listen 80
server_name foo.com;
root /path;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php;
}
location ~ .php$ {
try_files $uri =404;
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
實際上還有一些瑕疵,主要是「try_files」和「fastcgi_split_path_info」不夠兼容,雖然能夠解決,但方案比較醜陋,具體就不多說了,有興趣的可以參考問題描述。
補充:因為「location」已經做了限定,所以「fastcgi_index」其實也沒有必要.

閱讀全文

與nginxphp499相關的資料

熱點內容
cad中篩選命令是什麼 瀏覽:800
數控銑床法蘭克編程 瀏覽:330
怎麼樣分解壓縮包圖標 瀏覽:619
php兩年工作經驗簡歷 瀏覽:763
怎麼提前解壓房貸 瀏覽:698
反詐宣傳app哪裡可以拿到用戶資料 瀏覽:855
華為交換機命令配置 瀏覽:11
電機pid演算法實例c語言 瀏覽:972
安裝ue5未找到金屬編譯器 瀏覽:963
l1壓縮性骨折微創手術 瀏覽:615
看電腦配置命令 瀏覽:108
單片機調用db數值偏移量 瀏覽:446
賓士smart車型壓縮機功率 瀏覽:527
伺服器預留地址獲取 瀏覽:1004
雲庫文件夾怎麼設置 瀏覽:295
文件夾目錄製作自動跳轉 瀏覽:454
在哪個音樂app能聽exo的歌 瀏覽:850
pdf超級加密 瀏覽:50
蘋果手機app安裝包怎麼解壓並安裝 瀏覽:907
中原30系統源碼 瀏覽:187