nginx和分布式php-fpm

前言

生产环境中,我们经常会遇到分布式的环境。今天分享一下php-fpm的分布式环境搭建。架构图如下:

环境中会用到一台nginx和多台php-fpmnginx只处理静态文件,php-fpm负责处理对应的php代码。

配置php-fpm

这里为了演示的方便使用docker环境。

使用官方的php:5.6-fpm镜像,这里最重要的是php需要监听端口而不是监听unix套接字文件, 并将监听端口暴露出来让nginx进行代理。

有兴趣的可以看看官方的Dockerfile,如下图为官方Dockerfile中的一部分,我们需要监听的端口9000官方已经写好了

  • 创建php代码存放目录
1
mkdir ~/php/data
  • 下周php探针进行测试
1
2
cd ~/php/data
wget https://carey-akhack-com.oss-cn-hangzhou.aliyuncs.com/images/20181214/tz.php
  • 启动镜像
1
docker run -ti --rm -p 9000:9000 -v ~/php/data:/data/wwwroot/default php:5.6-fpm

这里有个-v挂着php代码,/data/wwwroot/default为什么是这个目录一会再介绍。

配置nginx

nginx我们同样适用官方的镜像。

  • nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
upstream php-fpm {
server 10.0.20.112:9000;
server 10.0.20.113:9000;
}
######################## default ############################
server {
listen 80;
server_name _;
root /data/wwwroot/default;
index index.html index.htm index.php;
location ~ [^/]\.php(/|$) {
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

这是我们的主要配置,主要看location中的配置,相信大家对这些配置都不陌生,参考Nginx官方文档 fastcgi_module 模块

启用了两台php-fpm服务器,所以这里配置服务器组进行代理。

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 注意配置否则会出现无法找到文件的错误,表示去php-fpm服务器的/data/wwwroot/default目录下找相关的php文件, 就是刚才启动php-fpm镜像挂载的目录

  • 启动nginx镜像
1
docker run -ti --rm -v ~/nginx/nginx.conf:/etc/nginx/nginx.conf -p 80:80 nginx

测试

访问: http://{nginx}/tz.php

可以看到两次访问到不通的服务器

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器