nginx 与 php-fpm 下载 php 文件而不是在 mac os x (本地环境)上执行它们

nginx 与 php-fpm 下载 php 文件而不是在 mac os x (本地环境)上执行它们

我无法在本地开发机器上执行 PHP 文件。我似乎已成功安装nginxphp-fpm似乎也已正确安装并正在运行,但无法弄清楚为什么要下载而不是执行 PHP 文件。

经过许多小时挫折,我认为最好问一下以前可能做过这件事的人!我已尽力提供所有信息,但如果有任何可能有用或我遗漏的信息,请不要犹豫询问在评论中。

请注意:仔细阅读我遇到的问题。我之所以这么说,是因为我几乎读完了 Google 能给我的所有与这个问题相关的文章,并尝试了几种不同的方法、修复、建议、重新安装、配置等。但这些方法都无法帮助修复甚至调试我遇到的问题。换句话说,这绝对不是一个重复的问题。我花了几个小时阅读以确保万无一失!

我已经成功安装nginxphp-fpm使用https://github.com/josegonzalez/homebrew-php。好用的旧式可信工具brew doctor确认所有东西都是最新的,并且我已经安装了所有必要的工具(XQuartz、Xcode 命令行工具等)。

以下是一些文件摘录,在尝试理解我的设置时可能会有用:

php-fpm 日志

tail -f /usr/local/var/log/php-fpm.log

[24-Dec-2013 00:05:59] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[24-Dec-2013 00:05:59] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
[24-Dec-2013 00:05:59] NOTICE: fpm is running, pid 31745
[24-Dec-2013 00:05:59] NOTICE: ready to handle connections

如果我错了,请纠正我,但这似乎表明 php-fpm 正在正确运行

我的 php-fpm 配置文件中唯一的变化

/usr/local/etc/php/5.4/php-fpm.conf 从第 145 行开始

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = myusername
group = staff

我之所以将其改为这样,myusername:staff是因为我的目录中 user:group 就是这样设置的~。这可能是问题的一部分,我不确定。

我确实遇到了所有常见的文件权限问题,并且可以确认 /clients/mywebsite/local 中的所有文件都已使用chown -R myusername:staff ./和修复了此问题chmod -R 0755 ./。考虑到这一点,希望这不应该是权限问题。

nginx 配置文件

/usr/local/etc/nginx/nginx.config

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.php index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

我对位于 /usr/local/etc/nginx/nginx.conf.default 的原始文件所做的唯一更改是将 index.php 添加到location / {块中,并取消注释该location ~ \.php$ {块以允许 php-fpm 处理.php文件

还值得一提的是,我已经创建了一个/usr/local/etc/nginx/conf.d/mywebsite.conf文件并将其添加127.0.0.1 mywebsite.local到我的主机文件中,这允许我访问http://mywebsite.local

Nginx 似乎设置正确,因为我可以访问文件夹http://mywebsite.local/test.html中的绝对文件/clients/mywebsite/local/web/test.html,但对于 PHP 文件,情况就不同了。它们只是作为 PHP 文件由浏览器下载,根本没有被执行。

我的网站配置文件

/usr/local/etc/nginx/conf.d/mywebsite.conf

server {
    listen   80;
    listen   [::]:80 default ipv6only=on;
    server_name  mywebsite.local;

    location / {
        root   /clients/mywebsite/local/web;
        index  index.php index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

我假设这里的任何部分都会被覆盖,http://mywebsite.local而这里不存在的任何内容都会从普通/usr/local/etc/nginx/nginx.conf文件中获取。

值得一提的是,我的/usr/local/var/log/nginx/error.log文件没有返回任何错误。每次我对文件进行更改时.conf,我都会使用该命令重新启动 nginx ,并sudo nginx -s reload确认进程正在运行。php-fpmnginx

我还读到过关于更改127.0.0.1:9000/var/run/php5-fpm/php5-fpm.sock似乎不在我的配置中的内容。我尝试过使用find甚至使用ack来搜索它的存在,但它不在我的机器上。我还读到过关于将此端口更改为除:9000已被使用之外的其他端口。由于这是我的第一次安装,我很确定情况并非如此,但我该如何测试它呢?

我还读过有关位于的另一个文件的信息,/usr/share/nginx/html但它同样不存在。

好了,您已经读到这里了,谢谢您!如果您能提供任何帮助,我非常感谢您抽出时间。

答案1

您不需要在 nginx.conf 文件中指定 PHP 部分,而是可以在默认文件(sites-available 目录内)中指定服务器位置,然后重新加载或重新启动 nginx:

server { 
        listen 80;
        listen [::]:820; #ipv6only=on;
        root /var/www/;  ##assuming your PHP application is in /var/www/
        index index.php index.html index.htm;
        server_name PHPApp;

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

另外,确保您的 nginx.conf 文件具有以下指令:

include /etc/nginx/sites-enabled/*;

答案2

我认为问题是你没有上游来告诉 nginx 将 php 文件发送到哪里,在你的 http 块中类似这样的内容:

upstream php {
    server unix:/var/run/php-fpm.socket;
}

unix:/var/run/php-fpm.socket必须在 php 配置的指令 listen 中指明哪里。

顺便说一句:这不是一个好的做法根位于位置块内也不多个索引指令

相关内容