我在这里发现了类似的问题: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 安装将 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 文件中找到了“location”指令?那么问题是否仅限于 widgets.conf 文件中 location{} 指令的内容?
- 一旦我修复了 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; }