首先,这是我的脚本:
#!/usr/bin/python
import sys, os
sys.path.append('/home/username/python')
sys.path.append("/home/username/python/flup")
sys.path.append("/home/username/python/django")
# more path stuff
os.environ['DJANGO_SETTINGS_MODULE'] = "project.settings"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")
Run Code Online (Sandbox Code Playgroud)
正如所描述这里.
这是我尝试从shell运行它时得到的错误:
WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI!
WSGIServer: missing FastCGI param SERVER_NAME required by WSGI!
WSGIServer: missing FastCGI param SERVER_PORT required by WSGI!
WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI!
Status: 404 NOT FOUND
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<!-- more html which looks to be …Run Code Online (Sandbox Code Playgroud) 我想编写一个FastCGI应用程序,它应该使用线程处理多个同时请求.我看一下SDK附带的threaded.c示例:
#define THREAD_COUNT 20
static int counts[THREAD_COUNT];
static void *doit(void *a)
{
int rc, i, thread_id = (int)a;
pid_t pid = getpid();
FCGX_Request request;
char *server_name;
FCGX_InitRequest(&request, 0, 0);
for (;;)
{
static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
/* Some platforms require accept() serialization, some don't.. */
pthread_mutex_lock(&accept_mutex);
rc = FCGX_Accept_r(&request);
pthread_mutex_unlock(&accept_mutex);
if (rc < 0)
break;
server_name = FCGX_GetParam("SERVER_NAME", request.envp);
FCGX_FPrintF(request.out,…
…
FCGX_Finish_r(&request);
}
return NULL;
}
int main(void)
{
int i;
pthread_t …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来确认X-Sendfile是否正确处理由脚本(PHP)返回给Web服务器的请求.图像正在正确提供,但我想我会在curl请求中看到标题.
$ curl -I http://blog2.stageserver.net/wp-includes/ms-files.php?file=/2011/05/amos-lee-feature.jpg
HTTP/1.1 200 OK
Date: Wed, 04 Jan 2012 17:19:45 GMT
Server: Cherokee/1.2.100 (Arch Linux)
ETag: "4dd2e306=9da0"
Last-Modified: Tue, 17 May 2011 21:05:10 GMT
Content-Type: image/jpeg
Content-Length: 40352
X-Powered-By: PHP/5.3.8
Content-Disposition: inline; filename="amos-lee-feature.jpg"
Run Code Online (Sandbox Code Playgroud)
在FastCGI中使用PHP-FPM 5.3.8的Cherokee 1.2.100 :(
cherokee.conf: vserver!20!rule!500!handler!xsendfile = 1
由vServer> Behavior> Extensions设置php> Handler:允许X-Sendfile [check Enabled])
Wordpress网络/ WPMU 3.3.1:
define('WPMU_SENDFILE',true);在包含wp-config.php之前设置如下wp-settings.php.这将触发以下代码在WP的wp-includes/ms-files.php中执行:50为特定博客提供文件:
header( 'X-Sendfile: ' . $file );
exit;
Run Code Online (Sandbox Code Playgroud)
我已经确认上面的代码片段正在通过在exit();调用之前添加一个用于处置的附加标头来执行.Content-Disposition与curl结果一起出现,而不是最初在ms-files.php代码中.添加的代码是:
header('Content-Disposition: inline; filename="'.basename($file).'"');
我有: …
我在Debian上配置了nginx stable(1.4.4)+ PHP(使用FastCGI,php-fpm).这工作正常:
location ~* ^/~(.+?)(/.*\.php)$ {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
alias /home/$1/public_html$2;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_index index.php;
autoindex on;
}
Run Code Online (Sandbox Code Playgroud)
我使用PATH_INFO变量,因此我将以下行添加到fastcgi_params:
fastcgi_param PATH_INFO $fastcgi_path_info;
Run Code Online (Sandbox Code Playgroud)
在/etc/php5/fpm/php.ini中:
cgi.fix_pathinfo = 0
Run Code Online (Sandbox Code Playgroud)
我认为这应该有效,但是当我打印出所有服务器变量时,PATH_INFO始终为空:
array (
'USER' => 'www-data',
'HOME' => '/var/www',
'FCGI_ROLE' => 'RESPONDER',
'QUERY_STRING' => '',
'REQUEST_METHOD' => 'GET',
'CONTENT_TYPE' => '',
'CONTENT_LENGTH' => '',
'SCRIPT_FILENAME' => '/usr/share/nginx/html/srv_var.php',
'SCRIPT_NAME' => '/srv_var.php',
'PATH_INFO' => '',
'REQUEST_URI' => '/srv_var.php',
'DOCUMENT_URI' => '/srv_var.php',
'DOCUMENT_ROOT' => '/usr/share/nginx/html',
'SERVER_PROTOCOL' => 'HTTP/1.1',
'GATEWAY_INTERFACE' => 'CGI/1.1',
'SERVER_SOFTWARE' …Run Code Online (Sandbox Code Playgroud) 有人能用IIS设置Python吗?一直试图弄清楚,但它不起作用,这让我发疯.我看到很多例子,但我无法让它发挥作用.
Python + Flask网络应用程序的路径
C:\inetpub\wwwroot
Run Code Online (Sandbox Code Playgroud)
以下是我遵循的步骤:
在IIS管理器中,突出显示的Web服务器和FastCGI设置中添加了一个具有以下值的应用程序:
Full Path: C:\python35\python.exe
Arguments: C:\inetpub\wwwroot\wfastcgi.py
Environment Variable Collection:
PYTHONPATH: C:\inetpub\wwwroot\
WSGI_HANDLER: app.app
WSGI_LOG: C:\logs\app.txt
Run Code Online (Sandbox Code Playgroud)创建了一个名为MyWebSite的网站,指向C:\ inetpub\wwwroot
在网站的处理程序映射设置中,为FastCgiModule添加了一个模块映射:
Request path: *
Module: FastCgiModule
Executable: C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py
Name: FlaskHandler
Run Code Online (Sandbox Code Playgroud)使用Flask的简单Python应用程序在网络上找到并添加到Web根文件夹.所以在C:\ inetpub\wwww只有3个文件:app.py,web.config和wfastcgi.py
web.config中
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appSettings>
<add key="PYTHONPATH" value="" />
<add key="WSGI_HANDLER" value="app.app" />
<add key="WSGI_RESTART_FILE_REGEX" value="(?i).*\.(py|cnf|config)$" />
</appSettings>
<system.webServer>
<handlers>
<add name="FlaskHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
</handlers> …Run Code Online (Sandbox Code Playgroud) 请允许我声明我是FastCGI的新手.我的OS X机器上有MAMP的Apache.默认的PHP处理程序是Apache Handler 2.0(libphp5.so).我想改变FastCGI并遵循这里的答案:如何配置Apache在Ubuntu 12.04上通过终端运行PHP作为FastCGI?
我在httpd.conf的末尾添加了以下内容:
<IfModule mod_fastcgi.c>
AddHandler php5.fcgi .php
Action php5.fcgi /php5.fcgi
Alias /php5.fcgi /Applications/MAMP/fcgi-bin/php5.fcgi
FastCgiServer /Applications/MAMP/fcgi-bin/php5.fcgi -socket /Applications/MAMP/tmp/php-fcgi/php5-fpm.sock -pass-header Authorization -idle-timeout 3600
#FastCgiExternalServer /Applications/MAMP/fcgi-bin/php5.fcgi -socket /Applications/MAMP/tmp/php-fcgi/php5-fpm.sock -pass-header Authorization -idle-timeout 3600
<Directory /Applications/MAMP/fcgi-bin>
Order allow,deny
Allow from all
</Directory>
</IfModule>
Run Code Online (Sandbox Code Playgroud)
但是,正如您所看到的,FastCgiExternalServer已被注释掉.相反,我不得不使用FastCgiServer原因,否则Apache在尝试请求页面时会给我以下错误:
[星期五06月23日23:25:22] [错误] [客户端:: 1](2)没有这样的文件或目录:FastCGI:无法连接到服务器"/Applications/MAMP/fcgi-bin/php5.fcgi" : 连接失败
[星期五06月23日23:25:22 2016] [错误] [client :: 1] FastCGI:从服务器"/Applications/MAMP/fcgi-bin/php5.fcgi"收到的不完整标题(0字节)
但/Applications/MAMP/fcgi-bin/php5.fcgi存在且其内容是:
#!/bin/bash
PHP_CGI=/Applications/MAMP/bin/php/php5.6.2/bin/php-cgi
exec $PHP_CGI
Run Code Online (Sandbox Code Playgroud)
什么之间的区别FastCgiServer和FastCgiExternalServer,为什么FastCgiExternalServer在我的情况没有工作,但FastCgiServer …
在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脚本等.
主要的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这样的协议有什么好处?
我有一个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)