对于 nginx 的热爱,我无法解决这个问题。
期望:我想要两个简单的 php 项目(从长远来看是 wordpress)在一个服务器块下的两个子位置。旁注:这些项目位于使用 capistrano 部署的服务器上的两个不同目录中。
问题:我最终得到 404、403 或 index.php 的直接八位字节流下载。在后者上,我似乎找到了正确的 index.php,但它没有传递给 php-fpm 块。php-fpm 工作正常而不是问题(在其他没有子位置的服务器块中测试)
我已经浏览了整个网络,并尝试了数以百万计的“工作”配置,但它并没有融合在一起。
计划:下面你会看到一个工作的 nginx 虚拟主机,在正确的别名目录中点击正确的 index.html 文件。这样我就成功了一半。
在您的帮助下,我想调整下面的配置,将 index.php 更改index
为 index.php 并让 php 处理location /staging
和/production
.
在location /production
你看到一个配置(注释掉)我是如何尝试让 php 工作的。
server {
listen 82;
listen [::]:82;
server_name nginx-web.ch;
access_log /var/log/nginx/nginx-web_access.log;
error_log /var/log/nginx/nginx-web_error.log;
location /staging {
alias /var/www/nginx-web1/current;
index index.html
add_header X-debug-message "Location web1";
}
location /production {
alias /var/www/nginx-web/current;
index index.html
add_header X-debug-message "Location web";
#try_files $uri $uri/ /production/index.php;
#location ~ \.php$ {
# add_header X-debug-message "Location ~ php";
# try_files $uri =404;
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# fastcgi_pass unix:/var/run/php5-fpm.sock;
# fastcgi_index index.php;
# include fastcgi_params;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#}
}
}
这是一个工作服务器块,它试图适应子位置,但没有成功:(
server {
listen 80;
listen [::]:80;
server_name testdev;
access_log /var/log/nginx/wp_access.log;
error_log /var/log/nginx/wp_error.log;
root /var/www;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
使用 WORKING CONFIG 更新(必须 <3 serverfault/stackoverflow):
这是最终的工作配置,非常感谢@RichardSmith
server {
listen 82;
listen [::]:82;
server_name nginx-web.ch;
access_log /var/log/nginx/nginx-web_access.log;
error_log /var/log/nginx/nginx-web_error.log;
index index.php;
location ^~ /staging/ {
alias /var/www/nginx-web1/current/;
if (!-e $request_filename) { rewrite ^ /staging/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}
location /production {
alias /var/www/nginx-web/current;
if (!-e $request_filename) { rewrite ^ /production/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}
}
这种模式有效:
使用
^~
前缀以避免其他正则表达式location
块优先。请参阅此文档。location
和两者的值alias
都以 结尾/
或都不以 结尾/
。请参阅此文档。由于此问题,请避免一起使用and并查看
alias
有关使用.try_files
if
用作(因为它同时适用于和)
$request_filename
的计算值。SCRIPT_FILENAME
alias
root
始终
fastcgi_param
在包含fastcgi_params
文件后设置,以避免后者默默地覆盖本地值。