1 核心配置
找到 Nginx 安裝目錄下的 conf 目錄下 nginx.conf 文件,Nginx 的基本功能配置是由它提供的。 Nginx 的配置文件 (conf/nginx.conf) 整體上分為如下幾個(gè)部分::
全局塊 | 配置和 Nginx 運(yùn)行相關(guān)的全局配置 |
events 塊 | 配置和網(wǎng)絡(luò)鏈接相關(guān)的配置 |
http 塊 | 配置代理、緩存、日志記錄、虛擬主機(jī)等配置 |
server 塊 | 配置虛擬主機(jī)的相關(guān)參數(shù),一個(gè) http 快中可以有多個(gè) server 塊 |
location 塊 | 配置請(qǐng)求的路由,以及各種頁(yè)面的處理情況 |
區(qū)域 | 職責(zé) |
---|
1.2 配置文件示例
一個(gè)比較全的配置文件示例如下。
# 以下是全局段配置 #user administrator administrators; #配置用戶或者組,默認(rèn)為nobody nobody。 #worker_processes 2; #設(shè)置進(jìn)程數(shù),默認(rèn)為1 #pid /nginx/pid/nginx.pid; #指定nginx進(jìn)程運(yùn)行文件存放地址 error_log log/error.log debug; #制定日志路徑,級(jí)別:debug|info|notice|warn|error|crit|alert|emerg # events段配置信息 events { accept_mutex on; #設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認(rèn)為on multi_accept on; #設(shè)置一個(gè)進(jìn)程是否同時(shí)接受多個(gè)網(wǎng)絡(luò)連接,默認(rèn)為off #use epoll; #事件驅(qū)動(dòng)模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024; #最大連接數(shù),默認(rèn)為512 } # http、配置請(qǐng)求信息 http { include mime.types; #文件擴(kuò)展名與文件類型映射表 default_type application/octet-stream; #默認(rèn)文件類型,默認(rèn)為text/plain #access_log off; #取消服務(wù)日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式 access_log log/access.log myFormat; #combined為日志格式的默認(rèn)值 sendfile on; #允許sendfile方式傳輸文件,默認(rèn)為off,可以在http塊,server塊,location塊。 sendfile_max_chunk 100k; #每個(gè)進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值,默認(rèn)為0,即不設(shè)上限。 keepalive_timeout 65; #連接超時(shí)時(shí)間,默認(rèn)為75s,可以在http,server,location塊。 upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; #熱備 } error_page 404 https://www.baidu.com; #錯(cuò)誤頁(yè) # 第一個(gè)Server區(qū)塊開始,表示一個(gè)獨(dú)立的虛擬主機(jī)站點(diǎn) server { keepalive_requests 120; #單連接請(qǐng)求上限次數(shù)。 listen 4545; #監(jiān)聽端口 server_name 127.0.0.1; #監(jiān)聽地址 location ~*^.+$ { #請(qǐng)求的url過(guò)濾,正則匹配,~為區(qū)分大小寫,~*為不區(qū)分大小寫。 #root path; #根目錄 #index vv.txt; #設(shè)置默認(rèn)頁(yè) proxy_pass http://mysvr; #請(qǐng)求轉(zhuǎn)向mysvr 定義的服務(wù)器列表 deny 127.0.0.1; #拒絕的ip allow 172.18.5.54; #允許的ip } } }
1.3 locat 路徑映射講解
1.3.1 格式:
location [ = | ~ | ~* | !~ | !~* | @ ] uri {...}
1.3.2 解釋:
= 表示精確匹配,如果找到,立即停止搜索并立即處理此請(qǐng)求。 ~ 表示執(zhí)行一個(gè)正則匹配,區(qū)分大小寫匹配 ~* 表示執(zhí)行一個(gè)正則匹配,不區(qū)分大小寫匹配 !~ 區(qū)分大小寫不匹配 !~* 不區(qū)分大小寫不匹配 ^~ 即表示只匹配普通字符(空格)。使用前綴匹配,^ 表示 “非”,即不查詢正則表達(dá)式。如果匹配成功,則不再匹配其他 location。 @ 指定一個(gè)命名的 location,一般只用于內(nèi)部重定向請(qǐng)求。例如 error_page, try_files uri 是待匹配的請(qǐng)求字符串,可以不包含正則表達(dá)式,也可以包含正則表達(dá)式;
1.3.3 優(yōu)先級(jí)和示例:
[不加] < [~/~*] < [^~] < [=]
示例如下:
location = / { # 精確匹配/,主機(jī)名后面不能帶任何字符串 / # 只匹配http://abc.com # http://abc.com [匹配成功] # http://abc.com/index [匹配失敗] } location ^~ /img/ { #以 /img/ 開頭的請(qǐng)求,都會(huì)匹配上 #http://abc.com/img/a.jpg [成功] #http://abc.com/img/b.mp4 [成功] } location ~* /Example/ { # 則會(huì)忽略 uri 部分的大小寫 #http://abc.com/test/Example/ [匹配成功] #http://abc.com/example/ [匹配成功] } location /documents { # 如果有正則表達(dá)式可以匹配,則優(yōu)先匹配正則表達(dá)式。 #http://abc.com/documentsabc [匹配成功] } location / { #http://abc.com/abc [匹配成功] }
2 反向代理
2.1 反向代理概念:
反向代理 (Reverse Proxy) 是指以代理服務(wù)器來(lái)接受 internet 上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給 internet 上請(qǐng)求連接的客戶端。真實(shí)的服務(wù)器不能直接被外部網(wǎng)絡(luò)訪問(wèn),所以需要一臺(tái)代理服務(wù)器,而代理服務(wù)器能被外部網(wǎng)絡(luò)訪問(wèn)的同時(shí)又跟真實(shí)服務(wù)器在同一個(gè)網(wǎng)絡(luò)環(huán)境,當(dāng)然也可能是同一臺(tái)服務(wù)器,端口不同而已。 反向代理通過(guò) proxy_pass 指令來(lái)實(shí)現(xiàn)。
2.2 反向代理示例:
server { listen 80; server_name localhost; location / { proxy_pass http://localhost:8081; proxy_set_header Host $host:$server_port;#為請(qǐng)求頭添加Host字段,用于指定請(qǐng)求服務(wù)器的域名/IP地址和端口號(hào)。 # 設(shè)置用戶ip地址 proxy_set_header X-Forwarded-For $remote_addr;#為請(qǐng)求頭添加X(jué)FF字段,值為客戶端的IP地址。 # 當(dāng)請(qǐng)求服務(wù)器出錯(cuò)去尋找其他服務(wù)器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
當(dāng)我們?cè)L問(wèn) localhost 的時(shí)候,ngnix 就將我們的請(qǐng)求轉(zhuǎn)到 localhost:8081 了
3 負(fù)載均衡
3.1 負(fù)載均衡概念:
當(dāng)有 2 臺(tái)或以上服務(wù)器時(shí),代理服務(wù)器根據(jù)規(guī)則將請(qǐng)求分發(fā)到指定的服務(wù)器上處理。
3.2 負(fù)載均衡策略及示例:
Nginx 目前支持多種負(fù)載均衡策略,這里講解常用的 6 種。
3.2.1RR (round robin : 輪詢 默認(rèn)):
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,也就是說(shuō)第一次請(qǐng)求分配到第一臺(tái)服務(wù)器上,第二次請(qǐng)求分配到第二臺(tái)服務(wù)器上,如果只有兩臺(tái)服務(wù)器,第三次請(qǐng)求繼續(xù)分配到第一臺(tái)上,這樣循環(huán)輪詢下去,也就是服務(wù)器接收請(qǐng)求的比例是 1:1, 如果后端服務(wù)器 down 掉,能自動(dòng)剔除。輪詢是默認(rèn)配置,不需要太多的配置
同一個(gè)項(xiàng)目分別使用 8081 和 8082 端口啟動(dòng)項(xiàng)目
upstream web_servers { server localhost:8081; server localhost:8082; } server { listen 80; server_name localhost; #access_log logs/host.access.log main; location / { proxy_pass http://web_servers; proxy_set_header Host $host:$server_port; }
3.2.2 熱備:
假設(shè)有 2 臺(tái)服務(wù)器,當(dāng)一臺(tái)服務(wù)器發(fā)生事故時(shí),才啟用第二臺(tái)服務(wù)器給提供服務(wù)。服務(wù)器處理請(qǐng)求的順序:AAAAAA 突然 A 掛了,服務(wù)器處理請(qǐng)求的順序:BBBBBBBBBBBBBB.....
upstream web_servers { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; #熱備 }
3.2.3 權(quán)重
跟據(jù)配置的權(quán)重的大小而分發(fā)給不同服務(wù)器不同數(shù)量的請(qǐng)求。如果不設(shè)置,則默認(rèn)為 1。下面服務(wù)器的請(qǐng)求順序?yàn)椋篈BBABBABBABBABB....。
upstream web_servers { server localhost:8081 weight=1; server localhost:8082 weight=2; }
3.2.4 ip_hash
這樣每個(gè) ip 地址固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決 session 的問(wèn)題。
upstream test { ip_hash; server localhost:8080; server localhost:8081; }
3.2.5 fair (第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。這個(gè)配置是為了更快的給用戶響應(yīng)。
upstream backend { fair; server localhost:8080; server localhost:8081; }
3.2.6 url_hash (第三方)
按訪問(wèn) url 的 hash 結(jié)果來(lái)分配請(qǐng)求,使每個(gè) url 定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。在 upstream 中加入 hash 語(yǔ)句,hash_method 是使用的 hash 算法
upstream backend { hash_method crc32; hash $request_uri; server localhost:8080; server localhost:8081; }以上 6 種負(fù)載均衡各自適用不同情況下單獨(dú)或者混合使用,可以根據(jù)實(shí)際情況選擇使用,fair 和 url_hash 需要安裝第三方模塊才能使用。
4 動(dòng)靜分離:
4.1 動(dòng)靜分離概念:
動(dòng)靜分離是指在 web 服務(wù)器架構(gòu)中,將靜態(tài)頁(yè)面與動(dòng)態(tài)頁(yè)面或者靜態(tài)內(nèi)容接口和動(dòng)態(tài)內(nèi)容接口分開不同系統(tǒng)訪問(wèn)的架構(gòu)設(shè)計(jì)方法,進(jìn)而提升整個(gè)服務(wù)訪問(wèn)性能和可維護(hù)性。
4.2 動(dòng)靜分離示例:
upstream web_servers { server localhost:8081; server localhost:8082; } server { listen 80; server_name localhost; set $doc_root /usr/local/var/www; location ~* .(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ { root $doc_root/img; } location / { proxy_pass http://web_servers; proxy_set_header Host $host:$server_port; } error_page 500 502 503 504 /50x.html; #出現(xiàn) 500 502 503 504錯(cuò)誤時(shí)走內(nèi)部跳轉(zhuǎn) location = /50x.html { root $doc_root; } }結(jié)果:訪問(wèn) http://localhost/test.jpg 時(shí)直接返回 /usr/local/var/www/img 路徑下的圖片. 訪問(wèn) http://localhost/index.html 就會(huì)訪問(wèn)后端服務(wù)器 (tomcat 等)
5 其他常用的指令:
5.1.return 指令
返回 http 狀態(tài)碼和可選的第二個(gè)參數(shù)可以是重定向的 URL
return code [text]; return code URL; return URL; 例如: location / { return 404; # 直接返回狀態(tài)碼 } location / { return 404 "pages not found"; # 返回狀態(tài)碼 + 一段文本 } location / { return 302 /bbs ; # 返回狀態(tài)碼 + 重定向地址 } location / { return https://www.baidu.com ; # 返回重定向地址 }
5.2 rewrite 指令
重寫 URI 請(qǐng)求 rewrite,通過(guò)使用 rewrite 指令在請(qǐng)求處理期間多次修改請(qǐng)求 URI,該指令具有一個(gè)可選參數(shù)和兩個(gè)必需參數(shù)。 第一個(gè) (必需) 參數(shù)是請(qǐng)求 URI 必須匹配的正則表達(dá)式。 第二個(gè)參數(shù)是用于替換匹配 URI 的 URI。 可選的第三個(gè)參數(shù)重寫策略
last 重寫后的 URL 發(fā)起新請(qǐng)求,再次進(jìn)入 server 段,重試 location 的中的匹配;
break 直接使用重寫后的 URL ,不再匹配其它 location 中語(yǔ)句;
redirect 返回 302 臨時(shí)重定向;
permanent 返回 301 永久重定向;
location /users/ { rewrite ^/users/(.*)$ /show?user=$1 break; }
5.3 error_page 指令
使用 error_page 指令,您可以配置 NGINX 返回自定義頁(yè)面以及錯(cuò)誤代碼,替換響應(yīng)中的其他錯(cuò)誤代碼,或?qū)g覽器重定向到其他 URI。在以下示例中,error_page 指令指定要返回 404 頁(yè)面錯(cuò)誤代碼的頁(yè)面 (/404.html)。
server{ error_page 500 502 503 504 /50x.html; location =/50x.html{ root html; } }
5.4 日志
訪問(wèn)日志:需要開啟壓縮 gzip on; 否則不生成日志文件,打開 log_format、access_log 注釋
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 /usr/local/etc/nginx/logs/host.access.log main; gzip
5.5 deny 、allow 指令
#禁止訪問(wèn)某個(gè)目錄 location / { allow 192.168.0.0; allow 127.0.0.1; deny all; #這段配置值允許192.168.0./24網(wǎng)段和127.0.0.1的請(qǐng)求,其他來(lái)源IP全部拒絕。 }
5.6 內(nèi)置變量
nginx 的配置文件中可以使用的內(nèi)置變量以美元符 $ 開始。其中,大部分預(yù)定義的變量的值由客戶端發(fā)送攜帶。
$args :# 這個(gè)變量等于請(qǐng)求行中的參數(shù),同 $query_string
$content_length :請(qǐng)求頭中的 Content-length 字段。
$content_type :請(qǐng)求頭中的 Content-Type 字段。
$document_root :當(dāng)前請(qǐng)求在 root 指令中指定的值。
$host :請(qǐng)求行的主機(jī)名,為空則為請(qǐng)求頭字段 Host 中的主機(jī)名,再為空則與請(qǐng)求匹配的 server_name
$http_user_agent :客戶端 agent 信息
$http_cookie :客戶端 cookie 信息
$limit_rate :這個(gè)變量可以限制連接速率。
$request_method :客戶端請(qǐng)求的動(dòng)作,通常為 GET 或 POST。
$remote_addr :客戶端的 IP 地址。
$remote_port :客戶端的端口。
$remote_user :已經(jīng)經(jīng)過(guò) Auth Basic Module 驗(yàn)證的用戶名。
$request_filename :當(dāng)前請(qǐng)求的文件路徑,由 root 或 alias 指令與 URI 請(qǐng)求生成。
$scheme :HTTP 方法(如 http,https)。
$server_protocol :請(qǐng)求使用的協(xié)議,通常是 HTTP/1.0 或 HTTP/1.1。
$server_addr :服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個(gè)值。
$server_name :服務(wù)器名稱。
$server_port :請(qǐng)求到達(dá)服務(wù)器的端口號(hào)。
$request_uri :包含請(qǐng)求參數(shù)的原始 URI,不包含主機(jī)名,如:”/foo/bar.php?arg=baz”。
$uri :不帶請(qǐng)求參數(shù)的當(dāng)前 URI,$uri 不包含主機(jī)名,如”/foo/bar.html”。
$document_uri :與 $uri 相同
6 總結(jié)
Ngnix 是一款高性能反向代理服務(wù)器,學(xué)習(xí)它非常有必要,本文講解了 Ngnix 核心配置,介紹了反向代理,負(fù)載均衡,動(dòng)靜分離三大功能,最后擴(kuò)展了一些常用的指令。本文介紹了 Ngnix 的基礎(chǔ)用法,后續(xù)的 Ngnix 內(nèi)核以及原理部分有待研究。
審核編輯:劉清
-
HTTP協(xié)議
+關(guān)注
關(guān)注
0文章
61瀏覽量
9695 -
Hash算法
+關(guān)注
關(guān)注
0文章
43瀏覽量
7379 -
nginx
+關(guān)注
關(guān)注
0文章
142瀏覽量
12154
原文標(biāo)題:Nginx常用配置及和基本功能講解
文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論