MAC下配置php环境遇到的费解问题

  张一帆   2017年06月15日


  就在昨天晚上突然起了雅兴看了个大型网站redis队列应用的视频,正巧上班的时候和一位同事聊起了这个话题,突然发现曾经的理解有些偏差,所以正好趁这个机会自己练一下。谁成想刚开始动手就遇到了问题。

  我家中的MAC很久没用来编程了,一直都是用我班上的MAC编程。刚写完准备测试一下,结果打开localhost运行后,竟然显示的是”It works”。我回忆了一下我曾经对这台电脑做过的调整,我也没有重装过啊。两年前用它来写php程序还是好好的啊,怎么一下子就不行了呢?我脑子蒙了一下,这不是服务器的默认页面吗?nginx什么时候用”It works”来显示默认页面了呢?打开文件的路径怎么显示404啊?

  蒙蒙的我想一下应该如何开始排查问题。第一步先brew services stop nginx。再刷新localhost后,还是”It works”。擦,一种不好的预感油然而生,这是apache的默认页面好不啦。。。我记得我曾经删过MAC自带的apache和php的啊,怎么apache自己又装回来了?突然我意识到我曾经升级过MAC的版本。马上用terminal打开/etc/apache2,发现了apache又重新安装回来了,这个时候我才意识到MAC更新版本以后apache和php又重新安装回来了,而且还都使用了默认配置。可是我又一想,我工作用的MAC也升级了啊,怎么工作的电脑没有被重新配置啊。这让我百思不得其解,算了不想那么多了,先解决这个问题并重新配置吧。

  接下来,我需要做的就是关闭默认的apache。

sudo apachectl stop

  刷新localhost,apache还运行着。。。再刷新一下,服务停止了。再刷新下,apache又运行了,再刷新又停了。我去,这个问题真诡异,上网搜了下问题也没有人遇到过。

  打开nginx后,还是这鸟样。那我看下nginx的配置吧,nginx配置怎么被还原了啊,而且还指定到了8080端口。那我localhost:8080看看什么样子,一切正常啊。我再打localhost后,apache服务真正停止了,难道这还有缓存啊。。。

  打开phpinfo.php发现,php解析不了了。应该是配置被还原造成的,不行重新配置servers吧。

server {
        listen       8080;
        server_name  localhost;
        root /Library/WebServer/Documents;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            index  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$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$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;
        #}
    }

  在配置上边的配置的时候,因为有一段时间没有配置有些淡忘了,所以刚开始配置的时候出现了几个问题,特此我在这里写一下。

1.listen 80

  如果这样配置的话,在重启nginx的时候回提示permission denied。这是因为MAC认为1000以下的端口是不能够被除了管理员以外的人配置的。我曾试过改成80端口,但是brew services start nginx以后,nginx显示的是黄色,这说明nginx的启动有问题。后来再一想就为了每次打localhost不打80不是特别值当的,既然系统不建议用80端口,那么我就从了吧,我也没什么大项目会在这台机子上做,也就是运行一些简单的测试代码,打8080就打吧。

2.fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name

  这句话的意思是引导php-fpm解释所要运行的文件。$document_root是root /Library/WebServer/Documents的变量。如果你这样做的话,nginx会将错误的路径引导至php-fpm,就会出现“File not found”。这也是nginx配置新手经常错的地方。

3.root /Library/WebServer/Documents

  这个就是指定当前服务的根目录。我们应该将其放在server模块底下,原因是根目录是整个配置的全局变量,所有的请求都可以被代理到这个地址上。当然,你可以将其放到location中,但是如果你有多个location的话,你不得不在每一个location中指定root。所以,我们才将其放到server中,之后用$document_root来引用。

4.autoindex on

  这个命令式开启目录索引,nginx默认是不开启的。如果你网站有默认的index.html,nginx就只会展示index.html。如果没有index.html就会用目录索引来展示

  nginx配置完毕了,服务也能够正常运作起来了,接下来就是php了。在配置php的时候我发现cli的php可以和cgi的配置不同,也就是说可以两者分别指定不同的php.ini。而且,cli的php.ini更改后不需要重启php服务就可以更新服务。这是因为cli是独立的服务不依托于服务器,只有cgi依托于服务器所以更新了php.ini后需要重启服务。

  我们可以通过运行php –ini来查看cli读取的php.ini。phpinfo.php可以用来查看服务的php.ini情况。

  在关闭apache之前,我曾想过就用apache吧,但是我竟然找不到MAC自带的php是安装在哪里了。后来发现也许是apache中的libphp5.so扩展来解释php的。这种方式给我带来的不方便的地方就是以后我想给php添加扩展的时候不知道如何操作。