我正在构建一个环境(在 ubuntu 10.04.02 机器上)来处理具有许多(应该支持至少 1000 个)子域的网站,每个子域由不同的 FPM 池提供服务,并具有不同的用户。
所以没有什么新鲜事;我的问题是创建(并启动)一个新的 fpm 池,而不必重新加载/重新启动 FPM,这会导致(我知道,非常快)停机。
我写了一个 python 守护进程,在需要时:
我四处搜索,但没有找到使用一个池调用 fpm 的方法,这可能是一个“临时”解决方案:主 fpm 实例运行所有池,每个新实例都有自己的 fpm 实例,然后使用 cron 我停止并每周/每月/不知道重新加载 fpm
如果确实重要,服务器在 nginx 上运行,配置为使用 unix socket to fcgi,这是我的 nginx 测试配置:
server{
listen 80;
server_name ~^(?<domain>.+)\.test\.local$; # foo.test.local > myapp_foo
root /var/www/myapp/subdomains/myapp_$domain/htdocs;
location / {
index index.php;
}
location ~* \.(gif|jpg|png|ico)$ {
expires 30d;
}
location ~ \.php$ {
fastcgi_pass unix:/var/web-sock/myapp_$domain-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
} …Run Code Online (Sandbox Code Playgroud) 一个bsic web server比如pythonSimpleHTTPServer或者THTTPD用最少的进程读取静态文件;因此相当快。通常,添加更多功能以创建高级 Web 服务器(但仍然是轻量级的,例如nginx)会减慢此过程。
先进的网络服务器可以玩一个技巧来加快进程吗?或者比最简单的更简单是不可能的,最简单的是读取静态文件的最快方法?我的意思是nginx(或其他声称快速的轻量级 Web 服务器)可以比THTTPD(或其他具有最少流程的基本 Web 服务器)更快吗?
那么 CGI 脚本呢,因为HTTPD和 pythonCGIHTTPServer可以简单地执行 cgi 脚本。
在许多语言中,您从头开始构建 Web 框架(即从 unix 套接字)并在抽象层上构建。如果我想用 OCaml 或 C 从头开始构建一个 web 框架,我首先构建一个侦听端口 80 的套接字服务器。
我突然想到 PHP - 就像任何其他高级语言一样 - 可能会以某种方式包装 unix 套接字。现在我知道情况是这样的,PHP 从来就不是这样设计的。但是,我不明白为什么它从未以这种方式使用过。按照同样的思路,PHP 解释器从未像 Python 解释器那样以这种方式使用。
例如,当我从头开始构建 Python Web 服务器并部署它时,我执行以下操作:在某个端口(比如 8000)上添加一个 unix 套接字,像 一样守护我的脚本python server.py 8000,并在端口 80 上设置 nginx 反向代理并转发到我的端口 8000 上的内部本地服务器。我从未见过用 PHP 完成的,即使它是可能的。
我承认,除了使用独立的解释器(即 Tornado、uwsgi 等)之外,您在 Python 中还有其他选择。然而,它是双向的。
我的问题是,PHP 语言、解释器或社区的哪些方面阻止了 PHP Web 框架从 unix 套接字调用从头开始构建、在本地端口上进行守护进程以及被反向代理而不是使用 cgi/ fastcgi 包装器?
所以基本上,我完全按照有关 iptraf 监控和 rrdtool 的指南进行操作。我/usr/lib/cgi-bin/像往常一样将它放入cgi 脚本中。然后,当我从浏览器访问它时,它制作的图像似乎已损坏。出于调试目的,我暂时将权限设置为 777。我认为 Apache2 正在尝试将 png 文件作为脚本执行。我该如何防止?下面是我的配置文件。提前致谢!
哦。我以 root 身份运行。
#tail /var/log/apache2/error.log
[Sun Mar 01 06:13:05 2015] [error] [client 192.168.0.241] Premature end of script headers: tcp_services-25-6hr.png, referer: http://192.168.0.1/cgi-bin/tcp.cgi
[Sun Mar 01 06:13:05 2015] [error] [client 192.168.0.241] Premature end of script headers: tcp_services-80-6hr.png, referer: http://192.168.0.1/cgi-bin/tcp.cgi
[Sun Mar 01 06:13:05 2015] [error] [client 192.168.0.241] Premature end of script headers: tcp_services-22-6hr.png, referer: http://192.168.0.1/cgi-bin/tcp.cgi
[Sun Mar 01 06:13:49 2015] [error] [client 192.168.0.241] (8)Exec format error: exec …Run Code Online (Sandbox Code Playgroud) php-cgi 似乎在 PHP 5.3.1 中消失了。我已经尝试了 ./configure 的 --enable-cgi 和 --disable-cli 标志,但它没有在 sapi/cgi 子目录下创建二进制文件。
我有 Ubuntu Server 正在运行,我正在设置一个单独的目录作为 cgi-bin。我已准备好目录并更改了站点的文件。但是,为了让它工作,我需要更改我在文件夹中的 Python 脚本的权限,以便 Apache 可以执行它。但是,我不想给除 root、我和 Apache 之外的任何人写或执行访问权限。我假设这是可能的,但是怎么做呢?
这是坐在我网站的 cgi-bin 中。我应该担心吗?
#!/usr/bin/perl
print <<HTML;
Content-type: text/html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html">
<link rel="stylesheet" type="text/css" href="../../css/style.css">
</head>
<body>
<table cellspacing="0" cellpadding="0" border="0">
<tr class="subhead" align="Left"><th>Name</th><th>Value</th></tr>
HTML
my $class;
foreach (sort keys %ENV) {
next unless /^HTTP_|^REQUEST_/;
$class = ($class ne 'normal')? 'normal': 'alt';
print <<HTML;
<tr class="$class"><td valign="top">$_</td><td>$ENV{$_}</td></tr>
HTML
}
print <<HTML;
</table>
</body>
</html>
HTML
Run Code Online (Sandbox Code Playgroud) 这是服务器块中配置的一部分:
我无法执行任何 php 脚本,我test.php在 /var/html 下放置了一个名为的文件,但是当我指向 时http://localhost/test.php,我得到了一个结果:
File not found.,
这不是由 nginx 生成的,因为它与 nginx 的 404 页面不同。
location / {
root /var/html;
index index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_intercept_errors on;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我在 Ubuntu 服务器 14.04 上全新安装的 Apache 2.4 上安装了 CGI 脚本。如果对我来说配置文件没问题,Apache也会继续回复403 Forbidden。CGI 是 Monitorix 前端,一个用 Perl 编写的系统监控工具。
配置文件/etc/apache2/conf-enabled/monitorix.conf是:
Alias /monitorix /var/lib/monitorix/www
ScriptAlias /monitorix-cgi /var/lib/monitorix/www/cgi
<Directory /var/lib/monitorix/www/cgi/>
DirectoryIndex monitorix.cgi
Options ExecCGI
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order deny,allow
Allow from all
</IfModule>
</Directory>
Run Code Online (Sandbox Code Playgroud)
在所有文件/var/lib/monitorix/www和/var/lib/monitorix/www/cgi对所有至少读取权限。每次我尝试从 URL 访问时/monitorix,在我的 Apache 日志中我都会看到以下几行:
[Mon Sep 01 06:57:52.995680 2014] [authz_core:error] [pid 17145] [client x.x.x.x:58879] AH01630: client …Run Code Online (Sandbox Code Playgroud) cgi ×9
nginx ×3
apache-2.2 ×2
fastcgi ×2
perl ×2
php ×2
php5 ×2
apache-2.4 ×1
cgi-bin ×1
debian ×1
linux ×1
mod-auth ×1
permissions ×1
php-fpm ×1
scripting ×1
security ×1
thttpd ×1
ubuntu ×1
web-server ×1