透過 nginx 實作 PHP 的多個版本

透過 nginx 實作 PHP 的多個版本

編輯:備查

我正在使用 PHP 5.5.12 運行帶有 LEMP 堆疊的 Ubuntu 14.10。我有許多需要 PHP 5.3.3 的舊版 WordPress 網站以及一些使用相當新版本的 PHP 的 WP 網站,所有網站都在 nginx 上運行在我的本機上

我的手被虛擬機器和沙箱束縛了,我能玩的只有nginx,所以這個問題。我理解人們的安全擔憂,但我需要這些網站在本地運行,以便在將它們更新到最新的 PHP / WP 版本時可以測試損壞的功能。

我想讓 nginx 根據 WordPress 網站運行正確版本的 PHP(使用 php-fpm)。根據其他SF 問題,實現此目的的一種方法是讓不同的 PHP 版本在單獨的連接埠/套接字上運行,並配置 nginx 伺服器區塊以使用相應的連接埠/套接字。

我已經手動編譯了 PHP 5.3.3 以包含 php-fpm,但這是我所能得到的最遠的。

實際上,我希望有人能更詳細地解釋一下回答。我不太清楚如何“在不同的連接埠(或套接字)上執行每個版本的 php-fpm”或者“在 nginx 伺服器區塊的 fastcgi_pass 參數中配置適當的連接埠”

我的一個伺服器區塊看起來像這樣供參考

server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite1;
    index index.php index.html index.htm;

    server_name local.testsite1.com;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    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.conf;
    }
}

編輯:

我在單獨的文件中使用單獨的伺服器區塊來設定每個站點,並在/var/nginx/sites-available/testsite1和之間連結符號/var/nginx/sites-enabled/testsite1。所以var/nginx/sites-available包含;

 testsite1
 testsite2
 testsite3
 ...

所以理想地我想知道下面的內容是否可能(因為這類似於如何使用不同的 PHP 版本設定 apache)

testsite1 - 運行舊版的 PHP

 server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite1;
    index index.php index.html index.htm;

    server_name local.testsite1.com;

    ...settings to use older PHP version...

    ...remaining nginx settings...
}

testsite2 - 運行目前版本的 PHP

 server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite2;
    index index.php index.html index.htm;

    server_name local.testsite2.com;

    ...settings to use currrent PHP version (if needed)...

    ...remaining nginx settings...
}

這可能嗎?我問的原因是我寧願避免將所有php文件重命名為php2以便運行(使版本控制變得痛苦)。我不介意編輯nginx.conf文件或採取任何步驟,只要我不必重命名文件即可。

我也相信(fastcgi_pass unix:/var/run/php5-fpm.sock;)由於 WordPress,我需要透過連接埠使用套接字(儘管我願意接受所有建議)。

答案1

好吧,你想透過 nginx 運行多個 PHP 版本,設定檔應該包含你將 PHP 腳本放置在不同版本或副檔名中的特定路徑。

但是,我想解釋一下您帖子中給出的 SF 問題連結。

該答案為您提供了一種修改conf您的 的方法nginx,其中假設提問者俱有 的背景nginx

透過在 中指定特定端口conf,nginx 將使腳本透過該 FastCGI 通道執行。

假設您在伺服器中安裝了不同的 PHP 版本,並且修改portphp-fpm.conf.

您希望所有php文件在版本中執行5.5.0並且php2文件在5.6.0.

nginx 的範例設定如下,

    listen       8080;
    server_name  localhost;

    root   html;

    location / {
        index  index.php index.php2;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  "${document_root}${fastcgi_script_name}";
        include        fastcgi_params;
    }

    location ~ \.php2$ {
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  "${document_root}${fastcgi_script_name}";
        include        fastcgi_params;
    }

在這種情況下,php透過連接埠處理9000php2轉到9001

這只是一個簡單的例子,對於高級的你可以創建兩個不同的文件夾來存儲 php 文件,例如/home/php55/home/php56,然後編輯你的nginx.conf.

對於您編輯的問題

如果你想嘗試加入不同的伺服器來處理不同版本的腳本,當然可以這樣做,因為nginx可以是一個負載平衡器,它也可以處理這個問題。

首次申請

server{
listen 80;
server_name php1.localhost; 

root   /home/www/php5.5;

location / {
  index  index.php;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9002; (You can change it to your private IP in the future)
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}
}

第二次申請

server{
listen 80;
server_name php2.localhost; 

root   /home/www/php5.6;

location / {
  index  index.php;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9004; (You can change it to your private IP in the future)
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}
}

透過上面的配置,你可以方便的切換不同版本的PHP腳本結果,而且,你可以使用NFS(如果你在*nix環境下)來掛載磁碟,這樣的話,你就不需要再放文件了手動分成兩個資料夾。

至於Fastcgi的傳遞方式,我建議使用PORT而不是Socket。

我們都知道Unix Socket具有更好的性能,因為即使在同一台機器上,TCP連接埠也使用整個網路堆疊。

然而,你節省的時間是很少的,而且,在高流量的時候使用Socket時你可能會遇到這個問題,

connect() 到 unix:/var/run/php5-fpm.sock 失敗或apr_socket_recv:連線被對等方重設(104)

此外,如果將 nginx 和 php-fpm 放在單獨的伺服器中,TCP 連接埠可以為您提供更快的管理方式。

我正在使用小型筆記型電腦來編輯這篇文章,所以程式碼不太漂亮,但我嘗試過...

編輯

請記住修改您的/etc/hosts主機名稱以符合您的主機名稱(server_name in nginx.conf

答案2

出於測試目的,我想將 nginx 配置為在同一伺服器部分的不同位置下使用不同的 php 版本。最後它與此一起工作:

#Folder to run some tests with the new php-7
location ~ "^\/test_php7.0.3\/.*\.php$" {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php7-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

#Folder to run some tests with a custom compiled version of php5.6
location ~ "^\/test_php5.6.18\/.*\.php$" {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php56-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

#The default php version:
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

希望這對其他人有幫助:)

相關內容