Nginx配置檔案詳解以及配置反向代理和支援跨域
一、簡介:
Nginx是一款輕量級的web伺服器,反向代理伺服器,由於他的記憶體佔用少,啟動快,高併發能力強,在網際網路專案中廣泛應用。
二、Nginx的配置檔案:
如果Nginx是yum安裝;配置檔案預設位置在/etc/nginx/nginx.conf 如果是編譯安裝Nginx,具體配置檔案路徑根據你安裝時指定放置的路徑下
1 user nginx; 2 worker_processes auto; #工作程序:數目。根據硬體調整,通常等於CPU數量或者2倍於CPU(auto自動根據伺服器CPU數量進行調整) 3 error_log /var/log/nginx/error.log; # 錯誤日誌放置路徑4 pid /run/nginx.pid; #程序PID存放路徑 5 6 include /usr/share/nginx/modules/*.conf; 7 8 events { 9 worker_connections 24400; #指定程序可以開啟的最大描述符:數目。這個指令是指當一個nginx程序開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(ulimit-n)與nginx程序數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit-n的值保持一致。現在在linux2.6核心下開啟檔案開啟數為65535,worker_rlimit_nofile就相應應該填寫65535。這是因為nginx排程時分配請求到程序並不是那麼的均衡,所以假如填寫10240,總併發量達到3-4萬時就有程序可能超過10240了,這時會返回502錯誤
10 } 11 12 http { 13 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 14 '$status $body_bytes_sent "$http_referer" ' 15 '"$http_user_agent" "$http_x_forwarded_for"'; 16 17 access_log /var/log/nginx/access.log main; 18 19 sendfile on;20 tcp_nopush on; 21 tcp_nodelay on;
proxy_connect_timeout90;
proxy_read_timeout180;
proxy_send_timeout180; 22 keepalive_timeout 65; 23 types_hash_max_size 2048; 24 25 ## nginx 安全相關配置 26 #關閉檔案索引 27 autoindex on; 28 #隱藏版本號 29 server_tokens off; 30 #設定客戶端請求頭讀取超時時間,超過這個時間還沒有傳送任何資料,Nginx將返回“Request time out(408)”錯誤 31 client_header_timeout 150; 32 #設定客戶端請求主體讀取超時時間,超過這個時間還沒有傳送任何資料,Nginx將返回“Request time out(408)”錯誤 33 client_body_timeout 150; 34 #上傳檔案大小限制 35 client_max_body_size 100m; 36 #指定響應客戶端的超時時間。這個超過僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。 37 send_timeout 600; 38 39 include /etc/nginx/mime.types; 40 default_type application/octet-stream; 41 42 include /etc/nginx/conf.d/*.conf; 43 44 server { 45 listen 80 default_server; 46 listen [::]:80 default_server; 47 server_name _; 48 root /usr/share/nginx/html; 49 50 include /etc/nginx/default.d/*.conf; 51 52 location / { 53 } 54 55 } 56 include site-enabled/*.conf; 57 }
(1)全域性塊:
從配置檔案開始到events塊之間的內容,主要會設定一些影響nginx 伺服器整體執行的配置指令,主要包括配置運待Nginx伺服器的使用者(組)、允許生成的worker process數,程序PID存放路徑、日誌存放路徑和型別以及配置檔案的引入等。
(2)events塊:
events塊涉及的指令主要影響 Nginx伺服器與使用者的網路連線,常用的設定包括是否開啟對多 work process下的網路連線進行序列化,是否允許同時接收多個網路連線,選取哪種事件驅動模型來處理連線請求,每個 word rocess可以同時支援的最大連線數等。這部分的配置對Nginx的效能影響較大,在實際中應該靈活配置。
use epoll; nginx採用epoll事件模型,處理效率高
worker_connections 65535;是單個worker程序允許客戶端最大連線數,這個數值一般根據伺服器效能和記憶體來制定,實際最大值就是worker程序數乘以work_connections。
multi_accept 告訴nginx收到一個新連線通知後接受盡可能多的連線,預設是on,設定為on後,多個worker按序列方式來處理連線,也就是一個連線只有一個worker被喚醒,其他的處於休眠狀態,設定為off後,多個worker按並行方式來處理連線,也就是一個連線會喚醒所有的worker,直到連線分配完畢,沒有取得連線的繼續休眠。當你的伺服器連線數不多時,開啟這個引數會讓負載有一定的降低,但是當伺服器的吞吐量很大時,為了效率,可以關閉這個引數。
(3)http塊:
這算是Nginx伺服器配置中最頻繁的部分,代理、快取和日誌定義等絕大多數功能和第三方模組的配置都在這裡。需要注意的是:http塊也可以包括http全域性塊、server塊。
Http全域性塊:http全域性塊配置的指令包括檔案引入、MIME-TYPE定義、日誌自定義、連線超時時間、單鏈接請求數上限等。
Server塊:這塊和虛擬主機有密切關係,虛擬主機從使用者角度看,和一臺獨立的硬體主機是完金一樣的,該技術的產生是為了節省網際網路伺服器硬體成本。每個http塊可以包括多個server塊,而每個server 塊就相當於一個虛擬主機。而每個server塊也分為全域性server塊,以及可以同時包含多個locaton塊。
全域性Server塊:最常見的配置是本虛擬機器主機的監聽配置和本虛擬主機的名稱或IP配置。
Location塊:一個server 塊可以配置多個location塊。這塊的主要作用是基於Nginx 伺服器接收到的請求字串(例如 server_name/uri-string),對虛擬主機名稱(也可以是IP別名)之外的字串(例如前面的/uri-string)進行匹配,對特定的請求進行處理。地址定向、資料快取和應答控制等功能,還有許多第三方模組的配置也在這裡進行
Location匹配原則:可以參考該連結進行檢視:https://www.cnblogs.com/zhaof/p/5945576.html?utm_source=itdadao&utm_medium=referral。
總結:
1.Location塊宣告時可以使用普通字元字首或者正則表達字元字首進行匹配。
2.普通字元字首前可以加等於號,進行精確匹配。(例:location = /test.html 表示精確匹配test,當一個頁面使用特別頻繁時使用,可以加快訪問速度)精確匹配完成後就會停止匹配。
3.普通匹配可以匹配到多個結果,所以先進行普通匹配,一旦匹配到並不會立即停止,會繼續匹配,然後進行正則匹配,若正則匹配到則立即停止,不會進行其他匹配,而是直接使用該結果。若正則匹配不到,則使用普通匹配程度最高的那個結果。
4.普通uri匹配是沒有順序的,而正則uri匹配是有順序的,從上至下,直至匹配到結果或全部匹配結束。
5.location後加 ~ 號表示uri中含有正則,並區分大小寫,~*表示包含正則但不不區分大小寫,^~”表示在普通uri前要求Nginx伺服器找到普通uri匹配度最高的那個location後,立即處理此請求,並不再進行正則匹配。
6.location的執行邏輯和location的編輯順序無關。
三、負載均衡配置
負載均衡實現的是將請求均勻的分配到多個伺服器上進行請求處理,減小單臺伺服器的壓力。
(1)在http全域性塊下配置upstream。(相當於一個均衡負載規則,通過該規則轉發給配置的伺服器)
http { # 這裡配置多個伺服器地址,負載均衡 upstream test { server 192.168.111.10:8666; server 192.168.111.11:8666; } server { listen 80; server_name www.test.com; location / { #負載均衡規則轉發 proxy_pass http://test; } }
(2)如果有多個環境,或者多個域名使用一個Nginx做反向代理,那麼所有的配置都配置主配置檔案上面,那麼後期排查很麻煩,我們可以將個環境配置檔案放置在/etc/nginx/conf.d/目錄下,或者自己自定義目錄,
1.配置多個域名訪問不同路徑下前端服務,可以寫在一個配置檔案裡面 ,也可以根據不同域名進行建立各自配置檔案
cd /etc/nginx/conf.d
vimwww.test.com.conf
server { server_name www.test.com test.com; listen 80; root /opt/project/test/; if ($host = 'test.com'){ rewrite ^/(.*)$ http://www.test.com/$1 permanent; # 配置當用戶訪問test.com域名時,自動跳轉到www.test.com這個域名上面
}
}
2.如果多個環境代理後端服務,配置如下(多個環境配置多個檔案即可)
server { listen 80; server_name api.test.com test.com ; error_page 500 502 503 504 /50x.html; error_page 404 /404.html; location /path/ { #include /etc/nginx/add-header.ini; proxy_pass http://192.168.111.10:10202/; } location /path1/ { #include /etc/nginx/add-header.ini; proxy_pass http://192.168.111.10:10203/; } # 如果後端配置Nginx支援webSocket加入後面相關引數 location /path3/ { #include /etc/nginx/add-header.ini; proxy_pass http://192.168.111.12:10204/; proxy_set_header Host $http_host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } }
(3)負載均衡的多種方式。
a.輪詢(預設),按請求時間順序分發到不互通伺服器上。如果伺服器宕機,則自動剔除。
b.權重(weight),根據權重大小分配請求(預設為1),伺服器權重越大,表示可處理的請求越多,接受的請求也越多,用於後端伺服器效能不均的情況。使用,在對應伺服器後加:weight = 權重值;
c.ip_hash,每個請求按訪問的ip的hash結果分配。這樣每個訪客將固定的訪問固定的後端伺服器,解決了session問題。在規則下加ip_hash;然後新增伺服器地址。
d.fair按後端伺服器的響應時間分配,優先最短響應時間分配。在伺服器地址後新增fair
(4)Nginx配置跨域問題:
1.跨域指的是瀏覽器不能執行其它網站的指令碼,它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript 施加的安全限制。
2.瀏覽器在執行指令碼的時候,都會檢查這個指令碼屬於哪個頁面,即檢查是否同源,只有同源的指令碼才會被執行;而非同源的指令碼在請求資料的時候,瀏覽器會報一個異常,提示拒絕訪問。
相關配置如下:
# 是否允許請求帶有驗證資訊 add_header Access-Control-Allow-Credentials true always; # 允許跨域訪問的域名,可以是一個域的列表,空格隔開,也可以是萬用字元*(不建議) add_header Access-Control-Allow-Origin '*' always; # 允許使用的請求方法,以逗號隔開,可以用 * add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE' always; # 預檢命令的快取,如果不快取每次會發送兩次請求,單位為秒。 # 第一次是瀏覽器使用OPTIONS方法發起一個預檢請求,第二次才是真正的非同步請求 add_header Access-Control-Max-Age 3600 always; # 允許指令碼訪問的返回頭 add_header Access-Control-Allow-Headers 'Access-Control-Allow-Origin,Content-Disposition,Authorization,x-requested-with,content-disposition,Cache-Control,Pragma,Content-Type,Token,Content-Type,Accept,content-type,request-id,user-id,app-id,requestId,request-code,lang,merchantName,language' always; # 允許自定義的頭部,以逗號隔開,大小寫不敏感 add_header Access-Control-Expose-Headers 'Content-Disposition,WWW-Authenticate,Server-Authorization' always; # OPTIONS類的請求,是跨域先驗請求 if ($request_method = 'OPTIONS') { return 204; # http狀態碼 204 (無內容) 伺服器成功處理了請求,但沒有返回任何內容。可以返回 200 } proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;