我正在使用 PHP FCGI 在 Windows 上使用 Nginx 执行 PHP 脚本(这些是用 PHP 编写的 Restful Web 服务,用于处理来自网页的 Web 请求)。一切正常,直到请求计数达到“php_fcgi_max_requests”。我将其设置为 1000,因为那里的每个 Nginx + PHP FCGI 教程都建议使用此值来提高 PHP 稳定性。但我想知道在 Windows 操作系统上与 Nginx 一起使用时是否可以回收 PHP FCGI。换句话说,一旦处理了 1000 个请求并且 PHP FCGI 死了,PHP FCGI 就会重新启动并再次开始处理请求。我要求此 nginx+ PHP FCGI 始终在 Windows 上运行,直到并且除非它被用户明确关闭。
我在网上进行了很多研究,但找不到适用于 Windows 上 Nginx 的解决方案。不幸的是,任何其他操作系统都不是一种选择。我只需要一个适用于 Windows 的解决方案,我需要一个不占用太多内存且安装速度快的轻型服务器。
如果您认为使用 Nginx + PHP FCGI 无法实现我的目标,如果 PHP FCGI 可以与 Windows 上的任何其他轻型服务器(如 Nginx)一起使用,它可以处理尽可能多的请求,我愿意接受建议(对请求没有限制,或者至少在进程因达到最大请求而终止时自行回收)。
如果有人能给我提供任何指导,那将非常有帮助。
仅供引用,我启动 Nginx 服务器和 PHP FCGI,如下所示:
set PATH=<customized path>;%PATH%
set PHP_FCGI_MAX_REQUESTS=1000
RunHiddenConsole.exe %CD%\nginx\PHP\php-cgi.exe -b 127.0.0.1:9000
RunHiddenConsole.exe nginx.exe
此处,RunHiddenConsole.exe 来自此处:https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/
如果有人需要更多技术细节,请告诉我。
非常感谢。
最佳答案
不确定您是否仍然遇到这个问题。我使用的解决方法是设计一个 Windows 服务来监视 Nginx 已处理的请求数。我使用了多个 PHP-CGI(快速 CGI)实例来平衡服务器负载。
我无法分享完整的代码,因为我是为了工作而这样做的,但我可以提供设计您自己的实现的步骤。
关于我为什么以这种方式实现的一些背景信息:
PHP_FCGI_MAX_REQUESTS 的默认值为 500。默认情况下,php-cgi.exe 将在处理 500 个 Web 请求后终止。第一步
配置 Nginx 以允许主动监控。这将允许您跟踪服务器收到的请求数。
即使PHP-CGI已经崩溃,仍然可以从Nginx获取请求信息。
将以下位置信息添加到 nginx.conf 中的 server{} block 中
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
现在,如果您从您的服务器访问 localhost/nginx_status您将能够看到已处理的数量(第 3 行中的第 3 个数字是请求数)。 Nginx Doc on stub_status
第 2 步
从您的服务访问 Nginx 状态(我的是用 C# .NET 4.0 编写的)
我的服务在其整个生命周期内检查并更新请求值。您可以使用以下代码从网页中获取字符串:
//
// Get the Nginx Status String containing the number of requests to the site.
//
private string ReadSiteStatus()
{
string nginxStatus = ERROR_NO_NGINX;
using (WebClient client = new WebClient())
{
try
{
nginxStatus = client.DownloadString("http://127.0.0.1/nginx_status");
} catch (Exception ex)
{
WriteToFile(ex.Message);
}
}
return nginxStatus;
}
从这里您可以设置一个函数来解析此字符串中的请求编号。
第 3 步
设置 Nginx 以负载平衡多个 PHP-CGI 实例。对于我们的实现,我们使用了三个实例。在 nginx.conf 的 http{} block 中,添加以下 block 。
#Reference the three Fast CGI servers
upstream myproject{
server 127.0.0.1:9000 weight=1 fail_timeout=5;
server 127.0.0.1:9001 weight=1 fail_timeout=5;
server 127.0.0.1:9002 weight=1 fail_timeout=5;
}
在您的 server{} block 中,找到 location ~\.php${} block 。更新 fastcgi_pass 以引用 http 中定义的上游 block 。
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000, 9001, and 9002
location ~ \.php$ {
fastcgi_pass myproject;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
第四步
启动 PHP-CGI 的三个实例。一个监听每个端口:9000、9001 和 9002。
我想在我的服务中执行此操作,但在直接调用 PHP-CGI 可执行文件时遇到了问题。我写了一个启动 PHP-CGI 的批处理文件。它以端口号作为参数。该文件被命名为 start-php.bat
@ECHO OFF
SET PHP_FCGI_MAX_REQUESTS=2000
C:\Nginx\RunHiddenConsole.exe C:\NGinx\PHP\php-cgi -b 127.0.0.1:%1 -c
C:\NGinx\PHP\php.ini
EXIT
示例用法:
> start-php.bat 9000
将启动一个监听端口 9000 的实例。
RunHiddenConsole.exe 需要在后台运行 PHP-CGI,它在 NGinx 的网站上被引用 here .
第 5 步
构建服务。
这是取决于您的实现的部分。我可以为您提供一般的工作流程/算法。
希望这对您有所帮助。
关于php - 与 nginx 一起使用时,一旦 PHP FCGI 进程在 Windows 上死机,它就会自动重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37335444/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:
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的端口(因为绑定(
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject