配置LNMP遇到的问题(页面空白,不能解析php等)以及fastcgi和php-fom的关系

一、前言

      最近又配置了一遍LNMP的环境,本来以为是手到擒来,没想到还是遇到了一些坑,有些概念仍旧是不清楚,这里记录一下,希望以后不会再遇到这些坑。

二、开始配置LNMP

1、下载php,nginx,mysql等

参考我之前的博客:
debian下安装LNMP环境(一)

当然还会涉及到换下载源啊,这个网上百度就行,下载的时候,如果不清楚都可以下载什么版本的,可以使用搜索功能:

sudo apt-cache seatch php-fpm    //搜索能下载的源

//结果
php7.0-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php-cgi - server-side, HTML-embedded scripting language (CGI binary) (default)
php-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
php5.6-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php7.1-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php7.2-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php7.3-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php7.4-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)

搜索完之后安装即可:

sudo apt-get install 你想安装的版本(例如:php-7.0-fpm)

2、配置nginx

      为了方便配置nginx多站点,建议不要直接在nginx.conf配置,打开nginx.conf文件我们可以看到,是引入的有 /etc/nginx/conf.d/*.conf;也就是说我们在conf.d文件夹下新建.conf文件会都被认为是配置文件,从而进行解析
配置文件是在:/etc/nginx/conf.d/xxx.conf

新建a.conf,按照博主之前配置的那个格式复制一下,root改成根目录:

root /var/www/html;

3、启动ngin和php之后,去根目录新建文件

      在根目录新增php文件,然后访问ip,发现文件被下载下来了。。代表不能解析php文件啊。这个问题我之前就碰到一次,
参考:debian下安装LNMP环境(二)

      仔细检查之后,发现并不是这个问题。后来想着本来就是要访问ip的,我的server_name目前是被注释的状态,本来以为注释掉也不会有什么影响的加上ip发现问题解决。

server_name 没有配置,直接给注释掉了,后改为:
server_name IP地址;   (这里必须是ip)

4、页面空白,F12查看请求,在response中可以看到php文件中的代码,但是页面没解析

原因: 因为php文件的写法是:

  <?php  echo "1111";   ?>   //输出1111

错误写法:

<?  echo "1111"; ?> 	//原样输出

5、9000端口的问题

      出现以上错误的时候,网上百度有些人是说9000端口没起来的原因。但是对于php7来说,,默认配置文件由:listen = 127.0.0.1:9000 变成了 listen = /var/run/php/php-7.0=fpm.sock

      同样的,nginx里面配置也是: fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 这部分不用特意修改php-fpm的配置和nginx的配置让她监听9000,真正的错误不在这儿。我们也不用非得强求监听9000端口啊之类的,只要php-fpm跑起来就可以的,网上很多说法都是针对老版本的,对php7来说没这么麻烦。

6、修改域名和对应的root路径

测试通过之后,修改serverroot的值,改为我们的域名和项目路径,此处以laravel为例:

server {
        listen 80;
        server_name hx.happyrmb.com;
        root /var/www/pzapi/public;
#        server_name ip;
#       root /var/www/html;
        index index.php index.html;


        # 去除路径中的index.php
        location / {
                index index.php index.html index.htm;
                 try_files $uri $uri/ /index.php?$query_string;
        }
 #下面这个方法也能隐藏index.php
 #  if (!-e $request_filename) {
 #              rewrite ^/(.*) /index.php/$1 last;
 #     }


        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
              # fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
                include fastcgi_params;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location ~ /\.git { deny all; }
}

遇到的问题: 修改完serverroot之后,访问域名发现域名多了个index.php,这个解决方案就是配置文件中注释的那部分,隐藏掉index.php就好了。

三、php-fpm和fastcgi的关系

1、首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。

      web server(比如说nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。Nginx会传哪些数据给PHP解析器呢?url要有吧,查询字符串也得有吧,POST数据也要有,HTTP header不能少吧,好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。仔细想想,你在PHP代码中使用的用户从哪里来的。

      当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

2、好了,CGI是个协议,跟进程什么的没关系。那fastcgi又是什么呢?Fastcgi是用来提高CGI程序性能的。

(1)提高性能,那么CGI程序的性能问题在哪呢?

“PHP解析器会解析php.ini文件,初始化执行环境”,就是这里了。标准的CGI对每个请求都会执行这些步骤(不闲累啊!启动进程很累的说!),所以处理每个时间的时间会比较长。

(2)这明显不合理嘛!那么Fastcgi是怎么做的呢?

      首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。

3、那PHP-FPM又是什么呢?是一个实现了Fastcgi的程序,被PHP官方收了。

      大家都知道,PHP的解释器是php-cgiphp-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理(皇上,臣妾真的做不到啊!)所以就出现了一些能够调度php-cgi进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。好了PHP-FPM也是这么个东东,在长时间的发展后,逐渐得到了大家的认可(要知道,前几年大家可是抱怨PHP-FPM稳定性太差的),也越来越流行。

4、php-fpm在5.3之前官方是没有php-fpm的。、

      php-fpm是作为一个第三方的补丁你才能用的。5.3之后捏,官方就已经默认加入了,从此就不是一个补丁了。

参考:搞不清FastCgi与PHP-fpm之间是个什么样的关系

      这段文字其实是抄的思否上面一个答主的回答,解释的是在是太清晰了,一目了解。之前在网上百度的时候,总是看到有配置fast-cgi的,有配置php-fpm的,感觉这些东西弄的一团糟(实际上是自己水平太低)。弄明白之后我们就清楚了,配置的时候以php-fpm为主,具体的fast-cgi的一些东西不用我们再去处理什么,php-fpm会自己给他处理的。

end

上一篇:如何在Python中通过cgi部署zip文件(或其他二进制文件)?


下一篇:如何设置Python CGI服务器?