一、概述
php-fpm是一种通信方式,使得nginx可以通过cgi和php之间快速通信。nginx的提供了一份默认的php-fpm的配置:
1 2 3 4 5 6 7 |
#location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} |
fastcgi_pass
指定了和php-fpm通信的地址和端口,这段配置可能可以拿过来直接使用,但是也可能会报错:
1 |
[error] 20591#0: *14 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/usr/local/php/var/run/php-fpm.sock:", host: "127.0.0.1" |
这个情况下需要把配置中的:
1 |
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; |
修改成以下内容:
1 |
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; |
1.1 第一个php页面
在/webroot/html/php
目录下创建一个index.php
文件,里面的内容为:
1 2 3 |
<?php echo phpinfo(); ?> |
然后在nginx中增加一段配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
> cat conf/d2.dyxmq.cn.conf server { listen 80; server_name d2.dyxmq.cn; # 配置一个域名d2.dyxmq.cn location /php/ { # 访问目录 root /webroot/html/; # php的根目录 index index.php; # 索引文件 } location ~ \.php$ { root /webroot/html/; fastcgi_pass 127.0.0.1:9000; # php-fpm的地址,默认监听9000端口 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } access_log logs/php_access.log main; error_log logs/php_error.log; } > sudo service nginx reload # 更新nginx配置 |
在浏览器中打开https://d2.dyxmq.cn/php/
,将会显示如下信息:
二、修改fastcgi的监听方式为socket
nginx和php-fpm是通过本地的9000
端口来通信的,它们此时是基于tcp连接来的。在同一台机器上,tcp的握手会浪费很多的通信时间,可以考虑把它们的通信方式改成unix socket。
修改php-fpm的配置文件/usr/local/php/etc/php-fpm.d/www.conf
,查找listen:
1 2 3 4 |
# 注释掉本行 ; listen = 127.0.0.1:9000 # socket文件的目录,保证启动用户有权限访问到上级目录 listen = /usr/local/php/var/run/php-fpm.sock |
nginx配置中的fastcgi_pass也改成:
1 |
fastcgi_pass unix:/usr/local/php/var/run/php-fpm.sock; |
重新载入nginx并重启php-fpm(一定要重启php-fpm),在浏览器中打开页面应该也能和开始一样显示php相关信息。如果遇到错误:
1 |
[crit] 20721#0: *16 connect() to unix:/usr/local/php/var/run/php-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/usr/local/php/var/run/php-fpm.sock:", host: "127.0.0.1 |
说明是php-fpm的socket权限有问题,要修改php-fpm的配置文件中的socket用户,然后重启php-fpm即可:
1 2 |
listen.owner = www listen.group = www |
来自外部的引用: 1