我可以编写可以在Windows(IIS Web服务器)和Linux(Apache或lighttpd)上托管的Web应用程序而无需进行任何更改吗?
CGI?也许是新事物?WSGI | FastCGI?
我无法让基本的 HTTP 身份验证在安装并作为 FCGI 工作的 PHP 中工作。但是,当 PHP 作为模块安装时,它可以完美运行。
有什么办法可以让它工作吗???
我在 ubuntu 中运行 PHP 5.2.6 版。
<?Php
if ( !$_SERVER['PHP_AUTH_USER'] ) {
$this->getResponse()->setHeader('WWW-Authenticate', 'Basic realm="Testing"');
$this->getResponse()->setBody('Unauthorized');
$this->getResponse()->setHttpResponseCode(401);
} else {
var_dump($_SERVER['PHP_AUTH_USER']);
var_dump($_SERVER['PHP_AUTH_PW']);
}
Run Code Online (Sandbox Code Playgroud)
我确实尝试过
[Rewrite rule on .htaccess]
RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
[user:pass on PHP-script]
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER['REDIRECT_REMOTE_USER'], 6)));
Run Code Online (Sandbox Code Playgroud)
但它似乎没有工作。
以前我使用IIS服务器作为PHP服务器.目前,它是apache.
在IIS上,我可以访问$_SERVER ['REMOTE_USER']返回用户名和域的变量(例如domain\user),但在安装XAMPP后,此变量不可用.
我该怎么办才能让这个变量再次出现?
我的应用程序位于本地网络上,没有互联网连接
使用Perl进行Web应用程序开发有很多选项,例如
我已经在基本的Perl中完成了大约一年的编程,为一些自动化等构建了后端脚本.
有了各种各样的东西,什么是应用程序开发的框架/模块/方法的真正良好组合.
我正在尝试创建用 C 编写的简单 FastCGI 应用程序:
#include <fcgiapp.h>
#include <stdio.h>
int main()
{
int sockfd = FCGX_OpenSocket("127.0.0.1:9000", 1024);
FCGX_Request request;
FCGX_Init();
FCGX_InitRequest(&request, sockfd, 0);
while (FCGX_Accept_r(&request) == 0)
{
printf("Accepted\n");
FCGX_FPrintF(request.out, "Content-type: text/html\r\n\r\n<h1>Hello World!</h1>");
FCGX_Finish_r(&request);
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常 - 当我从浏览器调用它时,它会显示带有“Hello World!”的页面。信息。
问题是“while”中的代码工作两次,即我在终端中看到以下输出:
[root@localhost example]$ ./hello
Accepted
Accepted
Run Code Online (Sandbox Code Playgroud)
为什么每个请求都会打印“Accepted”两次?如果我把真正的代码放在这里,例如查询一个数据库,它也会被执行两次。
这应该是我关于 FastCGI 和 NGINX 的最后一个问题(我已经问了太多了),但是我有一个关于在 Web 服务器上运行 C FastCGI 脚本的问题,特别是 NGINX。现在我的 nginx.conf 文件是这样的:
user nobody nobody;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
location / {
root /nginx/html;
index index.html index.htm new.html;
autoindex on;
fastcgi_pass 127.0.0.1:8000;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个简单的 C FastCGI 脚本,可以打印出 Hello World。我知道为了运行这个脚本,我首先必须编译 C 脚本,这将生成一个二进制文件。然后我使用spawn-fcgi -p 8000 -n <binary>or执行这个二进制文件cgi-fcgi -start -connect localhost:8000 ./<binary>。我已经成功地做到了这一点并显示了正确的结果。然而,当我这样做时,CGI 脚本是 Web 服务器上唯一显示的内容。我无法访问任何 .html 页面或任何其他页面。即使我输入随机扩展名(这会导致 404 Page not Found 错误),也会显示 CGI 脚本。基本上我试图让index.html成为主页,然后当用户单击按钮时,用户将被带到一个显示C CGI脚本的新页面。
这可能吗?如果是这样,我该怎么办?我花了几个小时试图在网上寻找解决方案,但没有成功。如果问题太模糊/不清楚或者您需要更多信息,请告诉我!谢谢你!
我在 nginx.conf 中有这个位置部分:
location ~ \.php {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_VALUE "memory_limit = 500M; post_max_size = 400M; upload_max_filesize = 300M";
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
}
Run Code Online (Sandbox Code Playgroud)
我需要增加这些参数以进行文件下载,但phpinfo()尽管更新了 $_SERVER['PHP_VALUE'] (包含我在配置中写入的值),但 -list 中仍然存在 php.ini 的先前值。我尝试以不同的方式更改值:不使用分号,使用\n,混合之前的两种变体,替换PHP_VALUE为PHP_ADMIN_VALUE,从其他人的配置中复制参数;但仍然不成功。问题出在哪里?什么阻碍了我的参数的应用?
我正在建立一个使用 nginx 的开发环境,并使用 fastcgi 将请求转发到命令行 php 服务器。当我直接向 php 服务器发送请求时,它会正确处理它们。nginx 服务器可以正确处理非 php 文件的请求。但是,当我通过 nginx 发送 php 请求时,php 服务器被命中,但返回“无效请求(格式错误的 HTTP 请求)”。
很抱歉附上我的所有配置文件,但我不确定从哪里开始。所有文件都位于$PROJECT_PATH/dev-config/.
这是我的 nginx 配置的相关部分。
http {
...
server {
root .;
listen 8123;
server_name localhost;
location / {
index index.php;
}
location ~ \.php$ {
try_files $fastcgi_script_name =404;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass 127.0.0.1:9123;
fastcgi_index index.php;
include fastcgi_params; # this file is the default
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是运行以(重新)启动 nginx 和 php 的脚本:
#!/bin/bash
PROJECT_PATH="$(dirname $0)/../"
nginx -s stop || true …Run Code Online (Sandbox Code Playgroud) 我有一个接受大文件(最大 500Mb)的 API。直到最近它还在发挥作用。现在我不断收到一个Error 500.0 - Internal Server Error. 警告消息指出C:\inetpub\Scripts\python.exe - The FastCGI process exceeded configured request timeout。大约 10 分钟后会出现此情况。
以前,CGI 和 IIS 的超时设置为大约 20 分钟,但自从我收到此错误消息后,我荒谬地提高了超时,大约 10 分钟后它仍然发生。
在 IIS 的 CGI 下,我将超时设置为 1 小时 30 分。
在 IIS 的 web.config 中,我有:
<system.web>
<httpRuntime executionTimeout="12250" maxRequestLength="500000" />
<customErrors mode="Off" />
</system.web>
Run Code Online (Sandbox Code Playgroud) 我是 Perl 的初学者。
我的理解如下。
看起来很好。然而,在我使用 Golang、Nginx 等进行现代开发的经验中,我从未见过 FCGI。
现代 Web 应用程序不再需要 FCGI 了吗?
FCGI的缺点是什么,FCGI的优点是什么?