![nginx 通过 php-fpm 在子目录中使用别名管理多个(目前为两个)php 项目](https://linux22.com/image/713935/nginx%20%E9%80%9A%E8%BF%87%20php-fpm%20%E5%9C%A8%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%88%AB%E5%90%8D%E7%AE%A1%E7%90%86%E5%A4%9A%E4%B8%AA%EF%BC%88%E7%9B%AE%E5%89%8D%E4%B8%BA%E4%B8%A4%E4%B8%AA%EF%BC%89php%20%E9%A1%B9%E7%9B%AE.png)
出于对 nginx 的热爱,我无法理解这个问题。
期望:我想要两个简单的 php 项目(长期来看是 wordpress),它们位于一个服务器块下的两个子位置。附注:这些项目位于使用 capistrano 部署的服务器上的两个不同目录中。
问题:我要么得到 404、403 或直接以八位字节流下载 index.php。在后者中,我似乎找到了正确的 index.php,但它没有传递到 php-fpm 块。php-fpm 正在运行,不是问题所在(已在其他没有子位置的服务器块中测试)
我搜索了整个网络并尝试了无数个“有效”的配置,但都没有成功。
计划:下面你会看到一个正常工作的 nginx vhost,它在正确的别名目录中命中了正确的 index.html 文件。这样我就完成了一半。
在您的帮助下,我想调整下面的配置,将更改为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;
}
}
使用工作配置进行更新(必须<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;
}
}
}
答案1
这种模式有效:
location ^~ /prefix/ {
alias /path/to/root/;
if (!-e $request_filename) { rewrite ^ /prefix/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass ...;
}
}
使用^~
前缀可避免其他正则表达式location
块优先。请参阅这个文件。
的值location
和alias
都以...结尾/
或都不以...结尾/
。请参阅这个文件。
避免同时使用alias
,try_files
因为这个问题看看这种警告关于 的使用if
。
用作$request_filename
的计算值SCRIPT_FILENAME
(因为它适用于和alias
)root
。
始终设置fastcgi_param
后包括该fastcgi_params
文件,以避免后者默默覆盖本地值。