Nginx

Nginx & 多個 php-fpm 版本

  • September 2, 2022

我嘗試使用 Nginx 和 Ubuntu 20.04 為基於不同版本的 PHP 的多個站點提供服務)。所以我安裝了 php-fpm 版本 5.6 和 7.4 並像這樣配置 Nginx:

server {
 root /var/www;
 server_name xxxxxx.xxxxx.xxxxxx; # managed by Certbot
 index index.php;
 include snippets/fastcgi-php.conf;

 location / {
   try_files $uri $uri/ =404;
 }

 # PHP 5 locations
 location /site5 {
   fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
 }

 # PHP 7 locations
 location /site7 {
   fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
 }

 location ~ /\.ht {
   deny all;
 }

 listen [::]:443 ssl ipv6only=on; # managed by Certbot
 listen 443 ssl; # managed by Certbot
 ssl_certificate /etc/letsencrypt/live/xxxxxx.xxxxx.xxxxxx/fullchain.pem; # managed by Certbot
 ssl_certificate_key /etc/letsencrypt/live/xxxxxx.xxxxx.xxxxxx/privkey.pem; # managed by Certbot
 include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
 if ($host = xxxxxx.xxxxx.xxxxxx) {
   return 301 https://$host$request_uri;
 } # managed by Certbot
 listen 80 ;
 listen [::]:80 ;
 server_name xxxxxx.xxxxx.xxxxxx;
 return 404; # managed by Certbot
}

在 site5 和 site7 下執行 phpinfo() 的頁面執行良好,並告訴我每個站點的正確版本。

但我對靜態內容有疑問。

首先,引用的圖像返回 403。來自 Nginx 的錯誤日誌說:

"Access to the script '/var/www/site7/whatever.jpg' has been denied (see security.limit_extensions)"

將 的值更改security.limit_extensionsfalsein/etc/php/fpm/7.4/pool.d/www.conf後,圖像可以正確顯示。

但是現在,如果我直接通過其 URL 訪問圖像,它要麼作為文本返回(使用 Content-Type 文本/html),要麼我得到 404(即使文件在那裡)。

www-data 使用者是文件的所有者,權限為 755。

我從來沒有在 fpm 中使用過 PHP,所以我完全迷失了……所以我有兩個問題:

  • security.limit_extensions設置為有問題false嗎?
  • 我能做些什麼來確保文件,無論它們是什麼,都可以訪問?

非常感謝你的幫助。

您的配置將對所有資源的請求傳遞給 PHP,這不是您想要的。

如果您只有包含.php副檔名的 URL,則以下方法有效:

location ~ ^/site5.*\.php$ {
   fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
}

location ~ ^/site7.*\.php$ {
   fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

但是,如果您的應用程序實現了前端控制器模式,那麼您需要額外的設置:

location /site5 {
   try_files $uri $uri/ site5/index.php;
}

location /site7 {
   try_files $uri $uri/ site7/index.php;
}

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