问题总结:php-curl在nginx中访问超时,在CLI环境正常

为了测试本地php代码,由于电脑内存限制,无法运行虚拟机,于是搭建了本地web服务调试环境Windows、Nginx、php-cgi、mysql

由于xdebug调试服务9000端口已占用,所以php-cgi使用了9001端口,在nginx配置中需要做响应更改

1 fastcgi_pass 127.0.0.1:9001;

启动服务:

nginx> start /b nginx.exe
nginx> net start mysql56
nginx> cd path_to_php
php> php-cig.exe -b 127.0.0.1:9001

停止服务

php> Ctrl+C^
php> cd path_to_nginx
nginx> net stop msyql56
nginx> nginx.exe -s stop

一直以来跑的都很顺畅,今天突然遇到了问题,发现在php中有curl请求的时候,通过nginx访问请求会超时,在CLI环境中正常。

于是就到百度上搜索,苦搜无果,最终在google上搜到结果,地址如下:
http://stackoverflow.com/questions/13813667/php-curl-timing-out-but-cli-curl-works?rq=1

因为本地只启了一个php-cgi进程,在用户访问一个php页面的时候nginx已将该进程占用,在该进程又发起http请求时,nginx发现这个仅有的进程已被占用而造成阻塞,就这样造成了死锁,一直到超时。

解决办法就是启动多个php-cgi进程,答主给出了一个他写的python管理脚本:spawn-php.py,下载后运行发现找不到win32process模块,于是又到百度搜索win32process安装包,在杨青个人博客上看到了地址,博主也纳闷在百度搜索win32process安装包,总是出现一些不相关的东西,于是就把地址记录了下来。

下载地址:http://sourceforge.net/projects/pywin32/files/

下载对应本地python版本的安装包,安装完成,运行spawn-php.py脚本时遇到了几个小问题,脚本是为python2写的,本地装的是python3.4,所以有两点需要改下:

  1. print作为函数使用,要加上括号
  2. dict没有iteritems属性了,直接使用items属性即可

运行脚本 spawn-php.py 9001 10 启动10个php-cgi进程127.0.0.1:[9001-9010]。

修改nginx配置

 1 upstream php_farm {
 2     server 127.0.0.1:9001 weight=1;
 3     server 127.0.0.1:9002 weight=1;
 4     server 127.0.0.1:9003 weight=1;
 5     server 127.0.0.1:9004 weight=1;
 6     server 127.0.0.1:9005 weight=1;
 7     server 127.0.0.1:9006 weight=1;
 8     server 127.0.0.1:9007 weight=1;
 9     server 127.0.0.1:9008 weight=1;
10     server 127.0.0.1:9009 weight=1;
11     server 127.0.0.1:9010 weight=1;
12 }
13 # ...
14 fastcgi_pass     php_farm;

重新载入nginx配置

1 nginx> nginx.exe -s reload

运行正常!

时间: 2024-08-26 15:07:31

问题总结:php-curl在nginx中访问超时,在CLI环境正常的相关文章

nginx中的超时设置

参考博文: nginx中的超时设置 nginx使用proxy模块时,默认的读取超时时间是60s. 1. send_timeout syntax: send_timeout the time default: send_timeout 60 context: http, server, location Directive assigns response timeout to client. Timeout is established not on entire transfer of ans

nginx页面访问超时和重试 参数 配置

proxy_next_upstream_tries 0keepalive_timeout 600proxy_read_timeout 600proxy_send_timeout 600proxy_connect_timeout 600 第1个参数0 表示重试次数,表示不重试 其余的参数 600 表示 600秒 可以按照实际需求改写这几个参数的值

在nginx中使用lua直接访问mysql和memcaced达到数据接口的统一

安装nginx参见<nginx+lua+redis构建高并发应用> 让nginx 中的nginx_lua_module支持mysql 和memcache 下载 https://github.com/agentzh/lua-resty-memcached https://github.com/agentzh/lua-resty-mysql 对于访问接口的统一有很多的处理方式,这里介绍使用nginx lua 访问mysql并用memcache缓存起来. 配置如下: ... location /ge

CentOS6.5 下在Nginx中添加SSL证书以支持HTTPS协议访问

参考文献: 1. NginxV1.8.0安装与配置 2. CentOS下在Nginx中添加SSL证书以支持HTTPS协议访问 3. nginx配置ssl证书的方法 4.nginx强制使用https访问(http跳转到https) 5.nginx ssl 107 (net::ERR_SSL_PROTOCOL_ERROR) 无法与服务器建立安全连接 解决方法 配置过程如下: 我的nginx是 yum 安装 具体安装过程参考:[转]CENTOS 6.5 配置YUM安装NGINX+服务器负载均衡 一.安

Nginx安装、默认虚拟主机、用户认证、nginx中PHP解析

12.6 Nginx安装 准备工作 安装包 [[email protected] ~]# cd /usr/local/src/ 下载安装包:[[email protected] src]# wget http://nginx.org/download/nginx-1.12.1.tar.gz 解压:[[email protected] src]# tar zxvf nginx-1.12.1.tar.gz 安装 环境配置 [[email protected] src]# cd nginx-1.12.

php中的curl】php中curl的详细解说

本文我来给大家详细介绍下cURL的简单的使用方法,下文我将会给大家详细介绍cURL的高级应用, cURL可以使用URL的语法模拟浏览器来传输数据, FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等协议都可以很好的支持,包括一些: HTTPS认证,HTTP POST方法,HTTP PUT方法,FTP上传,keyberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证, 下载文件断点续传,上传文件断点续传,htt

CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Redis下载地址:wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.安装依赖包 yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl

nginx中针对目录进行IP限制

一个不错的nginx中针对目录进行IP限制 ,这里我以phpmyadmin目录只能让内网IP访问,而外网不能访问的配置方法,有需要的同学可参考. nginx phpmyadmin 针对内网ip用户开放.外网ip用户关闭(在前面的配置中,location ~ ^/目录/使用正则, 优先级高于location /的配置,所以nginx无法对首页进行解析)  代码如下 复制代码 server { listen       80; server_name example.com; access_log

Nginx中 Rewrite学习笔记

路由重写是Web服务器中的一个很重要的基本功能.通过路由重写,可以结构化URL,更具语义化(对SEO有益).另外,分享出去的URL可能会因程序路由变动而导致URL失效,而路由的重写可以很好的解决这类问题. 适当的使用Rewrite功能,可以更我们带来很多的好处.Nginx中Rewrite的功能是基于perl语言兼容的正则表达式,所以在编译安装nginx之前,需要安装PREC库.Nginx中Rewrite功能实现是基于ngx_http_rewrite_module,所以确保安装了此模块. Rewr