Nginx调用远程php-fpm

在Nginx服务器的情况下,当我们输入 http://localhost:8080/index.php回车的时候

浏览器会将请求发送给Nginx,Nginx会根据我们所配置的以.php结尾的PHP的文件交给fastcgi

  location ~ \.php {
            root           /nginx;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
          fastcgi_split_path_info ^(.+\.php)(.*)$;
         fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
           include /usr/local/etc/nginx/fastcgi.conf;

        }

通过fastcgi_pass命令将请求转发给fastcgi 即php-fpm;

php-fpm是fastcgi的一种实现。

一般我们会将收到的请求转发到本地,即php-fpm所监听的本地端口 127.0.0.1:9000

如果我们想实现分布式,将我们的请求转发给远程的php-fpm来处理该怎么去实现呢?

   1.修改本地Nginx fastcgi_pass 监听的IP:端口

    fastcgi_pass 127.0.0.1:9000 修改为 x.x.x.x:9000

    其中x.x.x.x代表远程主机的IP地址

   2.修改远程php-fpm的所监听的IP:端口

   将远程的php-fpm所监听的IP:端口,由127.0.0.1:9000改为:0.0.0.0:9000

   

127.0.0.1 代表本机

0.0.0.0     代表所有本地地址,相当于一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。

  如果我们不修改远程php-fpm监听的IP:端口为0.0.0.0:9000

  在本地直接访问  http://localhost:8081/index.php Nginx会报错出现 (其中x.x.x.x代表我远程主机地址)

  一般我们php-fpm没有启动的时候会抛出这个错误,但是我们的远程php-fpm明明已经开启了,所以无法连接到远程php-fpm所监听的地址。

*84 kevent() reported that connect() failed (61: Connection refused) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://x.x.x.x:9000", host: "localhost:8081"

  接下来我们将php-fpm监听的IP:端口改为:0.0.0.0:9000;重启php-fpm,然后我们继续访问 http://localhost:8081/index.php

这时候浏览器出现了

找不到文件?为什么呢?我接着分析Nginx的配置(其中x.x.x.x代表我的远程主机地址)

  location ~ \.php {
            root           /nginx;
            fastcgi_pass   x.x.x.x:9000;
            fastcgi_index  index.php;
          fastcgi_split_path_info ^(.+\.php)(.*)$;
         fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
           include /usr/local/etc/nginx/fastcgi.conf;

        }

请特别注意”fastcgi_script_name”一行(黑体部分),PHP-CGI特别需要此行信息来确定PHP文件的位置。也就是说,当我们将请求转发给我们fastcgi(即php-fpm)的时候,会把所请求的文件确切路径也发给fastcgi(即php-fpm);

假如我Nginx本地服务器根目录为/nginx,那么我所请求的index.php的绝对路径是/nginx/index.php,Nginx在将请求转发给远程php-fpm的时候,也会把这个路径发给远程php-fpm,远程php-fpm会根据这个路径/nginx/index.php找到index.php并且执行,将结果返回给本地Nginx服务器;这也就意味着我们远程php-fpm所在的主机必须存在路径为/nginx/index.php的文件才行,否则会报404的错误,文件不存在(即我们所看到的File not found.);

接下来在根目录下建立nginx 并且在nginx内新建index.php

cd /
mkdir /nginx 建立nginx
cd nginx
touch index.php 创建文件vim index.php   编辑输入PHP代码

我们在vim index.php编辑的时候输入如下代码:

<?php

    echo ‘remote php-fpm‘;
?>

再次访问http://localhost:8081/index.php

会出现如下的结果:

成功访问。

小结:

1:远程php-fpm监听IP:端口 改为0.0.0.0:9000(端口可以适当修改,默认9000)

2:要注意请求的文件路径地址要和本地服务器的根目录一直,否则会报404

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f4f4f4; background-color: rgba(0, 0, 0, 0.85) }
span.s1 { }

时间: 2024-12-05 18:40:48

Nginx调用远程php-fpm的相关文章

使用Spring RMI调用远程方法

