我看了一下FastCGI(fcgi-2.4.0)的来源,实际上没有分叉的迹象.如果我是正确的,Web服务器会为FastCGI模块(在其中编译或作为SO/DLL加载)执行流程,并处理主套接字(通常是端口TCP:80)的控制权.
在*nix上,FastCGI模块使用文件写锁(libfcgi/os_unix.c:989)在整个文件描述符(确实是侦听套接字)上"锁定"该套接字; 这样,当新连接收入时,只有FastCGI模块能够处理这些.传入套接字锁定在切换到HTTP req处理之前释放.
如FastCGI模块所示,不是多进程/线程(没有fork/pthread_create的内部用法)我假设通过来自n个FastCGI模块进程的Web服务器(通过OS_SpawnChild)的spwaning获得多个同时连接的并发处理.如果我们产生3个FastCGI进程(Apache调用3 x OS_SpawnChild),这是否意味着我们只能同时提供最多3个请求?
A)我对FastCGI工作方式的看法是否正确?
B)如果操作系统产生新进程/创建与本地数据库的连接的成本可以忽略不计,那么FastCGI对旧式可执行方法的优势是什么?
谢谢,Ema!:-)
在Apache mod_fastcgi下运行的My Perl web-app经常会出现如下错误:
在线119处超过未决信号(120)的最大计数.
我已经看到这与文件上传有关,但我不确定这是唯一的时间.我在得到错误之前(或可能在之后)也得到了一个SIGPIPE.
有什么想法吗?
编辑 感谢大家的建议.有人问119行是什么.对不起,应该把它放进去.它是在一段代码中,我在上传的文件上运行病毒检查程序.我不是每次都会得到错误,只是偶尔.
if(open VIRUS_CK, '|/usr/local/bin/clamscan - --no-summary >'.$tmp_file) {
print VIRUS_CK $data; // THIS IS LINE 119
close VIRUS_CK;
if (($? >> 8) == 1) {
open VIRUS_OUTPUT, '<'.$tmp_file;
my $vout = <VIRUS_OUTPUT>;
close VIRUS_OUTPUT;
$vout =~ s/^stdin:\s//;
$vout =~ s/FOUND$//;
print STDERR "virus found on upload: $vout\n";
return undef, 'could not accept attachment, virus found: '.$vout;
}
unlink($tmp_file);
}
Run Code Online (Sandbox Code Playgroud) 例如,FastCGI服务器对PHP脚本施加了执行时间限制,这些限制在PHP中无法使用set_time_limit().IIS我也相信这样做.
我为一个PHP应用程序编写了一个导入脚本,该应用程序在mod_php下运行良好,但在FastCGI(mod_fcgid)下失败,因为脚本在一定的秒数后被杀死.我还不知道在这种情况下检测你的时间限制的方法,还没有决定我将如何绕过它.使用重定向以小块方式执行它看起来像一个kludge,但如何?
在编写长时间运行的任务(例如导入或导出任务)时,您将使用哪些技术,其中单个PHP脚本可能在一定秒数后被服务器终止?
请假设您正在创建一个可移植脚本,因此您不一定知道PHP最终是在mod_php,FastCGI还是IIS下运行,还是在服务器级别强制执行最长执行时间.这可能也排除了shell脚本等.
我想为朋友制作一个应用程序,但他有共享托管,唯一的选择是fcgi,我找不到任何关于如何做的文档.有没有在FCGI上运行rails 3?
我已经知道当使用FastCGI运行PHP时,我的网站主目录中包含的.htaccess文件被忽略(现在我的.htaccess文件位于/var/www/vhosts/mydomain.com/httpdocs)我的问题是我如何才能将.htaccess上当前的指令和标志仅应用于此域?我可以只为这个域提供httpd.conf吗?我应该在哪里放置当前的.htaccess内容以保持相同的设置工作?
提前谢谢了,
我正在尝试使用FastCGI在使用IIS 7.5的Windows 7安装上安装RoR 3.
到目前为止,我已经安装了Ruby on Rails并使用'rails server'工作,我可以在http:// localhost:3000上看到该站点,但我想在IIS中运行此站点.我已经设置了FastCGI应用程序,并设置了所有权限(我能想到)以允许它工作,但是我在浏览到IIS站点时得到的是500错误
HTTP Error 500.0 - Internal Server Error
F:\Ruby\bin\ruby.exe - The FastCGI process exited unexpectedly
Run Code Online (Sandbox Code Playgroud)
关于如何调试为什么会发生这种情况的任何想法.当我启用Failed Request Tracing时,我看到的只有FASTCGI_UNEXPECTED_EXIT.在日志的细节中,我看到:
NOTIFY_MODULE_START
FASTCGI_ASSIGN_PROCESS
FASTCGI_START
FASTCGI_WAITING_FOR_RESPONSE
FASTCGI_UNEXPECTED_EXIT ** This is where the error is
Run Code Online (Sandbox Code Playgroud)
我不知道从哪里开始调试此问题,或者甚至支持此设置.
只是扔进去:我也在尝试使用URL Rewrite.我在网上找到的所有东西都使用了重写'.fcgi'来供处理程序使用,但我不确定Rails 3是否需要这个.如果是这样,这个文件是如何生成的?
我想FastCGI Dev kit从这里安装.
但是当我尝试时,我得到了下面的错误make.我不知道如何解决.有任何想法吗?我在用Ubuntu 64 bit.
*** Warning: This library needs some functionality provided by -lnsl.
*** I have the capability to make that library automatically link in when
*** you link to this library. But I can only do this if you have a
*** shared version of the library, which you do not appear to have.
*** The inter-library dependencies that have been dropped here will be
*** automatically added …Run Code Online (Sandbox Code Playgroud) 主要的Web框架(例如Django,Pyramid,Rails等)通常作为持久性服务器运行,并使用像nginx这样的单独Web服务器作为前端.Web服务器通过FastCGI或SCGI等协议连接:
browser --[http]--> nginx --[fastcgi]--> flup -> django
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很复杂; 当后端可以运行自己的HTTP服务器时,为什么请求转换为完全不同的协议?
browser --[http]--> nginx --[http]--> wsgiref -> django
Run Code Online (Sandbox Code Playgroud)
这种方法似乎既简单又灵活,因为只有一种传输协议,它是一种RFC.
但是,我认为我从未见过一个Web框架鼓励纯http设计,所以我认为必须有一个理由.
在这里使用像FastCGI/SCGI这样的协议有什么好处?
我刚刚安装了fcgiwrap和spawn-fcgi,以便能够在nginx中使用perl脚本.我在我的网站配置中添加了这样的内容:
location ~ \.pl$ {
gzip off;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include fastcgi_params;
fastcgi_index index.pl;
}
Run Code Online (Sandbox Code Playgroud)
如果perl代码中存在错误,浏览器会显示以下消息:
An error occurred while reading CGI reply (no response received)
Run Code Online (Sandbox Code Playgroud)
而且我无法在nginx日志中找到perl错误.如果存在perl编译错误,命令行上的"perl -c"会有所帮助,但它不能帮助我解决运行时错误.
如何告诉perl或fcgiwrap在nginx错误日志或其他一些日志文件中保存错误?
我有一个400+节点munin-1.4.x安装,我想升级到munin-2.x,以利用munin主服务器上基于CGI的内容生成(html和图形).我已经浏览了官方的dox(http://munin-monitoring.org/wiki/CgiHowto2),它根本就没用了.它只涵盖VirtualHost(http://munin.example.com),这不是我的设置,但我试图用它作为起点.
具体来说,我希望http://example.com/munin成为动态生成列出所有节点的html内容的基本URL,其中包含指向各个节点页面的链接(然后在单击时动态生成/更新) .增加的问题是我在Fedora上做了这个(16),而我发现的绝大多数的howto都假设Debian/Ubuntu(或假设通过cron生成非cgi静态内容).
官方的Fedora munin软件包安装如下:
到目前为止我做了什么:*在/etc/munin/munin.conf中设置"html_strategy cgi"和"cgiurl_graph/munin/cgi/munin-cgi-html"*在/ etc/httpd/conf/httpd中添加了以下内容.conf文件:
# Rewrites
RewriteEngine On
Alias /static /var/www/html/munin/static
Alias /munin /var/www/html/munin
# HTML
RewriteCond %{REQUEST_URI} !^/static
RewriteCond %{REQUEST_URI} .html$ [or]
RewriteCond %{REQUEST_URI} =/
RewriteRule ^/(.*) /var/www/html/munin/cgi/munin-cgi-html/$1 [L]
# Images
# - remove path to munin-cgi-graph, if present
RewriteRule ^/munin/cgi/munin-cgi-graph/(.*) /$1
RewriteCond %{REQUEST_URI} !^/static
RewriteCond %{REQUEST_URI} .png$
RewriteRule ^/(.*) /var/www/html/munin/cgi/munin-cgi-graph/$1 [L]
ScriptAlias /munin/cgi/munin-cgi-graph /var/www/html/munin/cgi/munin-cgi-graph
<Location /munin/cgi/munin-cgi-graph>
Options +ExecCGI FollowSymLinks
<IfModule mod_fcgid.c> …Run Code Online (Sandbox Code Playgroud)