1. nginx配置文件路徑
不同安裝方式,nginx的文件存放路徑也有所不同。
1 源碼安裝配置文件路徑:
在安裝目錄下的conf目錄下,比如我的安裝目錄是/usr/local/nginx,那麼他的配置文件就在/usr/local/nginx/conf目錄下。
2 yum安裝配置文件路徑:
在/etc/nginx/目錄(主配置文件)與/etc/nginx/conf.d目錄下。
2. nginx配置文件的結構
通常源碼安裝的nginx的配置文件,會是下面這種結構,yum安裝的有細微差異(大致是一樣的,只是server是通過include引用的獨立配置文件)
一個server可以存在多個location,同樣一個http可以存在多個server,一個server裏面可以包含多個location。一般只配置一個http,這樣就一個實例
1、main全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,允許生成worker process數等。
2、events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啓多個網絡連接序列化等。
3、http塊:可以嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
4、server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
5、location塊:配置請求的路由,以及各種頁面的處理情況。
3. 解析配置文件
全局配置(設置的指令將影響其他所有設置,一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,允許生成worker process數等)
user nginx;
worker_processes 8;
指定nginx的工作進程的用戶及用戶組,默認是nobody用戶。
[root@localhost ~]# ps -ef | grep nginx
nobody 14303 14302 0 16:01 ? 00:00:00 nginx: worker process
通常而言,會給其定義一個用戶。如user nginx,那麼nginx就有權限來管理其發佈目錄。這個用戶必須存在
worker_processes 8; --指定工作進程的個數,默認是1個。具體可以根據服務器cpu數量進行設置,比如cpu有4個,可以設置爲4。一般來說,worker_processes會設置成CPU個數,如果不知道cpu的數量,可以設置爲auto。nginx會自動判斷服務器的cpu個數,並設置相應的進程數。(使用lscpu來查看你的cpu的個數)
worker_cpu_affinity:爲每個進程分配CPU,將八個進程分配給8個CPU,當然也可以寫多個,或者將一個進程分配給多個CPU
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_rlimit_nofile 65535; 進程的最大打開文件數限制。這樣nginx就不會有“too many open files”問題了,最好與ulimit -n的值保持一致。
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload --重新加載配置文件可以看到效果,worker進程由nginx來管理,不是由原來的nobody來管理,而且有兩個worker進程在工作
[root@localhost ~]# ps -ef | grep nginx
root 14302 1 0 16:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 14444 14302 0 17:55 ? 00:00:00 nginx: worker process
nginx 14445 14302 0 17:55 ? 00:00:00 nginx: worker process
master進程和worker進程的關係:master進程是nginx最主要的一個進程。主要是用來接收管理員給其發出的信號。Master下面可以由多個worker進程,可以根據其配置文件生成多個worker進程。worker進程就是用來接收用戶的請求,所有進程都可以去搶用戶的請求,沒有互斥鎖。
如果多個worker的其中一個進程掛掉了,那麼master進程會回收該進程,並生成新的worker進程,是永遠保持你配置文件裏指定的worker進程數進行工作的。
[root@localhost ~]# ps -ef | grep nginx
root 14302 1 0 16:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 14444 14302 0 17:55 ? 00:00:00 nginx: worker process
nginx 14445 14302 0 17:55 ? 00:00:00 nginx: worker process
root 14465 14400 0 18:09 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# kill -9 14444 --可以看到殺死其中的一個worker進程,那麼master立馬就生成新的worker進程
[root@localhost ~]# ps -ef | grep nginx
root 14302 1 0 16:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 14445 14302 0 17:55 ? 00:00:00 nginx: worker process
nginx 14466 14302 0 18:10 ? 00:00:00 nginx: worker process
error_log logs/error.log; --默認使用這個
#error_log logs/error.log notice;
#error_log logs/error.log info;
設置nginx的錯誤日誌路徑,並設置相應的輸出級別。如果編譯時沒有指定編譯調試模塊,那麼 info就是最詳細的輸出模式了。
如果有編譯debug模塊,那麼debug時最爲詳細的輸出模式。這裏設置爲默認就好了。
pid logs/nginx.pid;
指定nginx進程pid的文件路徑 ,Nginx進程是作爲系統守護進程在進行,需要在某個文件中保存當前運行程序的主進程號,
events {
use epoll;
worker_connections 1024;
multi_accept on
}
multi_accept on:設置是否允許同時接受多個網絡連接,只能在events模塊設置,Nginx服務器的每個工作進程可以同時接受多個新的網絡連接,但是需要在配置文件中配置,此指令默認爲關閉,即默認爲一個工作進程只能一次接受一個新的網絡連接,打開後幾個同時接受多個。
events :這個指令塊用來設置工作進程的工作模式以及每個進程的連接上限。
use :用來指定nginx的工作模式,通常選擇epoll,除了epoll,還有select,poll。
worker_connections :定義每個工作進程的最大連接數,默認是1024。
http指令塊,即web服務器的相關配置
include: include是一個引用函數 mime.types; 定義數據類型
如果用戶請求lutixia.png,服務器上有lutixia.png這個文件,後綴名是png,根據mime.types,這個文件的數據類型應該是image/png,將Content-Type的值設置爲image/png,然後發送給客戶端
default_type application/octet-stream:設定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置PHP環境時,Nginx是不予解析的。此時,用瀏覽器訪問PHP文件就會出現下載窗口。
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 logs/access.log main;
定義日誌文件格式,並默認取名爲main,可以自定義該名字。也可以通過添加,刪除變量來自定義日誌文件的格式,main後面的內容定義了日誌的格式。
access_log :定義訪問日誌的存放路徑,並且通過引用log_format所定義的main名稱引用其輸出格式,如果定義了多個日誌格式,可以來引用其中一種格式
[root@localhost conf]# tail -f /usr/local/nginx/logs/access.log
192.168.179.99 - - [07/Mar/2020:20:51:30 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [07/Mar/2020:21:35:29 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0"
sendfile on :用於開啓高效文件傳輸模式。直接將數據包封裝在內核緩衝區,然後返給客戶,將tcp_nopush和tcp_nodelay兩個指令設置爲on用於防止網絡阻塞。
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65 :設置客戶端連接保持活動的超時時間。在超過這個時間之後,服務器會關閉該連接。
HTTP 有一個 KeepAlive 模式,它告訴 webserver 在處理完一個請求後保持這個 TCP 連接的打開狀態。若接收到來自客戶端的其它請求,服務端會利用這個未被關閉的連接,而不需要再建立一個連接。
提示:可以用netstat -ntlpa |grep 80 查看鏈接狀態
[root@localhost ~]# netstat -ntplna | grep 80 --使用瀏覽器瀏覽nginx門戶網站,然後看到建立連接了
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14875/nginx: master
tcp 0 0 192.168.179.99:80 192.168.179.4:62065 ESTABLISHED 15340/nginx: worker
[root@localhost ~]# netstat -ntplna | grep 80 --65秒之後再看看,可以看到斷開連接了
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14875/nginx: master
tcp 0 0 192.168.179.99:80 192.168.179.4:62065 TIME_WAIT -
keepalive_requests 100; 設置nginx在保持連接狀態最多能處理的請求數,到達請求數,即使還在保持連接狀態時間內,也需要重新連接。
這個值根據生存環境而設定,比如京東的網頁,訪問首頁的請求就100多次了,比如每個圖片都是一個資源,都需要請求,所以要根據網頁的文件個數來設定。(對於爬蟲的程序65秒足夠將官網的數據爬完,所以除了定義keepalive_timeout的值之外還可以限制在65秒內可以訪問多少次)
gzip on :開啓壓縮功能,減少文件傳輸大小,節省帶寬。
gzip_min_length:設置最小的壓縮長度,官方設置1K,如果文件大小小於1K,不進行壓縮,大於1K就需要壓縮gzip_min_length 1k;(當返回內容大於此值時纔會使用gzip進行壓縮,以K爲單位,當值爲0時,所有頁面都進行壓縮。)
gzip_types:壓縮的類型,設置需要壓縮的MIME類型,如果不在設置類型範圍內的請求不進行壓縮。圖片視頻一般是已經壓縮了的,再壓縮效果也不是很大,所以需要壓縮的格式爲XML格式。gizp_types text/plain text/xml;(將普通文件和XML文件進行壓縮)
[root@localhost epel-source]# ls -lh /var/cache/yum/x86_64/7/epel/metalink.xml -rw-r--r-- 1 root root 8.8K Mar 8 10:48 /var/cache/yum/x86_64/7/epel/metalink.xml --將.xm文件拷貝到nginx的發佈目錄下面去,大小爲8.8K
[root@localhost epel-source]# cp /var/cache/yum/x86_64/7/epel/metalink.xml /usr/local/nginx/html/
然後打開瀏覽器去訪問.xml文件,可以看到壓縮後只有2.1K,可以看到壓縮了四分之一
gzip_comp_level 3; 壓縮級別,默認是1,一般設置爲3
server指令塊:用於定義虛擬主機的,指令主要用於指定主機和端口
一個server表示一個網站
server :用來定義虛擬主機
listen :設置監聽端口,默認爲80端口,端口可以根據需要修改爲8080
server_name :網站域名,多個域名通過逗號隔開,默認是localhost,可以修改爲www.lutixia.com;
[root@localhost ~]# netstat -tpln | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 14875/nginx: master
測試一下(端口8080 域名 www.lutixia.com)
修改windows C:\Windows\System32\drivers\etc下的hosts文件,用來解析域名
加上這一行 192.168.179.99 www.lutixia.com
如果要解析多個域名 192.168.179.99 www.lutixia1.com www.lutixia2.com www.lutixia3.com
可以看到訪問成功了!
charset :設置網頁的默認編碼格式,一般設置爲charset utf-8;
access_log :指定該虛擬主機的獨立訪問日誌,會覆蓋前面的全局配置日誌文件。如果有有多個虛擬主機,那麼每個虛擬主機都需要配置自己的access_log
access_log logs/lutixia.access.log main; --如果這樣配置,那麼就會覆蓋全局的日誌文件,這個引用main是前面定義的日誌格式
[root@www ~]# ls /usr/local/nginx/logs/
access.log error.log lutixia.access.log nginx.pid
[root@www logs]# tail -1f /usr/local/nginx/logs/lutixia.access.log
192.168.179.4 - - [08/Mar/2020:20:08:58 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36" "-"
location指令塊:配置請求的路由,以及各種頁面的處理情況
location / {
root html;
index index.html index.htm;
}
location:來定義資源路徑,默認是直接給一個/根目錄,所有資源都從根目錄下去找,這個根目錄就是發佈目錄
index :設置默認的索引文件
error_page :定義訪問錯誤返回的頁面,凡是狀態碼是500 502 503 504 都會返回這個頁面。
[root@www html]# vim /usr/local/nginx/html/404.html --這個error page得自己去定義
[root@www html]# cat /usr/local/nginx/html/404.html
"this is error page,file not found!"
error_page 404 =200 /404.html; --定義返回的狀態碼爲200
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html; }
這是第二種定義找不到頁面的方法,其實和上面的error_page 404 =200 /404.html是一樣的,上面可以寫成
error_page 404 =200 /404.html;
location=/404.html{
root html; --這裏的root html代表根目錄是html,這裏的root不是root用戶,是代表根目錄符號/
}
error_page 404 =200 /404.html;
location=/404.html{
root /data/; --root /data/表示根目錄爲絕對路徑/data/,那麼必須保證/data/下有404.html
}
root /data/表示根目錄爲絕對路徑/data/
還是使用第一種最直觀 error_page 404 =200 /404.html;