Spring有多种调用远程的方式,今天学习了一下远程方法调用(RMI). RMI需要服务端和客户端 我们先从服务器开始 我的代码结构 package rmi; public interface ServerRmiI { public String sayHi(String name); } package rmi; public class ServerRmiImpl implements ServerRmiI{ public String sayHi(String name) { return

使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

如果你的项目使用了SpringCloud微服务技术,那么你就可以使用Feign来作为http客户端来调用远程的http服务.当然,如果你不想使用Feign作为http客户端,也可以使用比如JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client或者Spring的RestTemplate. 那么,为什么我们要使用Feign呢? 首先我们的项目使用了SpringCloud技术,而Feign可以和SpringCloud技术无缝整合.并且,你一

.Net Remoting 调用远程对象

根据需求,我们的系统必须以C/S方式构建,而且是三层架构,这样一来,就出现了服务器端和客户端通信的问题. 为了解决双方的通信问题,还要考虑效率.性能等方面,经过分析.试验,我们根据效率.移植.开发难易等几个因素,舍弃了一开始提出的WebService.消息队列机制,以及有人建议的基于流I/O自己解析数据的通信方式,在分析了目前主流的RPC方式(DCOM.CORBA..NET Remoting)及我们的开发平台后,最终选择了微软新推出的.NET Remoting机制.我们的原因如下: 1..NET

linux环境下nginx链接不上fpm

背景: nginx是通过源码安装,php环境和php-fpm是通过apt-get自动安装. 以下记录下出现的几个问题及方法 一.访问php文件无法识别 安装nginx和fpm完成之后,通过在nginx的容器中添加一个php的测试页面为test.php,代码只写 <?phpphpinfo();?> 其中通过页面访问方式如图所示 解决办法: 找到nginx的安装路径,找到nginx.conf,每个人的nginx安装目录位置不一样,我的nginx.conf在/usr/local/nginx/conf

Nginx+PHP-FPM远程命令执行_CVE-2019-11043

漏洞描述 此次漏洞主要由于 PHP-FPM 中 sapi/ fpm/ fpm/ fpm_main.c 文件内的 env_path_info 下溢导致,攻击者可以使用换行符 %0a 破坏 Nginx 中 fastcgi_split_path_info 对应的正则表达式,导致传递给 PHP-FPM 的 PATH_INFO 值为空,从而触发该漏洞,通过发送特制的URL请求,在一些特殊的配置情况下会导致任意代码执行. 影响范围 使用 Nginx + PHP-FPM 的服务器,且在 nginx 下进行了如

【原】Java程序调用远程Shell脚本

此程序的目的是执行远程机器上的Shell脚本. [环境参数]远程机器IP:192.168.234.123用户名:root密码:rootShell脚本的路径:/home/IFileGenTool /BakProvisionAndOccurEntrance.sh [具体步骤]1.在远程机器上,准备Shell脚本.[[email protected] IFileGenTool]# vim ./load_data.sh 1 #!/bin/sh 2 source /etc/profile 3 dbName

nginx调用cgi脚本

一个小范例 Python使用CGIHTTPServer调用shell作为cgi脚本 mkdir -p /data/cgi-bin vim hello.sh #!/bin/bash echo "Content-Type:text/html" echo ""  echo "hello world!" 执行python -m CGIHTTPServer 然后在浏览器中输入http://<ip>:8000/cgi-bin/hello.sh 即

Nginx与Lua利用fpm打成rpm包

1.下载相关软件 需要软件有:Nginx,LuaJIT,ngx_devel_kit,ngx_lua等安装文件 安装Lua或者LuaJIT都是可以的,但是出于效率的考虑,推荐安装LuaJITshell> wget http://luajit.org/download/LuaJIT-<VERSION>.tar.gz shell> tar zxvf LuaJIT-<VERSION>.tar.gz shell> cd LuaJIT-<VERSION> shel

Javascript调用MsRdpClient 完成Web调用远程桌面(CSDN手动迁移)

最近工作用到Web连接远程桌面,查找资料发现MsRdpClient都是vbscript写的.由于不太熟悉vbscript ,只能一点点改成js.. 下面是具体代码,希望给需要的人一些帮助~~ 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="viewport" content="width=device-width" /> 5 <meta http-equiv=&