本文介绍 PHP-FPM,Nginx,FastCGI 三者之间的关系,以及 Nginx 反向代理和负载均衡的配置。php
FastCGI 是一个协议,它是应用程序和 WEB 服务器链接的桥梁。Nginx 并不能直接与 PHP-FPM 通讯,而是将请求经过 FastCGI 交给 PHP-FPM 处理。html
location ~ \.php$ { try_files $uri /index.php =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
这里 fastcgi_pass 就是把全部 php 请求转发给 php-fpm 进行处理。经过 netstat 命令能够看到,127.0.0.1:9000 这个端口上运行的进程就是 php-fpm.nginx
Nginx 反向代理最重要的指令是 proxy_pass,如:算法
location ^~ /seckill_query/ { proxy_pass http://ris.xxmail.gdrive:8090/; proxy_set_header Host ris.xxmail.gdrive; } location ^~ /push_message/ { proxy_pass http://channel.xxmail.gdrive:8090/; proxy_set_header Host channel.xxmail.gdrive; } location ^~ /data/ { proxy_pass http://ds.xxmail.gdrive:8087/; proxy_set_header Host ds.xxmail.gdrive; }
经过 location 匹配 url 路径,将其转发到另一个服务器处理。后端
经过负载均衡 upstream 也能够实现反向代理。服务器
介绍一下 upstream 模块:session
负载均衡模块用于从”upstream”指令定义的后端主机列表中选取一台主机。nginx先使用负载均衡模块找到一台主机,再使用upstream模块实现与这台主机的交互。负载均衡
负载均衡配置:php-fpm
upstream php-upstream { ip_hash; server 192.168.0.1; server 192.168.0.2; } location / { root html; index index.html index.htm; proxy_pass http://php-upstream; }
该例定义了一个 php-upstream 的负载均衡配置,经过 proxy_pass 反向代理指令应用这个配置。这里用的 ip_hash 算法,负载均衡的算法有多种,就不一一列举了。性能
负载均衡也能够用在 fastcgi_pass 上。
如:
fastcgi_pass http://php-upstream
若是使用负载均衡,可能存在一个 session 失效的问题,你的每次请求可能分配到不一样的服务器,一个解决方法是把 Memcached 或 Redis 做为 session 存储的方式,并且还能够提升性能。
反向代理和负载均衡这两个词常常出如今一块儿,但他们其实是不一样的概念,负载均衡它更多的是强调的是一种算法或策略,将请求分布到不一样的机器上,所以实际上也起到了反向代理的做用。
一个是反向代理模块,一个是转发给 factcgi 后端处理。