采用 nginx+php 作为 webserver 的架构模式,在现如今运用相当广泛。然而第一步需要实现的是如何让 nginx 正确的调用 php。由于 nginx 调用 php 并不是如同调用一个静态文件那么直接简单,是需要动态执行 php 脚本。所以涉及到了对 nginx.conf 文件的配置。这一步对新手而言需要动点脑筋,对于一般的熟手而言,也有不少同学并没有搞透彻为何要如此这般配置。本文的主要内容为如何在 nginx server 中正确配置 php 调用方法,以及配置的基本原理。
一、nginx 配置文件修改
配置文件位置
Nginx 的配置文件默认位置为:/etc/nginx/nginx.conf
在我的环境中 nginx.conf
在 /etc/nginx/nginx.conf
使用 vim 打开文件 nginx.conf
1 |
|
配置文件分析
1 |
|
要点说明
1、关于 error_log 可以设置 log 的类型(记录什么级别的信息)有:debug、info、notice、warn、error、crit 几种
2、关于 sendfile
一般的网络传输过程
硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈
使用 sendfile 后
硬盘 >> kernel buffer (快速拷贝到 kernelsocket buffer) >>协议栈
可以显著提高传输性能。
3、tcp_nopush 和 tcp_nodelay
tcp_nopush 只有在启用了 sendfile 时才起作用,
在启用 tcp_nopush 后,程序接收到了数据包后不会马上发出,而是等待数据包最大时一次性发出,可以缓解网络拥堵。(Nagle 化)
相反 tcp_nodelay 则是立即发出数据包.
php fastcgi 配置
分析完了配置文件后开始配置环境。
因为只是配置 PHP 的服务器,而且只使用一个端口所以只需要改动 server 部分
在 vim 中点击‘i’进入编辑模式
1 |
|
修改完成后将 vim 编辑器切换到一般一半模式(Esc),然后输入:wq 保存退出。
之后重启 Nginx 服务
1 |
|
以上就配置成功了,但是上面的配置只是 nginx 配置部分,更多的内容需要继续学习。
测试
我们可以通过下面的方法判断 Nginx 配置是否成功。
在 Nginx 的网站根目录(/var/www/)下创建一个 php 文件,随便起名我的是 php_info.php
内容如下:
1 |
|
进入你的网站看看能不能打开文件
你的 ip/文件名 例如:192.168.17.26/php_info.php
ok,我们可以看到配置成功了。
二、nginx+php 运行原理
上边我们已经配置成功了,现在我们来看下具体的原理。
首先简单的讲一讲原理,目前主流的 nginx+php 的运行原理如下:
1、nginx 的worker进程
直接管理每一个请求到 nginx 的网络请求。
2、对于 php 而言,由于在整个网络请求的过程中 php 是一个 cgi 程序的角色,所以采用名为php-fpm的进程管理程序
来对这些被请求的 php 程序进行管理。php-fpm 程序也如同 nginx 一样,需要监听端口,并且有 master 和 worker 进程。worker 进程直接管理每一个 php 进程。
3、关于 fastcgi:fastcgi 是一种进程管理器,管理 cgi 进程。市面上有多种实现了 fastcgi 功能的进程管理器,php-fpm 就是其中的一种。再提一点,php-fpm 作为一种 fast-cgi 进程管理服务,会监听端口,一般默认监听9000端口,并且是监听本机
,也就是只接收来自本机的端口请求,所以我们通常输入命令 netstat -nlpt|grep php-fpm 会得到:
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1057/php-fpm
这里的 127.0.0.1:9000 就是监听本机 9000 端口的意思。
4、关于 fastcgi 的配置文件,目前 fastcgi 的配置文件一般放在 nginx.conf 同级目录下,配置文件形式,一般有两种:fastcgi.conf 和 fastcgi_params。不同的 nginx 版本会有不同的配置文件,这两个配置文件有一个非常重要的区别:fastcgi_parames 文件中缺少下列配置:
fastcgi_param SCRIPT_FILENAME fastcgi_script_name;
我们可以打开 fastcgi_parames 文件加上上述行,也可以在要使用配置的地方动态添加。使得该配置生效。
5、当需要处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,也就是最开头所说的nginx调用了php,其实严格得讲是nginx间接调用php
。
了解了上面的这五个简单原理,在 nginx 中配置 php 调用方法就变得易如反掌。
配置文件详解:
1 |
|
1、第一个大括号 server{ }:不必多说,代表一个独立的 server,
2、listen 8011:代表该 server 监听 8011 端口
3、location ~ .php?.*${ }:代表一个能匹配对应 uri 的 location,用于匹配一类 uri,并对所匹配的 uri 请求做自定义的逻辑、配置。这里的 location,匹配了所有带.php 的 uri 请求,例如:http://192.168.244.128:8011/test.php/asdasd http://192.168.244.128:8011/index.php 等
4、root /share/test:请求资源根目录,告诉匹配到该 location 下的 uri 到/share/teset 文件夹下去寻找同名资源。
5、fastcgi_pass 127.0.0.1:9000:这行开始是本文的重点:这行代码的意思是,将进入到该 location 内的 uri 请求看做是 cgi 程序,并将请求发送到 9000 端口,交由 php-fpm 处理。
6、fastcgi_param SCRIPT_FILENAME fastcgi_script_name; :这行配置意思是:动态添加了一行 fastcgi 配置,配置内容为 SCRIPT_FILENAME,告知管理进程,cgi 脚本名称。由于我的 nginx 中只有 fastcgi_params 文件,没有 fastcgi.conf 文件,所以要使 php-fpm 知道 SCRIPT_FILENAME 的具体值,就必须要动态的添加这行配置。
7、include fastcgi_params; 引入 fastcgi 配置文件
以上就是最简洁版的 nginx 启动 php 脚本的最简配置,当重启 nginx 之后,在/share/test 目录下创建一个 xx.php 文件,输入保存,然后在浏览器中访问 localhost:8011/xx.php 就可以在网页上显示 hello world 了。
三、外网访问内网设置
外网 IP:http://58.62.21.107:8382 映射内网服务器 IP 192.168.17.56 的 82 端口,即:192.168.17.56:82,需要在nginx.conf
配置文件中开放 82 端口给 外网访问,即下面的配置:
1 |
|
以上内容希望帮助到大家,很多 PHPer 在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql 优化、shell 脚本、Docker、微服务、Nginx 等多个知识点高级进阶干货需要的可以免费分享给大家,需要请戳这里链接 或者 知乎专栏