我正在尝试将一些网站从运行 Apache 和 mod_php 的旧服务器迁移到使用 PHP-FPM 的 Nginx 和 PHP 7 的新服务器。两个站点都在域的根目录中运行 PHP 购物车,并在子文件夹 /news 中运行 wordpress 博客。目前,在旧服务器上,word press 博客位于 Web 根目录中名为 news 的文件夹中(因此与购物车文件混合在一起),在新服务器上,我想将它们拆分出来,以便每个应用程序都位于自己的单独文件夹中,以便:
/home/www/sitename/cart/htdocs 中的文件可从以下位置获取https://www.site.tld/
和
/home/www/sitename/wordpress/htdocs 中的文件可从以下位置获取https://www.site.tld/news/
我还希望能够使用不同的 PHP-FPM 池来确保安全,如果需要的话,允许我使用 PHP 5 池运行任一应用程序,直到它可以更新为在 PHP 7 上运行。
我已经接近了,但它一直尝试从 /home/www/sitename/wordpress/htdocs//news/test.php 而不是 /home/www/manicpanic/wordpress/htdocs/test.php 加载 /news/test.php。
配置:
server {
listen iphere:443 ssl http2;
#ssl conf
root /home/www/sitename/cart/htdocs;
server_name site.tld www.site.tld;
rewrite ^(.*)\.v[\d]+\.(css|js|png)$ $1.$2;
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
}
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /news {
alias /home/www/sitename/wordpress/htdocs;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.0-fpm-wordpress.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param APPLICATION_ENV production;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param PHP_VALUE default_charset=ISO-8859-1;
}
}
location ~ [^/]\.php(/|$) {
fastcgi_pass unix:/run/php/php7.0-fpm-cart.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param APPLICATION_ENV production;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param PHP_VALUE default_charset=ISO-8859-1;
}
}
答案1
正则表达式location ~ [^/]\.php(/|$)
将优先于前缀location /news
,除非使用^~
修饰符。请参阅这个文件了解更多信息。
location ^~ /news {
alias /home/www/sitename/wordpress/htdocs;
location ~ \.php$ {
...
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
...
}
}
另外,您不能将$document_root$fastcgi_script_name
其与 结合使用,alias
因为它会创建错误的路径名。请改用$request_filename
。
总是include fastcgi_params;
前使用特定fastcgi_param
指令,否则特定设置可能会被悄悄覆盖。
答案2
有一个非常好的教程(尽管你可能可以跳过设置不同的端口): https://pehapkari.cz/blog/2017/03/27/multiple-php-versions-the-easy-way/
70菲律宾比索
server {
listen 8870 default_server;
listen [::]:8870 default_server;
server_name _;
root /var/www/site-with-php7.0;
index index.php;
location / {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock; # adjust for the listen setting discussed above
}
}
PHP56
server {
listen 8856 default_server;
listen [::]:8856 default_server;
server_name _;
root /var/www/site-with-php5.6;
index index.php;
location / {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php5.6-fpm.sock; # adjust for the listen setting discussed above
}
}