1. 安裝nginx
// 查詢有沒有nginx brew search nginx //開始安裝nignx brew install nginx
2. 檢查nignx是否安裝成功
nginx -V 查看nginx版本及安裝的本地位置 ngxin -v 查看nginx版本(此方法依然可以檢測是否安裝某一軟件,如git,hg等)
//同時你也可以在瀏覽器上輸入,來查看運行結果,出現下圖應該就可以了
localhost:8080

3. nginx安裝在哪?為什么會安裝在這里?
--prefix=/usr/local/Cellar/nginx/1.15.5 // 沒錯就是安裝在這里了
那么為什么會安裝在這里呢?
/usr用於存放系統應用程序,比較重要的目錄/usr/local本地系統管理員軟件安裝目錄(安裝系統級的應用)。這是最龐大的目錄,要用到的應用程序和文件幾乎都在這個目錄。
顯然,nignx屬於系統級應用,所以就安裝在了/usr/local下。
不過有一點需要注意:/usr目錄下一般安裝系統應用,/usr/local目錄下安裝用戶下載的系統應用。然后可能會有人說,你這不是在扯淡嗎?這兩個有什么差別?別急,真的有差別!
/usr/local目錄 安裝用戶下載的系統應用,比如nginx,mysql,zsh,openssl等系統軟件 都放在這些個地方, /usr目錄存放安裝linux系統時安裝的應用,明白了嗎?一個是系統安裝時安裝的應用,一個是用戶安裝的應用,兩者不是一會事兒。
4. nginx啟動和暫停指令
nginx關閉很簡單,稍微有點復雜的是nginx的開啟
//關閉, kill和pkill的區別,kill只能通過進程id殺死進程,pkill可以通過進程名字殺死所有的進程 pkill nginx;
nginx開啟,首先你要知道nginx的可以執行文件在哪。那么怎么知道呢?看下面的代碼
-v : show version and exit // 告訴我們nginx的配置信息 -V : show version and configure options then exit // 不僅告訴我們配置信息,還會告訴我們配置選項,然后停止 -t : test configuration and exit // 檢查配置是不是正確 -T : test configuration, dump it and exit // 檢查配置,並把這些配置打印出來,然后就停止 -q : suppress non-error messages during configuration testing -s signal : send signal to a master process: stop, quit, reopen, reload // 給主進程發信息,比如stop, quit, reopen, reload這些指令(Quit 是一個優雅的關閉方式,Nginx在退出前完成已經接受的連接請求;Stop 是快速關閉,不管有沒有正在處理的請求) -p prefix : set prefix path (default: /usr/local/Cellar/nginx/1.15.5/) // -s reopen 重新打開日志(不懂日志) -c filename : set configuration file (default: /usr/local/etc/nginx/nginx.conf) // nginx到底以哪個配置文件為准 -g directives : set global directives out of configuration file
這個時候我們可以先執行
nginx -V
然后會看到

