nginx 下载 php 文件而不是渲染它们

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

配置文件

注意:nginx 安装将 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 文件中找到了“location”指令?那么问题是否仅限于 widgets.conf 文件中 location{} 指令的内容?
  3. 一旦我修复了 php 问题,如果您发现我的设置中存在很大的错误,您可以指出来吗?谢谢。

答案1

我没有使用过“alpine linux”,所以请仔细检查你的两个配置文件是否都已加载。

例如,在配置中放置一个语法错误,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 配置指令以获得有关它们含义的基本了解。

答案2

根据 Roman Spiak 评论中的提示(widgets.conf 可能根本没有被读取),我现在只是在 default.conf 中添加了另一个位置节。这样就解决了解释 php 文件的问题。

我必须了解如何为将来的情况解决这个问题。理想情况下,我希望能够在实验室服务器上为每个应用程序设置单独的 conf 文件...而无需将 DNS 名称与 IP 关联,因为实际上实验室不会发生这种情况。

默认配置现在看起来像这样:(没有改变底层文件夹结构)

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;
       }
}

答案3

根据 alexus 链接,将 try_files 替换为

if (!-f $document_root$fastcgi_script_name) { return 404; }

相关内容