Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mac 下使用 Nginx + PHP #87

Open
chunpu opened this issue Aug 13, 2017 · 0 comments
Open

Mac 下使用 Nginx + PHP #87

chunpu opened this issue Aug 13, 2017 · 0 comments
Labels

Comments

@chunpu
Copy link
Owner

chunpu commented Aug 13, 2017

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant