编辑:备查
我运行的是 Ubuntu 14.10,带有 LEMP 堆栈,使用 PHP 5.5.12。我有许多需要 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;
}
希望这对其他人有帮助:)