Nginx

nginx 下載 php 文件而不是渲染它們

  • September 14, 2018

我在這裡發現了一個類似的問題: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

配置文件

注意: 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 使用預設安裝設置。(說實話,我也不知道怎麼改)

問題

  1. 你能看出我哪裡出錯了嗎?
  2. 它正在下載 php 文件的事實是否證明它在正確的 conf 文件中找到了“位置”指令?那麼問題是否僅限於 widgets.conf 文件中我的 location{} 指令的內容?
  3. 一旦我解決了 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 配置指令以基本了解它們的含義。

引用自:https://serverfault.com/questions/930793