Nginx与php-fpm通信详解

简介:Nginx+php-fpm+MySQL配置详解

在讲解之前请大家安装NginxPHP,还没有安装的可以看我之前的安装教程。

PHP5.3.3开始已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。

Nginx收到客户端的HTTP请求后将请求转发到php-fpm,php-fpm解析请求、执行PHP代码并将执行结果返回给Nginx,最后Nginx再将结果返回给客户端。这就是整个HTTP请求执行流程。

下面我们来看看php-fpm的启动、关闭、重启:

# 启动php-fpm
/usr/local/php/sbin/php-fpm

#查看php-fpm进程号
ps -aux|grep php-fpm

#关闭php-fpm
kill -INT php-fpm主进程pid

#重启php-fpm
kill -USR2 php-fpm主进程pid

在启动的过程如果发现php-fpm.conf相关错误,可以进入/usr/local/php/etc目录下,将php-fpm.conf.default 拷贝一份并改名为 php-fpm.conf。命令如下:

cp php-fpm.conf.default php-fpm.conf

在php8之后,php-fpm.conf文件末尾加载了php-fpm.d目录下的.conf结尾的文件,所以还需要进入php-fpm.d目录下将www.conf.default拷贝并重命名为www.conf。命令如下:

cp www.conf.default www.conf

php-fpm的启动和关闭比较复杂,我们可以自己配置systemctl命令来启动、关闭及重启等操作。

/usr/lib/systemd/system 目录下新建一个 php-fpm.service 文件,添加下内容

[Unit]
Description=The PHP FastCGI Process Manager
Documentation=http://php.net/docs.php
After=network.target

[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
LimitNOFILE=1000000
LimitNPROC=1000000
LimitCORE=1000000

[Install]
WantedBy=multi-user.target

使用 systemctl daemon-reload 命令使其生效,现在可以使用systemctl启动php-fpm了。

现在可以配置Nginx,将HTTP请求转发到php-fpm中了

server {
    listen    80;
    server_name test.cn;

    root /data/www/test;

   # 静态文件开启http缓存及压缩
    location ~ .*\.(html|js|css|woff){
        access_log off;
        expires 168h;
        gzip on;
        gzip_comp_level 5;
        gzip_types text/plain application/javascript text/css font/woff;
    }
   #图片开启http缓存及防盗链
    location ~ .*\.(png|jpg|jpeg|gif){
        access_log off;
        valid_referers *.test.cn servicewechat.com none;
        if ($invalid_referer) {
           return 403;
        }
        expires 168h;
    }

    location / {
        index  index.html index.htm index.php;
       #找不到文件时转发index.php及php-fpm
        if ( !-e $request_filename ) {
             rewrite ^/(.*)$ /index.php/$1 last;
            break;
        }
    }
    # 将PHP请求的请求转发给php-fpm
    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;
        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
           set $real_script_name $1;
           set $path_info $2;
        }
        fastcgi_param SCRIPT_NAME $real_script_name;
        fastcgi_param PATH_INFO $path_info;
    }
}

到此nginxphp-fpm之间的转发通信配置就此完成​。

php-fpm.conf有很多配置参数,例如:php-fpm监听的端口号、php-fpm启动的worker进程数、php-fpm错误日志文件目录配置及每个进程处理的请求数等。worker进程数一定程度上可以优化请求的并发问题

nginx配置yii框架路由:

server {
    listen 80;
    root "D:/www/blog/public";
    location / {
            index index.php index.html error/index.html;
            autoindex  off;
            try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9003;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
    }
}

详细的配置优化问题,日后有时间会单独写一遍文章说明,想第一时间获取最新文章的可以关注公众号

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1