最近我搞了一个项目,用nginx做反向代理,php处理业务逻辑。结果,从开始到结束,遇到了一堆坑,差点没把我这头发不多的程序员给折腾秃了。今天就来聊聊nginx和php这对“冤家”是怎么在我的项目里“斗法”的,顺便分享一些实用的代码和解决方案。
我得说nginx和php的配置真的是有点复杂。尤其是当你需要在nginx里处理php文件时,一不小心就会遇到404错误,或者php代码直接被当成普通文本输出了。这种情况,多半是因为nginx没有正确配置fastcgi_pass。我用的配置是这样的:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
这段配置告诉nginx,当遇到.php结尾的文件时,使用fastcgi来处理,并把请求转发给php-fpm。注意,这里的fastcgi_pass路径得根据你的实际安装路径来定,有时候升级了php版本,路径可能会变,别忘了改。
我遇到了一个让人崩溃的问题:某些php脚本执行得特别慢,有时候甚至超时。这通常是因为php-fpm的配置有问题,或者是因为某些资源没有正确释放。为了排查这个问题,我做了以下几步:
1. 增加php-fpm的进程数,调整pm.max_children和pm.start_servers的值。我的配置如下:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
2. 调大php.ini中的max_execution_time,默认是30秒,我改成了300秒。
max_execution_time = 300
3. 检查php脚本中的资源释放情况,特别是数据库连接和文件句柄,使用完毕后一定要关闭。
我遇到了一个关于nginx和php联合工作的性能问题。在并发量稍微上来一点的情况下,nginx就开始报错502 Bad Gateway。这个问题通常是因为php-fpm处理不过来请求,或者是nginx和php-fpm之间的连接出了问题。为了解决这个问题,我做了以下调整:
1. 增加php-fpm的max_children数量,让更多的php请求可以被同时处理。
2. 调整nginx的worker_processes和worker_connections,让nginx能处理更多的并发请求。我的配置如下:
worker_processes auto;
events {
worker_connections 1024;
}
3. 使用nginx的keepalive_timeout,减少频繁建立和关闭连接的开销。
keepalive_timeout 65;
我还遇到了一个关于权限的问题。nginx和php-fpm默认是以www-data用户运行的,如果你的项目文件权限设置不当,可能会导致无法写入或者读取某些文件。为了解决这个问题,我把项目目录的所属用户和组都改成了www-data。
sudo chown -R www-data:www-data /path/to/project
同时,确保umask设置正确,通常设置为022比较合适,这样新创建的文件和目录都具有正确的权限。
经过这一系列的折腾,我的项目终于稳定下来,nginx和php也愉快地一起工作了。整个过程虽然艰难,但也让我学到了不少。希望我的这些经验能对你们有所帮助。
nginx和php的配合虽然强大,但也充满陷阱。只有仔细配置,耐心调试,才能让这对“冤家”在项目中发挥最大的作用。当然,别忘了经常备份你的配置,否则一旦出错,可就追悔莫及了。