[TOC] #### 1. 前言 --- 環境介紹: mac book pro m1 2020 本文記錄使用 brew 安裝 nginx 配合PHP工作 #### 2. 安裝PHP --- 查看有哪些PHP版本可以安裝 ``` brew search php ``` 安裝php7.2 ``` brew install php@7.2 ``` 切換 PHP 版本 ``` brew-php-switcher 7.2 ``` #### 3. nginx的安裝及基本配置 --- ``` brew install nginx ``` 一、`location /`: 因為所有的請求都是以`/`開頭的,所以下面的配置相當于匹配任意的URL ``` location / { root html; index index.html index.htm; } ``` root: 站點根目錄, 相當于`Apahce`的 `DocumentRoot` ``` DocumentRoot "/Users/liang/Sites" ``` index: 默認訪問的文件, 相當于`Apahce`的 `DirectoryIndex` ``` <IfModule dir_module> DirectoryIndex index.html index.php </IfModule> ``` **二、`location ~ \.php$`: 匹配以.php結尾的文件** fastcgi_param: 將值中的 `/scripts` 改為 `$document_root` fastcgi_pass: 如果請求時php文件,那么nginx會把請求轉發到 `127.0.0.1:9000`, 其中 9000 是php-fpm的端口 ``` 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; } ``` 查看 `php-fpm.d` 目錄下的 配置文件 `www.conf` ``` cat /opt/homebrew/etc/php/7.2/php-fpm.d/www.conf ``` 進入 vim 模式,搜索關鍵詞 `9000`, 就會發現確實可以找到 `listen = 127.0.0.1:9000` ![](https://img.itqaq.com/art/content/77b0b1a7155e3eb16751c379675515cf.png) #### 4. nginx的URL重寫 --- 以TP6.0舉例,訪問 index控制器的 hello 方法,用 `/index/hello` 訪問提示 `404` 因為 nginx 默認是不支持pathinfo方式訪問的,如果要訪問可以通過 `s=/index/hello` 訪問 ``` // 訪問提示404 http://127.0.0.1:8081/index.php/index/hello // 訪問正常 http://127.0.0.1:8081/index.php?s=/index/hello ``` 但是可以通過修改配置文件使其支持pathinfo方式訪問,將以下代碼放入 `location /` 中即可 ``` if (!-e $request_filename) { rewrite ^/index.php(.*)$ /index.php?s=$1 last; rewrite ^(.*)$ /index.php?s=$1 last; break; } ``` ``` rewrite ^/index.php(.*)$ /index.php?s=$1 last; /index.php/index/hello 重寫為 /index.php?s=/index/hello rewrite ^(.*)$ /index.php?s=$1 last; /index/hello 重寫為 /index.php?s=/index/hello ``` 修改后的配置文件示例: ![](https://img.itqaq.com/art/content/88e354e50db977223a77012486339fa0.png) #### 5. 更高效的管理nginx配置文件(虛擬主機) ---- nginx 要友好的支持PHP項目,只需要去關注`server` 配置塊即可 后續 nginx 上需要綁定多個項目,這是如何做配置呢 方案一: 在 nginx.conf 可以使用多個 server 配置塊管理不同的項目,此時不方便管理,因為所有項目的配置都在一個文件中 方案二: 將方案一中的 server塊 抽離出來,放到相應的目錄下面,而 nginx 也提供了這樣一種能力 在 nginx.conf 配置文件的最下面有這樣一個配置,就是定義這個目錄的路徑 ``` include servers/*; ``` 將項目的 `server` 配置塊抽離出來, 放到 `servers` 目錄下,一個項目占用一個配置文件 ![](https://img.itqaq.com/art/content/00ece395527b24500ab80c4579008845.png) #### 6. 配置web訪問以及查看目錄文件 ---- nginx 默認不支持像 ftp 那樣顯示文件列表 即使 localhost 指向的目錄下面有文件和目錄,訪問時也會提示 `403 Forbidden` ![](https://img.itqaq.com/art/content/1e84d54572b89f37155f58898efc9cb2.png) 可以通過給 `location /` 配置段添加額外參數使其支持顯示目錄文件,將以下代碼放入 `location /` 中即可 ``` autoindex on; # 開啟目錄文件列表 autoindex_localtime on; # 顯示的文件時間為文件的服務器時間 autoindex_exact_size on; # 顯示出文件的確切大小,單位是bytes,但我試的時候沒看到效果 charset utf-8,gbk; # 避免中文亂碼,使中文文件名可以正常顯示 ``` 配置示例 ``` location / { root /Users/liang/Sites; index index.html index.htm index.php; autoindex on; autoindex_localtime on; autoindex_exact_size on; charset utf-8,gbk; } ``` 配置成功 ![](https://img.itqaq.com/art/content/532ceda854cb54e2a645ff675ca328a7.png)