Nginx+PHP-FPM架构,结合PHP8.1搭建应用服务器时的一些总结和记录

最近在做一个项目,使用了PHP8.1语言版本,语言框架使用的是Yii2的最新版本,然后再搭建服务器环境和部署应用的过程中遇到了一些问题,现总结如下,给同样场景可能会遇到一些类似问题的你提供一些解决方案,既然已经踩过一遍坑了,方便大家,也方便后续回顾总结。
 
一、编译安装PHP8.1:
因为编译过程中基本上遇到问题的概率并不大,我的编译过程还算顺利,因为服务器上保留了以前其他人运行的项目。PHP的版本是7.2.3,所以就编译安装了PHP8.1到一个指定的地方,然后独立安装的PHP-FPM。尽量不影响以前的项目运行。
我的编译配置信息(注意要一行,不能存在换行符):
./configure --prefix=/usr/local/php8.1 --with-config-file-path=/usr/local/php8.1/etc --with-curl --with-freetype --enable-gd --with-jpeg --with-gettext --with-kerberos --with-libdir=lib64 --with-libxml --with-mysqli --with-openssl --with-pdo-mysql --with-pdo-sqlite --with-pear --enable-sockets --with-mhash --with-ldap-sasl --with-xsl --with-zlib -with-bz2 --with-iconv --enable-fpm --enable-pdo --enable-bcmath  --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-sysvsem --enable-cli --enable-opcache --enable-intl --enable-calendar --enable-static --enable-mysqlnd
最终我把编译好的php-fpm文件复制到了我的PHP8.1目录下,并完成了配置启动。这会儿还一切看似顺利。
 
编译过程中遇到了一个问题是:
configure: error: iconv does not support errno

 优先参考网上的解决方案安装缺失的iconv,如果不行,在运行configure之前先运行:
export LDFLAGS="$LDFLAGS -liconv"
参考官网bug讨论 https://bugs.php.net/bug.php?id=80585,在此对歪果友人诚挚的感谢。

二、部署应用:
搭建好之后,顺利启动PHP-FPM服务器,监听端口9000,然后再Nginx配置文件中,将请求信息直接给到9000端口来处理,这里就有一些“东西”要注意了,否则就遇到了下面的问题:
 
问题1:部署应用之后,请求失败,页面返回“File not Found”,然后查看Nginx的报错日志,显示信息是:
2022/12/08 13:15:51 [error] 31547#0: *29582 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 119.116.237.75, server: web.*.com, request: "GET /site/user-agreement HTTP/2.0", upstream: "fastcgi://127.0.0.1:9000", host: "web*.*com"
网上说中问题, 比如php-fpm的 运行group和user不对啦,应用目录权限不足啦,但我发现根本原因是在Nginx转发时,少了一个重要的配置信息。
由于我的yii2项目启用了 URLManage功能,为了让链接看起来更漂亮一些,所以需要在Nginx配置文件中加入下面的这个配置:
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}

所以,完整的转发配置应该是:
location / {
fastcgi_pass 127.0.0.1:9000;
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
所以这块,大家应该注意一下,更改完,重新启动Nginx服务之后,项目正常启动了!
 
问题二、页面图标显示异常:
由于使用了第三方图标工具,打开F12工具之后,发现是静态资源服务器访问字体文件时显示跨域:
Access to Font at “xxx” from origin “xxx” has been by CORS plicy:
No ‘Access-Control-Allow-Origin’header is present on the requested resource.
Origin “xxx” is therefore not allowed access.
这时候,只需要在静态资源服务器的Nginx配置文件中增加下面的配置项即可:
location ~* .(eot|ttf|woff|swoff2|svg|otf)$ {
add_header Access-Control-Allow-Origin [url]http://www.zkbhj.com;[/url] //只允许单域名或者 ‘*' 。不推荐 ‘*' ,会导致安全问题
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}

0 个评论

要回复文章请先登录注册