当我通过 SSL(通过 WPN-XM 在 Windows 上运行 nginx 1.9.4)将来自本地 PHP 脚本的 Curl 请求发送到本地服务器时,浏览器将“等待”直到出现 504 错误。 PHP-fpm 可能已经死了,因为 Web 服务器没有处理任何其他请求。
当我向生产服务器发送相同的请求时,它工作正常。
当我从命令行发送 Curl 请求时,它就起作用了。
当我在网络浏览器中打开最终资源时,它就可以工作了。
我花了 4 个小时在谷歌上搜索和阅读 Stac Owerflow,但没有发现任何其他情况。
谢谢!
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://webserver.local/resource");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // just on local
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // just on local
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
$response = curl_exec($ch);
最佳答案
此脚本不适用于 WPN-XM v0.8.6 的默认配置, 因为只有一个 php-cgi 进程在后台监听,但您的示例需要(至少)其中两个。执行 curl 请求的脚本已经使用了 php-cgi,因此 Nginx 无法将其转发给 php-cgi。这意味着您将首先遇到一个带有加载指示器的空白页面,然后连接超时。
潜在的问题是 php-cgi 不会自动生成新进程(需要时)。这个问题在这里讨论:https://github.com/WPN-XM/WPN-XM/issues/323
有两种解决方法:
spawn-fcgi项目启动 php-cgi2016 年 3 月更新:
To solve the situation for the WPN-XM stack i've added
php-cgi-spawn\spawn.exeby default. This allows to spawn multiple PHP daemons. The spawner will be used in PHP version below v7.1.PHP v7.1 will have this solution implemented and provide better FCGI MultiPlexing out-of-the-box.
spawn-fcgi
第一个解决方案是修改start.bat。您只需将 spawn-fcgi 放在 php-cgi 前面,如下所示:
spawn-fcgi -f "%_dir%\php-cgi.exe"-a 127.0.0.1 -p 9100 -C 6 -F 4 -P "%_dir%..\temp\php.pid "
我不知道这个工具藏在哪里,也许某处有一个独立的下载,但它可能是 lighttpd windows 发行版的一部分。 我想我将从源代码编译它并使其可用于 WPN-XM。
php 上游池
第二个解决方案需要两个小步骤来启动和运行 PHP 工作池。
第一步是修改 start.bat 文件以启动多个 php-cgi 守护进程,每个守护进程监听不同的端口。我们添加了更多的 php-cgi 启动:
:start-php
echo Starting PHP FastCGI...
set PHP_FCGI_MAX_REQUESTS=0
set PHP_FCGI_CHILDREN=4
%HIDECONSOLE% %~dp0bin\php\php-cgi.exe -b 127.0.0.1:9100 -c %~dp0bin\php\php.ini
%HIDECONSOLE% %~dp0bin\php\php-cgi.exe -b 127.0.0.1:9101 -c %~dp0bin\php\php.ini
%HIDECONSOLE% %~dp0bin\php\php-cgi.exe -b 127.0.0.1:9102 -c %~dp0bin\php\php.ini
%HIDECONSOLE% %~dp0bin\php\php-cgi.exe -b 127.0.0.1:9103 -c %~dp0bin\php\php.ini
下一步是修改 server\bin\nginx\conf\nginx.conf 并激活 php_pool,而不是使用单个上游。
只需查找 fastcgi_pass php; 并将其更改为 fastcgi_pass php_pool;。
此更改将激活以下已定义的上游池:
upstream php_pool {
server 127.0.0.1:9100 weight=1 max_fails=3 fail_timeout=20s;
server 127.0.0.1:9101 weight=1 max_fails=3 fail_timeout=20s;
server 127.0.0.1:9102 weight=1 max_fails=3 fail_timeout=20s;
server 127.0.0.1:9103 weight=1 max_fails=3 fail_timeout=20s;
}
就是这样。
运行 start.bat 然后您的“curl post to localhost”示例应该可以工作了。
关于php - Curl 不适用于 Nginx 和本地主机上的 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33024579/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(
我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack
Ruby初学者努力简单地将这个@@people散列的值打印到控制台classPerson#haveafirst_nameandlast_nameattributewithpublicaccessorsattr_accessor:first_nameattr_accessor:last_name#haveaclassattributecalled`people`thatholdsanarrayofobjects@@people=[]#havean`initialize`methodtoinitializeeachinstancedefinitialize(first_name,last_
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:AmazonAPIlibraryforPython?我正在寻找一个AmazonAPI,它可以让我:按书名或作者查找书籍显示书籍封面获取有关每本书的信息(价格、评级、评论数、格式、页数等)Python或Ruby库都可以(我只想要最容易使用的库)。有什么建议么?我知道在SO上还有其他一些关于此的帖子,但这些API似乎很快就过时了。[几个月前我尝试了几个建议的Ruby库,但无法让它们中的任何一个工作。]