編輯:備查
我正在使用 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 版本,並且修改port
了php-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
透過連接埠處理9000
並php2
轉到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;
}
希望這對其他人有幫助:)