進入--sbin-path指示的地方,然后執行下面代碼就可以了
./nginx -t // 如果配置文件不正確的話,可以使用./nginx -c location 來指定配置文件
5. nginx配置好了,利用nginx來做事情了。先看看nginx主要的配置,及它們的含義
worker_processes 4; #Nginx運行時使用的CPU核數 events { worker_connections 1024; #一個woeker進程的最大連接數 } http { #Nginx用作虛擬主機時使用。每一個server模塊生成一個虛擬主機。
include mime.types; #定義MIME類型和后綴名關聯的文件的位置 default_type application/octet-stream; #指定mime.types文件中沒有記述到的后綴名的處理方法 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #定義日志的格式。可以選擇main或者ltsv,后面定義要輸出的內容。
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
1.$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的ip地址;
2.$remote_user :用來記錄客戶端用戶名稱;
3.$time_local :用來記錄訪問時間與時區;
4.$request :用來記錄請求的url與http協議;
5.$status :用來記錄請求狀態;
6.$body_bytes_s ent :記錄發送給客戶端文件主體內容大小;
7.$http_referer :用來記錄從那個頁面鏈接訪問過來的;
8.$http_user_agent :記錄客戶端瀏覽器的相關信息;。
access_log /usr/local/var/log/nginx/access.log main; #連接日志的路徑,上面指定的日志格式放在最后 sendfile on; #是否使用OS的sendfile函數來傳輸文件 keepalive_timeout 65; #HTTP連接的持續時間。設的太長會使無用的線程變的太多 server { listen 80; #監聽端口 server_name localhost; #服務地址 charset utf-8; #編碼方式 access_log /usr/local/var/log/nginx/localhost.access.log main; #nginx請求日志地址 root /var/www; #你的網站根目錄 location / { # 所有的請求都會走的路徑 index index.html index.htm index.php; try_files $uri /$uri index.php?$args; #從左邊開始找指定文件是否存在 } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { # 正則表達式: .php文件走的路徑 fastcgi_pass 127.0.0.1:9000; #走fastcgi 路徑 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; #定義的根目錄 以及 請求的腳本名 include fastcgi_params; # 請求參數 } location ~ /\.ht { # 當前項目的根路徑 deny all; } } include sites-enabled/nginx-*.conf; # 添加的文件其他虛擬主機配置 }
6. 看完各種配置之后,可以嘗試着自己寫一波了。
運行:sudo /usr/sbin/php-fpm,因為usr/sbin目錄下放的是可執行文件,所以當你訪問/usr/sbin/php-fpm的時候就相當於在啟動fpm。但很遺憾,出現了這樣的錯誤:
[22-Oct-2018 21:15:38] ERROR: failed to open configuration file '/private/etc/php-fpm.conf': No such file or directory (2) [22-Oct-2018 21:15:38] ERROR: failed to load configuration file '/private/etc/php-fpm.conf' [22-Oct-2018 21:15:38] ERROR: FPM initialization failed
看看這個錯誤提示的意思是沒有 '/private/etc/php-fpm.conf',找不到不要緊,我們再往里面查,發現里面有一個默認的文件

