nginx 下載 php 文件而不是渲染它們
我在這裡發現了一個類似的問題:https ://stackoverflow.com/questions/25591040/nginx-serves-php-files-as-downloads-instead-of-executing-them但不幸的是那裡的答案對我沒有幫助。所以我的故事就到這裡了。
什麼有效
當我導航到 myipaddress/index.html 時,歡迎使用 nginx 頁面正確呈現。當我導航到 myipaddress/widgets/index.html 時,歡迎使用 nginx 頁面正確呈現。注意:我對上面的 index.html 做了一些改動,所以歡迎資訊是不同的。這樣,我向自己證明它確實是在找到兩個不同的 index.html 文件/文件夾結構。
什麼不起作用
當我導航到 myipaddress/widgets/info.php 時,它不會顯示 phpinfo() 命令的詳細資訊,而是下載php 文件。
已安裝的軟體包
我正在執行 alpinelinux。安裝了以下軟體包:
lab-1:/var/www/localhost/htdocs# cat /etc/apk/world curl nginx php7-common php7-fpm
Nginx 版本
lab-1:/etc/php7# nginx -v nginx version: nginx/1.14.0
rc-狀態
lab-1:/var/www/localhost/htdocs# rc-status Dynamic Runlevel: manual nginx [ started ] php-fpm7 [ started ]
文件夾結構
lab-1:/var/www/localhost/htdocs# ls -lah total 16 drwxr-xr-x 3 www www 4.0K Sep 13 14:22 . drwxr-xr-x 3 www www 4.0K Sep 13 13:17 .. -rw-r--r-- 1 www www 624 Sep 12 20:35 index.html drwxr-xr-x 2 www www 4.0K Sep 13 17:40 widgets lab-1:/var/www/localhost/htdocs# ls -lah widgets/ total 16 drwxr-xr-x 2 www www 4.0K Sep 13 17:40 . drwxr-xr-x 3 www www 4.0K Sep 13 14:22 .. -rw-r--r-- 1 root root 632 Sep 13 14:23 index.html -rwxr-xr-x 1 www www 27 Sep 13 15:45 info.php
配置文件
- /etc/nginx/conf.d/default.conf => https://pastebin.com/QWspV6DF
- /etc/nginx/conf.d/widgets.conf => https://pastebin.com/9XR5mRUJ
- /etc/php7/php-fpm.d/www.conf => https://pastebin.com/c8HKj50W
- /etc/nginx/fastcgi.conf => https://pastebin.com/WR5w1j3P
- /etc/nginx/fastcgi_params => https://pastebin.com/3WSG6FWx
- /etc/php7/php-fpm.conf => https://pastebin.com/k3dqwrDg
注意: nginx install 將 fastcgi.conf 和 fastcgi_params 都放在文件夾中……它們看起來非常相似。我在玩,把兩者都包括在內。
netstat 證明 php fpm 正在執行
lab-1:/etc/php7# netstat -lnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 4268/php-fpm.conf) tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4323/nginx.conf tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 346/sshd tcp 0 0 :::80 :::* LISTEN 4323/nginx.conf tcp 0 0 :::22 :::* LISTEN 346/sshd
ps -A
4268 root 0:00 {php-fpm7} php-fpm: master process (/etc/php7/php-fpm.conf) 4275 nginx 0:00 {php-fpm7} php-fpm: pool www 4276 nginx 0:00 {php-fpm7} php-fpm: pool www 4323 root 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 4324 nginx 0:00 nginx: worker process 4325 nginx 0:00 nginx: worker process 4326 nginx 0:00 nginx: worker process 4328 nginx 0:00 nginx: worker process 4329 nginx 0:00 nginx: worker process 4330 nginx 0:00 nginx: worker process 4331 nginx 0:00 nginx: worker process 4332 nginx 0:00 nginx: worker process
評論
我試圖確保監聽所有者和監聽組與 nginx 執行的使用者相同——即“nginx”。我也知道使用“127.0.0.1:9000”不如使用 unix 套接字。但我現在正在嘗試為 php7-fpm 使用預設安裝設置。(說實話,我也不知道怎麼改)
問題
- 你能看出我哪裡出錯了嗎?
- 它正在下載 php 文件的事實是否證明它在正確的 conf 文件中找到了“位置”指令?那麼問題是否僅限於 widgets.conf 文件中我的 location{} 指令的內容?
- 一旦我解決了 php 問題,如果你可以看到我的設置中確實存在巨大的缺陷,你能指出它們嗎?謝謝。
根據 Roman Spiak 評論中的提示(可能根本沒有讀取 widgets.conf),我現在只是在 default.conf 中添加了另一個位置節。這解決了解釋 php 文件的問題。
我將不得不閱讀如何為未來的案例解決這個問題。理想情況下,我希望能夠為實驗室伺服器上的每個應用程序擁有單獨的 conf 文件……而不將 DNS 名稱與 IP 相關聯,因為實際上這不會發生在實驗室中。
預設 conf 現在看起來像這樣:(沒有更改底層文件夾結構)
location / { root /var/www/localhost/htdocs; location ~* \.php$ { if (!-f $document_root$fastcgi_script_name) { return 404; } include /etc/nginx/fastcgi.conf; include /etc/nginx/fastcgi_params; fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; } }
我沒有使用“alpine linux”,所以請仔細檢查您的兩個 cofig 文件是否已載入。
例如,在配置中放置一個語法錯誤,
nginx -t
如果它發現它就執行。盡量避免將一個配置中的根目錄放置到另一個配置的子目錄中。
嘗試放置它們:
root /var/www/localhost;
為了/etc/nginx/conf.d/default.conf
root /var/www/widgets;
為了/etc/nginx/conf.d/widgets.conf
請注意,該
server_name
指令必須是可解析的 DNS 或主機條目(在 /etc/hosts 中)才能正確提供伺服器塊。對於問題的第二部分,請嘗試查看https://linuxconfig.org/basic-php-7-and-nginx-configuration-on-ubuntu-16-04-linux
我的建議是嘗試閱讀 nginx 配置指令以基本了解它們的含義。