我正在将旧的 Apache 服务器转换为 Nginx,并且没有更改 URL 或重新排列文件系统的奢侈。
是否可以在 Nginx 配置中使用嵌套的 location{} 块来告诉它在正常提供静态内容的同时将别名目录中的 .php 文件提供给 fastcgi?
与我失败的类似配置:
server {
listen 80;
location / {
index index.html;
}
location /foosite/ {
alias /var/aliases/foo;
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
对 /foosite/static.jpg 的请求可以很好地提供服务,但是 nginx 在尝试将它们分派到 fastcgi 时似乎会混淆任何 .php 文件的路径。
我需要从 nginx提供一些 FCGI 脚本(通过WSAPI,但这无关紧要)。
目前我正在使用spawn_fcgi来做到这一点。这是我找到的唯一解决方案。
我需要知道我的其他选择。在nginx下有没有其他方式可以运行FastCGI?
我刚刚将我们的博客网络移至由 WPMU 提供支持的 ngnix(来自 apache)。一切都在顺利进行。
在我寻求将服务器优化到最大级别的过程中 - 我在 nginx 论坛http://forum.nginx.org/read.php?2,2649上遇到了这个线程
我真的很想知道:回答原来的问题......
例如,为防止在提供 6144 KB 文件时出现警告,三种方法中哪一种会产生最佳性能?
还有一件事:在我的 ngnix.config - 我的设置是:
fastcgi_buffers 64 4k;
即 256K 缓冲区大小(我在 32 位平台上)。这是否意味着如果我的 PHP 脚本生成的响应大于 256K,nginx 会抛出一些错误?
我知道 ngnix 论坛似乎是问这个问题的更好的地方,但由于没有哪个 ngnix 论坛比 serverfault 更活跃,我在这里发布这个问题。
我希望我能从这里的专家那里得到一些意见/指导。
谢谢,
-拉胡尔
我有一个 FastCGI (mod_fastcgi) 问题。它每隔一段时间就会发生一次,并且不会导致服务器完全崩溃,只会出现 500 个错误。这里有几件事。首先我使用 APC,所以 PHP 可以控制它自己的进程,而不是 FastCGI。另外,我将 webroot 设置为:
/var/www/html
Run Code Online (Sandbox Code Playgroud)
还有里面的 fcgi-bin:
/var/www/html/fcgi-bin
Run Code Online (Sandbox Code Playgroud)
首先是 apache error_log:
[Fri Jan 07 10:22:39 2011] [error] [client 50.16.222.82] (4)Interrupted system call: FastCGI: comm with server "/var/www/html/fcgi-bin/php.fcgi" aborted: select() failed, referer: http://www.domain.com/
Run Code Online (Sandbox Code Playgroud)
我还在“fcgi-pm”过程中运行了 strace。这是它爆炸时的跟踪片段:
21725 gettimeofday({1294420603, 14360}, NULL) = 0
21725 read(14, "C /var/www/html/fcgi-bin/php.fcgi - - 6503 38*", 16384) = 46
21725 alarm(131) = 0
21725 select(15, [14], NULL, NULL, NULL) = 1 (in [14])
21725 alarm(0) = 131
21725 gettimeofday({1294420603, 96595}, …Run Code Online (Sandbox Code Playgroud) 我对 nginx 很陌生,而且 - 更多用于学习目的 - 我试图配置 Nginx,以便为每个子域使用不同的用户运行 php。
例如,我想将用户john用于所有脚本foo.example.com,用户jack用于bar.example.com.
我已经在我的系统(ubuntu 服务器)上创建了用户,但我不知道如何指示 nginx 使用这些用户 - 我正在寻找一种可以轻松处理许多用户的解决方案,比如 ~2000。
查看文档,我不明白是否必须php5-cgi为每个用户(使用不同的端口)生成一个进程,然后将它们抓取到我的sites-available站点中(正如我所说的我是新手,但这在我看来就像服务器自杀),并且 nginx 配置中仅有的 2 页讨论了这个……是用中文写的(page1 , page2),很难用 google translate 翻译(但是,查看代码,使用的方式完全不同server-suicide)
有什么建议吗?
更新
galador 的回答可以完成这项工作,但我正在尝试构建一个不需要为每个新站点重新启动 nginx/fpm 的 dinamycal 环境(带有通配符子域),这可能吗?
当我今天对我的网站进行负载测试时(使用blitz.io);尽管有大量 RAM(超过 50%)和 CPU 能力(超过 70%)可用,但结果显示我的网站在每秒达到一定数量的并发用户时开始超时。
我的网站的 Nginx 错误日志 (/var/log/nginx/example.com.error.log) 显示如下内容:
2013/02/12 19:03:57 [错误] 13749#0: *3175 connect() 到 unix:/var/run/php5-fpm.sock 在连接到上游时失败(11:资源暂时不可用),客户端: 54.123.456.46,服务器:example.com,请求:“GET / HTTP/1.1”,上游:“fastcgi://unix:/var/run/php5-fpm.sock:”,主机:“example.com”
谷歌搜索错误让我找到了这个答案,它指出使用 TCP\IP 连接而不是 unix 套接字作为问题的解决方案;因为unix套接字的“高负载情况下的问题是众所周知的”。
因此,正如答案所建议的:
我在 /etc/php5/fpm/pool.d/www.conf 中替换listen = /var/run/php5-fpm.sock为listen 127.0.0.1:9000
由于我的发行版(Debian Wheezy)上没有/etc/nginx/php_location,所以我没有采取任何措施。
fastcgi_pass unix:/var/run/php5-fpm.sock;由于我在站点的 Nginx 配置文件中使用,即 /etc/nginx/sites-available/example.com,因此我将其替换为fastcgi_pass 127.0.0.1:9000;
现在的问题是,当我502 Bad Gateway访问我的网站时出现错误。是的,我做了reloadNginx 和 PHP-FPM。我究竟做错了什么?(这里完全是新手,尽我最大努力边做边学。)
如果这是相关的,当我这样做时sudo service php5-fpm restart,我会收到此错误:
[FAIL] Restarting PHP5 FastCGI Process Manager: php5-fpm failed!
Run Code Online (Sandbox Code Playgroud)
这只是在我做出上述更改后才发生的。我怎样才能解决这个问题? …
我有两个带有两个代码库的网站,但是当我更改一个代码库时,我会看到两者都发生了变化。
我有两个同一个网站的结帐。它们被设置为通过带有 FastCGI 的 Apache2 使用 PHP-FPM。结帐在:
/var/www/site1
/var/www/site2
Run Code Online (Sandbox Code Playgroud)
Apache 配置如下所示:
<VirtualHost *:80>
ServerName site1.myserver.com
DocumentRoot /var/www/site1
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi-handler .php
Action php5-fcgi-handler /php5-fcgi-uri
Alias /php5-fcgi-uri fcgi-application
FastCgiExternalServer fcgi-application -socket /var/run/site1-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
</IfModule>
</VirtualHost>
<VirtualHost *:80>
ServerName site2.myserver.com
DocumentRoot /var/www/site2
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi-handler .php
Action php5-fcgi-handler /php5-fcgi-uri
Alias /php5-fcgi-uri fcgi-application
FastCgiExternalServer fcgi-application -socket /var/run/site2-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
</IfModule>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
FPM 池配置如下所示:
[site1]
user = site1-user
group = site1-group
listen = /var/run/site1-fpm.sock
listen.owner …Run Code Online (Sandbox Code Playgroud) 在我的 http 指令中使用单个文档根目录时,一切正常。但是,我想添加一个带有附加指令的位置指令,但我无法让 fastcgi 与这个附加的根一起工作(访问http://localhost/sqlbuddy时我收到一个白页)。
这是我的 nginx.conf 的摘录:
server {
root /home/tman/dev/project/trunk/data;
index index.php;
location /sqlbuddy {
root /srv/http;
index index.php;
}
location ~* \.php {
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
}
}
Run Code Online (Sandbox Code Playgroud)
还有我的 fastcgi.conf:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param …Run Code Online (Sandbox Code Playgroud) 我使用以下指南在 Linode 的 Ubuntu 10.04 服务器上设置了 LEMP(Linux、Nginx、MySQL 和 PHP):http : //library.linode.com/lemp-guides/ubuntu-10.04-lucid
从本质上讲,我上传了我的PHP脚本到一个目录(/srv/www/mysite.com/public_html)中指定/etc/nginx/sites-available/mysite.com.conf。
在浏览器中访问该站点给我一个 500 内部服务器错误。我假设 PHP 代码有一些错误,这很好。但是,我完全不知道如何调试它,因为有几个组件:PHP、FastCGI 和 Nginx。
我的问题是,如何让这些错误显示在浏览器中,或者至少显示在日志中,以便我可以弄清楚发生了什么?我不确定是否需要告诉 Nginx 在某处记录错误,或者 FastCGI,或者编辑 php.ini。
我对服务器有完全的 root 访问权限来解决这个问题。但是,我不确定如何重新启动 PHP/FastCGI(虽然我知道如何重新启动 Nginx),因为我遵循的指南使用了某种守护进程。
非常感谢你能给我的任何帮助。
我尝试通过设置标头来禁用快速 CGI 缓冲X-Accel-Buffering: no,但在 Nginx 响应中没有看到此标头。是设计使然还是我的 Nginx 配置有问题?我没有fastcgi_ignore_headers指令。
fastcgi ×10
nginx ×8
php ×6
linux ×3
php-fpm ×2
500 ×1
apache-2.2 ×1
apache-2.4 ×1
cache ×1
httpd ×1
mod-fastcgi ×1
opcode ×1
optimization ×1
spawn-fcgi ×1
ubuntu ×1