![使用 Nginx 和 PHP-FPM 时出现 400 Bad Request 错误,为什么?](https://linux22.com/image/796118/%E4%BD%BF%E7%94%A8%20Nginx%20%E5%92%8C%20PHP-FPM%20%E6%97%B6%E5%87%BA%E7%8E%B0%20400%20Bad%20Request%20%E9%94%99%E8%AF%AF%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我正在尝试使用 nginx 1.2.4 和 PHP-FPM 5.3.3 在 Ubuntu 12.04.1 LTS 上运行一个网站(需要 PHP - 从技术上讲它目前不需要 MySQL,但随着我继续开发它,在不久的将来可能需要它,所以我继续安装了它)。据我所知,我没有做错任何事,但显然有些事情不太对劲 - 每当我尝试浏览我的网站时,我似乎都会收到 400 Bad Request 错误。我一直遵循一个指南,并且我或多或少地完成了它推荐的一切,除了没有将 PHP-FPM 设置为使用 Unix Socket,并且在启动/停止 nginx、PHP 和 MySQL 时使用了service
相反的操作。/etc/init.d/
无论如何,这里是我的相关配置文件(我只审查了个人/敏感详细信息,例如我的域名 - 其中包含我的真实姓名):
/etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
/etc/nginx/sites-enabled/subdomain.mydomain.net
server {
listen 80; # listen for IPv4
listen [::]:80; # listen for IPv6
server_name www.subdomain.mydomain.net subdomain.mydomain.net;
access_log /srv/www/subdomain.mydomain.net/logs/access.log;
error_log /srv/www/subdomain.mydomain.net/logs/error.log;
location / {
root /srv/www/subdomain.mydomain.net/public;
index index.php;
}
location ~ \.php$ {
try_files $uri =400;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/subdomain.mydomain.net/public$fastcgi_script_name;
}
}
上述配置文件中列出的所有目录在我的服务器上都是正确的(据我所知)。
由于它们太长,我没有在这篇文章中包含/etc/php5/fpm/pool.d/www.conf
它们,但我已将它们发布在 Pastebin 上:/etc/php5/fpm/php.ini
http://pastebin.com/ensErJD8和http://pastebin.com/T23dt7vM分别。但是,我在这两个文件中唯一更改的是 php.ini,我将它设置expose_php
为off
,以便.php
向用户隐藏文件扩展名。
我该怎么做才能解决我的问题?如果我需要提供任何其他详细信息,请告诉我。
答案1
这可能是打字错误:
try_files $uri =400;
几乎可以肯定的是:
try_files $uri =404;
答案2
我猜 TechZilla 已经声明了这一点,但你可以修改此行:
fastcgi_pass 127.0.0.1:9000;
是这样的。
fastcgi_pass unix:/var/run/php5-fpm.sock;
我假设因为你声明你安装了 PHP-FPM,所以使用 .sock 方法应该比通过 TCP 传递更好。
如果安装 PHP-FPM 的软件包也设置了必要的权限并正确配置,则可以通过 .sock 方法连接到 PHP-FPM。如果没有,您可能不得不通过 连接到 PHP-FPM 127.0.0.1:9000
。感谢 Paul 告知我这一点。
也有可能这一行:
include fastcgi_params;
可以改成这样:
include fastcgi.conf;
但是,别指望我。我不知道为什么这在我的 Ubuntu Server VM 上有效,但目前确实有效。