nginx 多個(現在是兩個)php 項目通過 php-fpm 在子目錄中使用別名
對於 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
文件後設置,以避免後者默默地覆蓋本地值。