配置 php7 + Nginx

PHP7

之前为了配合完成一个项目(PHP 版本为5.6),在本机搭建了 PHP56 的环境,后面自己系统升级为 macOS High Sierra,发现系统自带的 PHP 版本已经是 7.1 了,于是就开始使用系统自带的 PHP 版本了。

1
php -v

显示 PHP 版本信息,如下:

1
2
3
PHP 7.1.16 (cli) (built: Apr 1 2018 13:14:42) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

系统自带的 PHP7.1 没有默认的 php.ini 文件,执行下面命令查找一下:

1
php -r "echo php_ini_loaded_file();"

此时并没有打印对应的配置文件信息。需要我们手动去复制一份:

1
sudo cp /private/etc/php.ini.default /private/etc/php.ini

再次执行上面命令,即可看到配置文件的绝对路径了。或者执行 php --ini

1
2
3
4
5
6
php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)

这里有个问题需要注意,php.ini 文件复制成功后,需要下面两步操作,否则在 php 代码发生致命错误的时候,页面不会输出任何内容,只是报 HTTP ERROR 500 的错误。

第一步,修改 php.ini 文件的权限,否则无法编辑保存,默认是只读属性。

1
sudo chmod 777 /private/etc/php.ini

第二步,编辑 php.ini 文件,将 display_errors = Off 改为下面 on 即可。

1
display_errors = On

记得每次修改完配置文件,需要重启 php-fpmnginx 服务。

PHP56

1. 安装 PHP56

可以参考下面两篇文章。

2. 卸载(删除)PHP56

执行 brew uninstall

1
brew uninstall php

即可完成卸载。

如果卸载遇到问题,就打开 /usr/local/Cellar/ 目录,删除对应的 PHP 目录即可。

配置 php-fpm

现在新版本的 PHP 其内核已经集成了 php-fpm,我们不需要另外安装了。

配置 php-fpm 配置文件

1
sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf

修改配置文件

1
sudo vi /private/etc/php-fpm.conf

找到 error_log 项,添加下面两个配置项,如下:

1
2
error_log = /usr/local/var/log/php-fpm.log
pid = /usr/local/var/run/php-fpm.pid

如果不配置上面的配置项,启动 php-fpm 会报错:

1
2
3
ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2)
ERROR: failed to post process the configuration
ERROR: FPM initialization failed

接下来, 继续配置,将 www.conf.default 复制一份命名为 www.conf 即可。

1
2
3
cd /private/etc/php-fpm.d/
sudo cp www.conf.default www.conf

不配置上面的,会报如下错误:

1
2
ERROR: No pool defined. at least one pool section must be specified in config file
ERROR: FPM initialization failed

至此,可以启动 php-fpm 了,执行下面命令:

1
sudo php-fpm -D

不出意外的话,已经成功启动,可以使用下面命令查看端口使用情况

1
netstat -an | grep 9000

如果你在启动 php-fpm 遇到下面的错误:

1
2
ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (48)
ERROR: FPM initialization failed

有两种方式解决这个问题

1.修改 php-fpm 使用的端口号

1
sudo vim /private/etc/php-fpm.d/www.conf

listen = 127.0.0.1:9000 改为 listen = 127.0.0.1:9001 即可。

2.杀掉9000端口占用的进程

关闭所有之前启动的 php-fpm

1
killall php-fpm

找到占用端口的进程号

1
netstat -an | grep 9000

然后 kill -9 pid,重新启动 php-fpm 即可。

安装和配置 Nginx

1
brew install nginx

创建文件

1
2
3
4
5
mkdir -p /usr/local/var/log/nginx
mkdir -p /usr/local/etc/nginx/sites-available
mkdir -p /usr/local/etc/nginx/sites-enabled
mkdir -p /usr/local/etc/nginx/conf.d
mkdir -p /usr/local/etc/nginx/ssl
1
2
3
4
5
6
7
sudo mkdir -p /var/www
sudo chown :staff /var/www
sudo chmod 775 /var/www
vi /var/www/info.php
vi /var/www/index.html
vi /var/www/403.html
vi /var/www/404.html

改变 nginx.conf 配置文件

该配置文件在 /usr/local/etc/nginx/nginx.conf 下面.

我的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
worker_processes 1;
error_log /usr/local/etc/nginx/logs/error.log debug;
pid /usr/local/var/run/nginx.pid;
events {
worker_connections 256;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/local/etc/nginx/logs/access.log main;
sendfile on;
keepalive_timeout 65;
index index.html index.php;
include /usr/local/etc/nginx/sites-enabled/*;
include /usr/local/etc/nginx/conf.d/*;
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root ~/projs/phpdev/nginx/nginx_sites/; #web的根目录
index index.php index.html index.htm; #加index.php
}
}
}

注意:

1
2
3
4
location / {
root ~/projs/phpdev/nginx/nginx_sites/; #web的根目录
index index.php index.html index.htm; #加index.php
}

配置了我的 web 目录和支持的文件.

运行 PHP

  • 创建 index.php

  • 启动 php-fpm

1
sudo php-fpm

或者以守护进程的方式来启动 PHP-fpm

1
sudo php-fpm -D
  • 启动 Nginx
1
sudo nginx
  • 编辑 index.php

在 web 目录(我配置的) ~/projs/phpdev/nginx/nginx_sites/ 新建文件 index.php.

index.php 里面可以编写代码:

1
2
3
4
5
6
7
8
9
10
<!-- lang: php -->
<!-- ~/nginx_sites/index.php -->
<?php
echo "Hello PHP";
echo "</br>";
echo "学习 php";
echo "</br>";
echo phpinfo();
?>

打开浏览器, 输入地址:http://localhost:8080/index.php 你会看到下面的页面:

也可以在该目录下创建其他 PHP 文件, 如 m.php 文件.

浏览器中输入 http://localhost:8080/m.php 可以执行相对应的文件.

注意:这里的 m.php 是新建的 PHP 文件.

重要文件

1. php 配置文件

1
/private/etc/php.ini

2. nginx log 文件

1
2
3
4
5
/usr/local/var/log/nginx/access.log
/usr/local/var/log/nginx/error.log
/usr/local/etc/nginx/logs/error.log

3. nginx 配置文件

1
/usr/local/etc/nginx/nginx.conf

4. php-fpm 配置文件

1
/private/etc/php-fpm.d/www.conf

常见问题

502 bad gateaway

我是经常看到这个问题,但是每次引起的原因又不太一样,绝大部分是因为 php-fpm 启动不了或者是其端口错误导致的。

这种情况下,建议去看 /usr/local/etc/nginx/logs/error.log 日志文件。

例如下面的错误:

1
2
3
4
5
6
7
[error]
61016#0: *1 kevent() reported that connect() failed (61: Connection refused) while connecting to upstream,
client: 127.0.0.1,
server: localhost,
request: "GET /3.php HTTP/1.1",
upstream: "fastcgi://127.0.0.1:9000",
host: "localhost:8080"

最终,我修改了 /private/etc/php-fpm.d/www.conf 中端口为 9000(我之前将该端口修改了其他的),重启 php-fpm 解决问题。


扫码关注,你我就各多一个朋友~

坚持原创技术分享!