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

本文介绍了一种解决PHP-cURL请求在Nginx环境下超时的方法,通过启动多个php-cgi进程并调整nginx配置,解决了因单进程阻塞导致的超时问题。

为了测试本地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

运行正常!

转载于:https://www.cnblogs.com/gudaojuanma/p/php-curl-nginx-timeout-cli-work.html

<think>我们参考用户的需求:在Ubuntu系统中配置nginxphp7.4的步骤。根据引用[1]和[2],我们可以总结出以下步骤: 1. 更新系统包 2. 安装Nginx 3. 安装PHP7.4及相关扩展 4. 配置Nginx以处理PHP文件 5. 测试PHP处理 注意:引用[1]提到Ubuntu 20.04默认仓库包含PHP7.4.3,所以直接安装即可。引用[2]提供了安装NginxPHP7.4、MySQL和Redis的步骤,但我们只关注NginxPHP7.4。 步骤详细说明如下: 1. 更新系统包列表: ```bash sudo apt update sudo apt upgrade -y ``` 2. 安装Nginx: ```bash sudo apt install nginx -y ``` 3. 安装PHP7.4和必要的扩展以及PHP-FPM(因为Nginx本身不能处理PHP,需要PHP-FPM): ```bash sudo apt install php7.4 php7.4-fpm php7.4-cli php7.4-mysql php7.4-curl php7.4-gd php7.4-mbstring php7.4-xml php7.4-xmlrpc php7.4-zip -y ``` 4. 启动PHP-FPM服务并设置开机启动: ```bash sudo systemctl start php7.4-fpm sudo systemctl enable php7.4-fpm ``` 5. 配置Nginx以处理PHP文件: 编辑Nginx的默认服务器块配置文件(或者为你的站点创建新的配置文件): ```bash sudo vi /etc/nginx/sites-available/default ``` 在server块中,添加处理PHP的location块,并确保index指令中包含index.php。修改后的server块示例: ```nginx server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } # 添加PHP处理 location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } # 防止访问.htaccess文件 location ~ /\.ht { deny all; } } ``` 注意:这里使用了`fastcgi_pass unix:/run/php/php7.4-fpm.sock;`,这是PHP-FPM在Ubuntu 20.04上的默认套接字路径。如果使用TCP连接,可以使用`fastcgi_pass 127.0.0.1:9000;`,但需要确保PHP-FPM配置为监听端口(默认是套接字)。 6. 测试Nginx配置并重新加载: ```bash sudo nginx -t sudo systemctl reload nginx ``` 7. 创建测试PHP文件: ```bash echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php ``` 8. 访问测试页面: 在浏览器中访问 `http://服务器IP/info.php`,应该显示PHP信息页面。 注意:如果遇到问题,检查以下几点: - PHP-FPM服务是否运行:`sudo systemctl status php7.4-fpm` - Nginx错误日志:`/var/log/nginx/error.log` - 确保root目录(例如/var/www/html)的权限正确,Nginx用户(www-data)有读取权限。 另外,如果服务器开启了防火墙,需要允许HTTP流量: ```bash sudo ufw allow 'Nginx HTTP' ``` 以上步骤即可在Ubuntu 20.04上安装并配置NginxPHP7.4。 相关问题: 1. 如何在Ubuntu 20.04上安装多个PHP版本? 2. 如何配置Nginx支持HTTPS? 3. 如何优化PHP-FPM的配置以提高性能? 4. 如何配置Nginx的虚拟主机来托管多个网站? 5. 如何解决NginxPHP-FPM之间的权限问题?</think>### 在Ubuntu系统中配置NginxPHP7.4的完整步骤 #### 📥 1. 系统更新与软件安装 ```bash # 更新软件源 sudo apt update && sudo apt upgrade -y # 安装Nginx sudo apt install nginx -y # 添加PHP仓库并安装PHP7.4 sudo apt install software-properties-common -y sudo add-apt-repository ppa:ondrej/php -y sudo apt update sudo apt install php7.4 php7.4-fpm php7.4-cli php7.4-mysql php7.4-curl php7.4-gd php7.4-mbstring php7.4-xml php7.4-zip -y ``` #### ⚙️ 2. 配置PHP-FPM服务 ```bash # 启动PHP-FPM服务 sudo systemctl start php7.4-fpm # 设置开机自启 sudo systemctl enable php7.4-fpm # 验证服务状态 sudo systemctl status php7.4-fpm ``` > 输出应显示 `active (running)`[^1] #### 🔧 3. 配置Nginx支持PHP处理 编辑Nginx配置文件: ```bash sudo nano /etc/nginx/sites-available/default ``` 在 `server` 块中添加PHP处理配置: ```nginx server { listen 80; server_name your_domain.com; root /var/www/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } # PHP处理配置(核心部分) location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; # PHP7.4专用套接字 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 禁止访问隐藏文件 location ~ /\.ht { deny all; } } ``` #### ✅ 4. 验证与测试配置 ```bash # 测试Nginx配置 sudo nginx -t # 应显示 "syntax is ok" 和 "test is successful" # 重启Nginx服务 sudo systemctl restart nginx # 创建PHP测试文件 echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php ``` #### 🔍 5. 验证安装结果 访问服务器IP地址查看效果: ```bash # 通过命令行测试 curl http://localhost/info.php | grep "PHP Version" ``` 或在浏览器访问: ``` http://your_server_ip/info.php ``` > 应显示PHP 7.4的详细信息页面[^2] #### 🔒 6. 安全加固(可选) ```bash # 删除测试文件 sudo rm /var/www/html/info.php # 设置网站目录权限 sudo chown -R www-data:www-data /var/www/html sudo chmod -R 755 /var/www/html ``` #### ⚠️ 常见问题排查 | 问题现象 | 解决方案 | |---------|----------| | **502 Bad Gateway** | 检查套接字路径:`ls /run/php/php7.4-fpm.sock` | | **空白页面** | 确认PHP-FPM运行:`sudo systemctl restart php7.4-fpm` | | **File not found** | 验证root路径:`grep 'root' /etc/nginx/sites-enabled/default` | | **权限拒绝** | 修复权限:`sudo chown -R www-data:www-data /var/www/html` | #### 📚 相关命令参考 ```bash # 查看PHP版本 php -v # 检查PHP-FPM监听方式 sudo ss -pl | grep php-fpm # 查看Nginx错误日志 sudo tail -f /var/log/nginx/error.log ``` > 提示:Ubuntu 20.04默认仓库包含PHP 7.4.3,通过Ondřej Surý的PPA可获得最新安全更新[^1][^2] --- ### ❓ 相关问题 1. 如何为Nginx配置HTTPS加密连接? 2. 如何在Ubuntu 20.04上安装多个PHP版本(如PHP7.4和PHP8.2)? 3. 如何优化PHP-FPM配置以提高性能? 4. 怎样配置Nginx支持WordPress的固定链接? 5. 如何解决PHP脚本执行超时(504 Gateway Timeout)问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值