拷貝一份過去不就得了?
sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
拷貝完之后接着執行 :sudo /usr/sbin/php-fpm 發現報錯:
[22-Oct-2018 21:16:27] WARNING: Nothing matches the include pattern '/private/etc/php-fpm.d/*.conf' from /privat; Start a new pool named 'www'. ; the variable $pool can be used in any directive and will be replaced by the e/etc/php-fpm.conf at line 125. ; Start a new pool named 'www'. [22-Oct-2018 21:16:27] ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2) [22-Oct-2018 21:16:27] ERROR: failed to post process the configuration [22-Oct-2018 21:16:27] ERROR: FPM initialization failed
很簡單,找不到file和directory,既然找不到,先創建個文件夾:sudo mkdir -p /usr/var/log,結果發現:
mkdir: /usr/var/log: Operation not permitted
為啥啊?mac EI Captian系統權限收緊了,不讓創建了。那好,不讓創建就不創建了。我換個地方建行不行?sudo mkdir -p /usr/local/var/log/nginx/ 幺西,可以了。我再執行:sudo /usr/sbin/php-fpm
[22-Oct-2018 21:17:54] WARNING: Nothing matches the include pattern '/private/etc/php-fpm.d/*.conf' from /private/etc/php-fpm.conf at line 125.
[22-Oct-2018 21:17:54] ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2)
[22-Oct-2018 21:17:54] ERROR: failed to post process the configuration
[22-Oct-2018 21:17:54] ERROR: FPM initialization failed
; Start a new pool named 'www'.
what?這是個什么叼!老子配個環境,跟唐僧去西天取經一樣。我忍。不就是錯誤嗎,查!
Mac OSX 10.9的系統自帶了PHP、php-fpm,省去了安裝php-fpm的麻煩。 這里需要簡單地修改下php-fpm的配置,否則運行php-fpm會報錯。
<!-- lang: shell --> sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf vim /private/etc/php-fpm.conf
修改php-fpm.conf文件中的error_log項,默認該項被注釋掉,這里需要去注釋並且修改為error_log = /usr/local/var/log/php-fpm.log。如果不修改該值,運行php-fpm的時候會提示log文件輸出路徑不存在的錯誤。
這個問題解決了,我接着再運行:sudo /usr/sbin/php-fpm 服了,改了,夠了。又出現了這樣的錯誤。
[22-Oct-2018 21:22:04] WARNING: Nothing matches the include pattern '/private/etc/php-fpm.d/*.conf' from /private/etc/php-fpm.conf at line 125. [22-Oct-2018 21:22:04] ERROR: No pool defined. at least one pool section must be specified in config file [22-Oct-2018 21:22:04] ERROR: failed to post process the configuration [22-Oct-2018 21:22:04] ERROR: FPM initialization failed
查!!!!!!!!!!
大概意思就是說找不到/private/etc/php-fpm.d/*.conf目錄下的配置文件。 進入里面的目錄,會有一個www.conf.default文件。執行下面命名復制一份
root@ubuntu:/opt/php7/etc/php-fpm.d/# cp www.conf.default www.conf 復制好之后,編輯該文件 定位到里面文件的 user = nobody 和 group = nobody ,調整為 www-data。這一步和5版編譯安裝一樣。最后啟動PHP-FPM
改好之后,再次執行:sudo /usr/sbin/php-fpm
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed
蘋果對1024一下的端口都做了限制,要有root權限才能執行,所以用sudo命令或者將端口改為1024以上就可以解決這個問題了。 我采用的方法是把端口號改成了8088。
然后訪問localhost:8080,結果出現了這個問題:

Bad GateWay什么鬼?沒關系我們看一下錯誤日志:
2018/10/23 11:25:17 [crit] 28716#0: *26 stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/" failed (13: Permission denied), client: 127.0.0.1, server: quxuexi.merchant, request: "GET / HTTP/1.1", host: "localhost:8088" 2018/10/23 11:25:17 [crit] 28716#0: *26 stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/" failed (13: Permission denied), client: 127.0.0.1, server: quxuexi.merchant, request: "GET / HTTP/1.1", host: "localhost:8088" 2018/10/23 11:25:17 [crit] 28716#0: *26 connect() to unix:/var/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: quxuexi.merchant, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "localhost:8088" 2018/10/23 11:25:17 [crit] 28716#0: *26 stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/favicon.ico" failed (13: Permission denied), client: 127.0.0.1, server: quxuexi.merchant, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8088", referrer: "http://localhost:8088/" 2018/10/23 11:25:17 [crit] 28716#0: *26 stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/favicon.ico" failed (13: Permission denied), client: 127.0.0.1, server: quxuexi.merchant, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8088", referrer: "http://localhost:8088/" 2018/10/23 11:25:17 [crit] 28716#0: *26 connect() to unix:/var/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: quxuexi.merchant, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "localhost:8088", referrer: "http://localhost:8088/"
總的來說錯誤日志給出了三種錯誤提示:
(1)訪問/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/" failed 失敗了
(2)connect() to unix:/var/run/php/php7.2-fpm.sock failed (2: No such file or directory) 失敗了,沒有這樣的文件和文件夾,也就是說可能文件和文件夾的位置不對勁吧
(3)stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/favicon.ico" failed (13: Permission denied)訪問 public目錄下的favicon.ico失敗。錯誤和(1)差不多,但是不清楚為什么訪問public目錄下的favicon.ico文件。
既然找到了問題出在哪,就可以嘗試着去解決問題了,首先查詢第一個問題。結果發現第一個問題的解決方法解決不了。
既然如此就先解決第二個問題吧,查查查。腦子懵了,沒查到。后來問了問同事,找到了解決問題的解決方法了。

這個時候問題就出現了,你nginx服務器監聽的是8088端口,然后nginx將接收到的信息也轉發到8088端口,這樣怎么可以呢?暫且不說fastcgi監聽的是哪個端口,正常的邏輯應該是這樣,我nginx監聽從8088來的信息,然后根據這些信息的類型把這些信息轉發到php-fpm監聽的端口,這本身就是兩個進程,監聽的端口也不一樣。有人會問,為什么不一樣?舉個例子,如果兩個人都監聽8088端口,那fastcgi能不能收到和有沒有權利收到信息是一回事兒,更嚴重的問題是nginx自己監聽自己發送的信息,這樣不符合邏輯啊。可以理解為,自己給自己寫信。那好,可能又會有人說,那我讓兩個進程監聽一個端口,然后ngnix不做轉發不可以嗎?我還真不知道可不可以,所以去查了一下:其實是可以的,這就能理解成是信箱,我們把信息千里迢迢的發送到信箱,然后有人去信箱取信,那到底是誰來取,幾個人可以取,一個人取幾個都是由人規定的。
出於好奇,我又產生了一個疑問,為什么要有端口這樣的東西呢?兩台計算機進程之間直接通信不可以嗎?其實是不可以的,這就好比兩個陌生人之間的通信。彼此之間互相不認識,怎么通信。最好的選擇就是給彼此個地址,然后你發信息,我取信息,這樣就是進程間通信的過程。通過廣播的方式在全世界尋找一個ip中的一個進程號,這顯然是不現實的。因為你在發信息的時候根本就不知道這個進程號是多少。當然你也可以在通信之前就發送某個進程號過去,告訴它我們之間用這個進程號通信,但是這樣的限制太死了。為什么呢?你這個進程號怎么發送過去?尷尬了吧!而且,進程號是系統動態分配的,不同的系統會使用不同的進程標識符,應用程序在運行之前不知道自己的進程號,如果需要運行后再廣播進程號則很難保證通信的順利進行。
好了,終於把這些問題搞懂了,然后就開始改配置,解決問題了。

看下php-fpm的監聽的端口號

問題來了你怎么找到這個配置在哪里呢?
php-fpm -t // 檢測配置
打開顯示的php-fpm配置文件,然后發現:

打開這個文件,你會發現php-fpm監聽的是哪個端口,以及使用的是什么來監聽的。
那這個php-fpm.d/*.conf文件是干什么的呢?
我在這個地方找到了答案:http://ask.apelearn.com/question/5299
從php-5.3版本以后,php-fpm.conf 的格式不再是xml格式,而是和php.ini所使用的格式一樣。新版本的php-fpm.conf 從宏觀上看共分為兩大塊:一個是全局配置[global],一個是Pool Definitions, [www] 其中global部分就是配置一些全局的參數,比如錯誤日志、pid、日志級別等,第二部分的pool可以定義多個,而且[]的name可以自定義:例如配置文件可以這樣寫 [global] ... ... ... [www.domain1.com] ... ... ... [www.domain2.com] ... ... ...
當然每一個[www]部分都可以單獨寫一個配置文件,就像nginx的vhosts一樣。這就需在php-fpm.conf中首先加一句
include=etc/fpm.d/*.conf
然后,需要在etc目錄下創建一個fpm.d目錄,把每一個pool配置文件放到fpm.d下。
為了安全起見,需要定義每個pool所啟用的賬戶,還需要定義open_basedir,如下
- [www.domain.com]
- user = user0
- group = users
- listen = /tmp/php-fcgi-www.default.com.sock
- listen.owner = user0
- listen.group = users
- pm = dynamic
- pm.max_children = 20
- pm.start_servers = 5
- pm.min_spare_servers = 4
- pm.max_spare_servers = 10
- pm.max_requests = 500
- slowlog = log/www.default.com.slow
- request_slowlog_timeout = 1
- php_admin_value[open_basedir]=/data/release/www.domain.com/:/tmp/
- [www.domain2.com]
- user = user1
- group = users
- listen = /tmp/php-fcgi-www.default2.com.sock
- listen.owner = user1
- listen.group = users
- pm = dynamic
- pm.max_children = 20
- pm.start_servers = 5
- pm.min_spare_servers = 4
- pm.max_spare_servers = 10
- pm.max_requests = 500
- slowlog = log/www.default2.com.slow
- request_slowlog_timeout = 1
- php_admin_value[open_basedir]=/data/release/www.domain.com/:/tmp/
