我試圖設置一個nginx環境,其中遺留代碼和新的MVC風格的代碼可以共存,這樣我就可以逐頁地逐頁重構它。遺留代碼需要PHP的舊版本(它在5.3版本上運行得最好,但我編譯時遇到了問題,所以我使用了5.4並修復了任何可能會中斷的內容),但它很容易通過URL區分,因爲它具有文字文件名如http://sub.domain.com/search.php?category=4
等,而不是像http://sub.domain.com/search/category/4
這樣的新款式 - 主要區別在於.php
的存在。兩個版本的PHP的Nginx配置
新的代碼運行正常,在nginx的配置如下:
server {
listen 80;
server_name *.myproject.dev;
root /var/www/myproject/public;
index index.php index.html index.htm;
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
location ~ ^(.+\.php)(/.*)?$ {
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
}
}
(我承認我不完全理解所有的代碼 - 它從各種指南和這樣來了。)
在this great tutorial的幫助下,我在它自己的位置上編譯並安裝了PHP 5.4,它監聽端口9001.它對舊代碼使用單獨的域可以很好地工作,但我想要做的是使用單個域,但是調用舊如果在URL中找到.php
,則在代碼中進行必要的重寫並使用新代碼。我發現this post on ServerFault並試圖結合其思想在我的情況是這樣的:
server {
listen 80;
server_name *.myproject.dev;
root /var/www/myproject/public;
index index.php index.html index.htm;
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
location ~ ^(.+\.php)(/.*)?$ {
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
# Anything with ".php" is directed to the old codebase
location ~* \.php {
root /var/www/myproject/oldcode;
fastcgi_pass 127.0.0.1:9001;
}
}
}
但重寫增加index.php
到新的代碼,所以到了最後,一切.php
測試,這是不是意圖相匹配。我試着在文件的最後四行中添加了幾個變體,但這並沒有幫助(無論是空白頁面還是僅去舊代碼位置,具體取決於細節)。是否有人對nginx配置語法有足夠的瞭解以幫助我重新排列它,以便它能做到我想要的?
唉!我現在有一個更大的問題。在嘗試其他任何事情之前,我必須重新啓動虛擬機(自安裝PHP 5.4以來第一次),現在我的主PHP(使用套接字的那個)不再工作了! Nginx只是提供源文件作爲下載。它在一年中運行良好,顯然我在安裝5.4版本時遇到了與原始啓動過程混淆的問題。由於我不太瞭解套接字,我嘗試將其更改爲TCP端口9000,但這沒有幫助。獲得OT和sysadmin-ish - 我應該在Serverfault上發佈嗎? – OsakaWebbie
@OsakaWebbie這聽起來像一個服務器故障主題。在同一個虛擬機上運行兩個版本的PHP當然是冒險的。也許解決方案是兩個虛擬機。 –
這個想法是單個域,因爲我想在繼續運行遺留代碼的同時逐漸開發新代碼,並且內部鏈接需要是相對的(無域名)才能實現可移植性。兩人在同一臺服務器上愉快地跑步,直到我重新啓動,所以我認爲這是有希望的。在上個星期,關於nginx的問題比在Serverfault上的問題多3倍,所以我先在這裏試了一下,但問題現在轉變得離編程越來越遠...... – OsakaWebbie