我继承了一个django + fastcgi应用程序,需要对其进行修改以执行冗长的计算(最多半小时或更长时间).我想要做的是在后台运行计算并返回"你的工作已经开始" - 类型的响应.当进程正在运行时,对URL的进一步命中应返回"您的作业仍在运行",直到作业完成,此时应返回作业的结果.对url的任何后续命中都应该返回缓存的结果.
我是django的一个新手,并且在十年内没有做过任何重要的网络工作,所以我不知道是否有内置的方法来做我想要的.我已经尝试通过subprocess.Popen()启动该过程,并且它工作正常,除了它在进程表中留下一个已解除的条目.我需要一个干净的解决方案,一旦完成就可以删除临时文件和进程的任何痕迹.
我也尝试过fork()和线程,但还没有找到可行的解决方案.对于我来说似乎是一个非常常见的用例,是否有规范的解决方案?FWIW这只会在流量非常低的内部服务器上使用.
我正在使用fastcgi库创建一个应用程序,他们的打印方法有点冗长.我正在尝试用自己的方法包装他们的fprintf函数:
我想转
FCGX_FPrintF(out,char*fmt,...);
成
write(char*strFormat,...);
我找到了va_list的魔力但找不到将va_list值传递到fprintf函数的简单方法.有没有办法做到这一点?我知道vsprintf和vprintf存在,所以它必须比我想象的更难.
如果所有其他方法都失败了,我只会重载一个写函数
我对nginx和Perl FCGI模块有点问题.我在我的FCGI程序中有一个很长的操作,可能比我用来与FCGI通信的Unix套接字另一端的服务器(或服务器上的用户)一样.我需要程序中的FCGI accept()循环才能在FCGI请求关闭时中断.我尝试安装INT,TERM等信号处理程序,但它们什么都不做,因为nginx和我的程序之间的唯一通信发生在FCGI套接字AFAIK上.
我也尝试了这个但是我无法看到在Perl中使用FCGI模块通过FCGI套接字向nginx发送原始数据或从nginx发送原始数据.有没有办法可以在不修改FCGI模块的情况下进行"ping"功能?
基本问题是我的程序不知道nginx是否已终止FCGI请求.
例:
#!/usr/bin/perl -w
use strict;
use FCGI;
my $fcgi_socket = FCGI::OpenSocket( '/tmp/test.socket', 100000 );
my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $fcgi_socket);
REQUEST: while($request->Accept() >= 0) {
#begin handling request
my $result = '';
while (1) { #or select(), etc
if (somehow check whether the fcgi $request is still live) {
next REQUEST;
}
#check for results, set $result if done
}
print $result;
}
Run Code Online (Sandbox Code Playgroud) 每次我请求.php文件时,我都会收到500错误代码.
我尝试了许多不同的文件权限并搜索了整个互联网(或者至少,感觉就像这样),但我找不到任何有用的东西.(这不是一个容易找到suexec错误或类似的东西.但我想,这是权限的东西......可能我只是不知道/某一点......)
/var/log/apache2/error.log(LogLevel info)
[Tue Sep 11 12:47:21 2012] [info] Init: Seeding PRNG with 648 bytes of entropy
[Tue Sep 11 12:47:21 2012] [info] Init: Generating temporary RSA private keys (512/1024 bits)
[Tue Sep 11 12:47:21 2012] [info] Init: Generating temporary DH parameters (512/1024 bits)
[Tue Sep 11 12:47:21 2012] [info] Init: Initializing (virtual) servers for SSL
[Tue Sep 11 12:47:21 2012] [info] mod_ssl/2.2.16 compiled against Server: Apache/2.2.16, Library: OpenSSL/0.9.8o
[Tue Sep 11 12:47:21 2012] [notice] suEXEC mechanism enabled (wrapper: …Run Code Online (Sandbox Code Playgroud) 上传大约8MB或更大的文件时,我收到500内部服务器错误.
php.ini都是正确的maxAllowedContentLength 已在web.config中设置正如人们可以从中看出的那样maxAllowedContentLength,我运行的是IIS 7.5,使用FastCGI和PHP 5.3.17
我已经尝试了很多不同的东西来使这个工作,但根本找不到问题.
但是,我发现以下信息可能有助于找出问题的根源:
exit;在顶部写入以尝试获取空白屏幕,但这将被忽略并返回500错误.我认为问题在于configure commandPHP配置的部分,因为当我更改.php文件的处理程序映射以使用Plesk php-cgi.exe而不是通常的时,我没有得到500内部错误.话虽如此,我不能把它放在这个PHP版本上,因为它是Plesk自己的exe,还有其他配置问题.
我认为它可能与configure命令有关的原因仅仅是因为它与其中一个有很大不同phpinfo().
如果您有任何想法或建议,请发布.我已经尝试了所有知识,似乎无法解决这个问题.如果只是Linux ...
提前致谢
更新1
忘记添加,PHP错误日志中没有返回错误.至于IIS错误,我不知道在哪里看
更新2
这是我在我的web.config文件中放置的内容:
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483647" />
</requestFiltering>
</security>
Run Code Online (Sandbox Code Playgroud)
更新3
在您的帮助下,我们设法获得IIS显示的错误.这是我收到的:
PHP警告:POST Content-Length为12221448字节超过了第0行的Unknown中的8388608字节限制
这跟那个有关系post_max_size吗?
更新4
PHP设置如下(来自phpinfo()):
Run Code Online (Sandbox Code Playgroud)post_max_size = 64M memory_limit = 128M max_file_uploads = 20 max_execution_time = 6000 upload_max_filesize …
FastCGI不希望正确记录PHP错误.嗯,这并不完全正确:它记录错误很好,有点摆弄; 它只是不会记录任何其他内容,例如警告.
臭名昭着的FastCGI - > Nginx日志错误不一定是个问题.来自php-fpm的错误和警告直接进入Nginx - 但前提是它们没有被捕获.也就是说,如果set_error_handler成功拦截错误,则不会附加任何日志条目.这意味着我可以看到解析错误,但这就是它.
php-fpm本身并不记录PHP错误(与nginx分开),没有任何破解.php-fpm的实例配置文件默认包含以下两行:
php_admin_value[error_log] = /mnt/log/php-fpm/default.log
php_admin_flag[log_errors] = on
Run Code Online (Sandbox Code Playgroud)
我明显改变了error_log路径.我必须添加以下行以使其实际记录任何内容:
php_admin_value[error_reporting] = E_ALL & ~E_DEPRECATED & ~E_STRICT
Run Code Online (Sandbox Code Playgroud)
版本说明:E_STRICT部分是不必要的,因为我使用的是PHP 5.3.27,但我计划在某些时候升级到5.4.有了这一行,它就会记录错误 - 而且只记录错误 - /mnt/log/php-fpm/default.log.现在,这设置error_reporting为我在php.ini中设置的相同值,所以这里显然有些错误.此外,它不会记录捕获的错误:行为与nginx日志的行为相同.我尝试使用数值(22527)代替,但仍然没有运气.
我不关心条目最终在哪个日志文件中(nginx与php-fpm),但我确实需要在某处记录捕获的错误.我可以使用注入我自己的错误和异常处理程序,但这有点hackish,所以我宁愿避免这种情况.
我有一个nginx web服务器和CodeIgniter作为框架.
静态文件是正确的服务器(.js,.css和其他),但是具有查询参数使得nginx将请求传递给CodeIgniter.
所以www.example.com/js/file.js服务,但www.example.com/js/file.js?key=value去CodeIgniter并返回404.
即使查询参数被传递,我如何将nginx设置为服务器静态文件?
我一直在玩微软的Django tutoiral,它在我的Visual Studio 2015环境中使用Python 3.4.3运行良好.当我尝试通过我的网络服务器运行它时,它失败了:
Error occurred:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\wfastcgi.py", line 805, in main
result = handler(record.params, response.start)
File "C:\Python34\lib\site-packages\django\core\handlers\wsgi.py", line 158, in __call__
self.load_middleware()
File "C:\Python34\lib\site-packages\django\core\handlers\base.py", line 51, in load_middleware
mw_class = import_string(middleware_path)
File "C:\Python34\lib\site-packages\django\utils\module_loading.py", line 20, in import_string
module = import_module(module_path)
File "C:\Python34\lib\importlib\__init__.py", line 109, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
File "<frozen …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) 我最近使用Wix工具集开发了一个Web应用程序的安装程序(是的,带有安装程序的Web应用程序).
该向导将指导用户获取站点安装所需的所有基本信息,如下所示:
在安装结束时使用自定义操作,我使用文档动态配置IIS处理CGI ,将FastCGI配置为托管PHP,Python,应用程序.有很多步骤和开发来实现这个结果,但问题在于:
我安装了应用程序,一切正常,但是,如果我卸载或安装另一个实例或其他WebApplication,IIS配置的处理程序就像全局一样,并始终指向第一个安装.(卸载应用程序时出现问题)位于C:\ Windows\System32\inetsrv\config中的applicationHost.config是IIS的配置,其"config"类似于global.
<handlers accessPolicy="Read, Script">
<add name="PHP-FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="E:\CIM_dev\bin\php-v5.6\php-cgi.exe" resourceType="Either" />
<add name="CGI-exe_2" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
<add name="TRACEVerbHandler2" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
<add name="OPTIONSVerbHandler2" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" />
<add name="StaticFile2" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法为web.config中的每个网站进行此配置?我一直在努力尝试所有的东西而没有成功.