一、前言
最近又配置了一遍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路径
测试通过之后,修改server
和root
的值,改为我们的域名和项目路径,此处以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; }
}
遇到的问题: 修改完server
和root
之后,访问域名发现域名多了个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-cgi
。php-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