Nginx

nginx 多個(現在是兩個)php 項目通過 php-fpm 在子目錄中使用別名

  • November 24, 2017

對於 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 ^~ /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都以 結尾/或都不以 結尾/。請參閱此文件

由於此問題,請避免一起使用and並查看alias有關使用.try_files``if

用作(因為它同時適用於和)$request_filename的計算值。SCRIPT_FILENAME``alias``root

始終fastcgi_param 包含fastcgi_params文件後設置,以避免後者默默地覆蓋本地值。

引用自:https://serverfault.com/questions/884981