chunpu / blog

personal blog render by jekyll
MIT License
51 stars 8 forks source link

Mac 下使用 Nginx + PHP #87

Open chunpu opened 7 years ago

chunpu commented 7 years ago

mac 中自带了 Apache httpd, PHP, php-fpm

启动 Apache httpd 只需要使用此命令

sudo apachectl start

编辑 apache 配置文件 httpd.conf

sudo vim /etc/apache2/httpd.conf

把 php 模块的注释去掉就可以了 LoadModule php5_module libexec/apache2/libphp5.so

重启 apache

sudo apachectl restart

那怎么知道 php 生效了呢?

我们可以让 server 显示 phpinfo

找到 httpd.confDocumentRoot 的配置, 默认是 DocumentRoot "/Library/WebServer/Documents"

因此我们需要做如下步骤

  1. /Library/WebServer/Documents 路径下新建一个 index.php
  2. 输入 <?php phpinfo(); ?>
  3. 删掉之前的 index.html.* 文件
  4. 重新访问 localhost 就能看到 phpinfo 啦

Nginx + PHP

我们不满足于使用 Apache + PHP, 目前的主流是 Nginx(或者说我只会 Nginx), 因此我们还想用 Nginx + PHP

Nginx 有几种代理方式, proxy_pass, fastcgi_pass, scgi_pass

proxy_pass 就是常见的 http 代理

PHP 有 php-fpm, 全称叫 php fastcgi progress manager, 翻译成大白话应该是

PHP 高速通用网关接口进程管理器

因此 Nginx 和 PHP 通常用 fastcgi_pass, fastcgi 顾名思义, 就是性能更快的 cgi

启动 php-fpm

Mac 中已经自带了 php-fpm, 我们直接在命令行输入 php-fpm

[13-Aug-2017 11:10:52] ERROR: failed to open configuration file '/private/etc/php-fpm.conf': No such file or directory (2)
[13-Aug-2017 11:10:52] ERROR: failed to load configuration file '/private/etc/php-fpm.conf'
[13-Aug-2017 11:10:52] ERROR: FPM initialization failed

弹出一堆报错, 错误提示大意是没有找到 php-fpm 的配置文件, 于是我们就到 /private/etc/ 下, 发现有一个 php-fpm.conf.default 文件

那正好, 我们直接 sudo cp php-fpm.conf.default php-fpm.conf

再启动 php-fpm

结果又报错了

[13-Aug-2017 11:12:55] ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2)
[13-Aug-2017 11:12:55] ERROR: failed to post process the configuration
[13-Aug-2017 11:12:55] ERROR: FPM initialization failed

说是找不到 php-fpm.log 文件, 正常系统哪来的 /usr/var/ 目录啊, 于是我们去新建一个路径 sudo mkdir -p /usr/var, 结果提示没有权限, 得, 那还是改配置文件吧

于是我们继续编辑 php-fpm 的配置文件 /private/etc/php-fpm.conf

注意, php-fpm 配置文件用 ; 作为单行注释, 我们在 pid 和 log 的配置下分别加上两行

;pid = run/php-fpm.pid
pid = /usr/local/var/run/php-fpm.pid; 指定新的 pid 文件

;...

;error_log = log/php-fpm.log
error_log = /usr/local/var/log/php-fpm.log; 指定新的 error_log 文件

再次启动 php-fpm, 只有一些非 root 的警告了

确认一下是否成功, php-fpm 端口用的是 9000

输入 lsof -i:9000, 显示 php-fpm 则认为成功

配置 nginx

nginx 默认的配置已经有一段写好了的被注释的 fastcgi php 配置, 我们只需要稍加改动

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#   
#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;
#}  

改成这样

location ~ \.php$ {
    root           /Library/WebServer/Documents; # 自定义root目录, 暂时和 apache 保持同一个 document root
    fastcgi_pass   127.0.0.1:9000; # php-fpm 的端口
    fastcgi_index  index.php; # 设置 index
    include        fastcgi_params; # 引入 fastcgi 配置
    #include        fastcgi.conf; # 引入 fastcgi 配置, 和上一行是一样的, 选其中之一即可
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name; # 核心关键, 定义了应该选择哪个 php 文件解析
}

单一入口 php 程序

这种 php 项目的特征是有一个 main.php 或者 index.php, 统一处理 php 请求, 在这个 php 里面定义 controller 和 view, 其实现代的项目都是这样的, 因为方便做统一处理, 模块化整个项目

location = /app.php {
    root           /Library/WebServer/Documents; # 自定义root目录, 暂时和 apache 保持同一个 document root
    fastcgi_pass   127.0.0.1:9000; # php-fpm 的端口
    include        fastcgi_params; # 引入 fastcgi 配置
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    internal;
}

location / {
    try_files $uri /app.php$is_args$args;
}

其中 location / 会和默认的静态文件目录产生冲突, 如下所示

location / {
    root   html;
    index  index.html index.htm;
} 

我一般会改成这样 /static 专门处理静态文件

location /static {
    root   static;
    index  index.html index.htm;
} 

重启 nginx 就可以了

参考文档 https://www.chrisyue.com/nginx-php-config-again.html