Nginx參數優化和詳解

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; 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章