Nginx總結
-1.前言
之前一直咕掉了, 這次把許多優質內容總結下,許多來自其他大佬的文章,底部有文章鏈接,
- 反向代理
- 負載均衡
- 動靜分離
0.基本介紹
1.Web 服務器:
相比 Apache,Nginx 使用更少的資源,支持更多的并發連接,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎,能夠支持高達 50,000 個并發連接數的回應,感謝 Nginx 為我們選擇了 epoll and kqueue 作為開發模型.
2.負載均衡服務器
支持作為 HTTP代理服務器對外進行服務,Nginx用C撰寫,不論是系統資源開銷還是 CPU 使用效率都比 Perlbal 要好的多,
3.作為郵件代理服務器
Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作為郵件代理服務器),Last.fm 描述了成功并且美妙的使用經驗.
4.優勢
安裝非常的簡單,組態檔 非常簡潔(還能夠支持perl語法),Bugs非常少的服務器, Nginx 啟動特別容易,并且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動,你還能夠在 不間斷服務的情況下進行軟體版本的升級,
1.基礎內容
nginx #啟動nginx
nginx -s reload #根據最新配置重啟nginx
nginx -s stop #立即停止nginx
nginx -s quit #安全退出
nginx -c /特定目錄/nginx.conf #以指定配置啟動nginx
nginx -t #檢查配置是否正確
nginx -t -c /特定目錄/nginx.conf #檢查特定配置是否正確
nginx -v #查看版本資訊
Nginx默認的組態檔主要有 main、events、http、server、location 五個塊組成,其中 http 、server、location 屬于嵌套關系,
- main:主要控制Nginx子行程所屬的用戶和用戶組、派生子行程數、錯誤日志位置與級別、pid位置、子行程優先級、行程對應cpu、行程能夠打開的檔案描述符數目等,
- events:控制Nginx處理連接的方式,
- http:Nginx處理http請求的主要配置塊,
- server:Nginx中主機配置塊,可用于配置多個虛擬主機,
- location:server中對應目錄級別的控制塊,可以有多個,
(0)關于nginx配置的一些說明
| 陳述句 | 說明 |
|---|---|
| user nginx nginx ; | Nginx用戶及組:用戶 組,window下不指定 |
| worker_processes 8; | 作業行程:數目,根據硬體調整,通常等于CPU數量或者2倍于CPU, |
| error_log logs/error.log; | 錯誤日志:存放路徑, |
| pid logs/nginx.pid; | pid(行程識別符號):存放路徑, |
| worker_rlimit_nofile 204800; | 指定行程可以打開的最大描述符:數目,現在在linux 2.6內核下開啟檔案打開數為65535,worker_rlimit_nofile就相應應該填寫65535, |
| use epoll; | 使用epoll的I/O 模型,linux建議epoll,FreeBSD建議采用kqueue,window下不指定, |
| worker_connections 204800; | 沒個作業行程的最大連接數量,根據硬體調整,和前面作業行程配合起來用,盡量大,但是別把cpu跑到100%就行,每個行程允許的最多連接數,理論上每臺nginx服務器的最大連接數為,worker_processes*worker_connections |
| keepalive_timeout 60; | keepalive超時時間, |
| client_header_buffer_size 4k; | 客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設定,一般一個請求頭的大小不會超過1k,不過由于一般系統分頁都要大于1k,所以這里設定為分頁大小, |
| include mime.types; | 設定mime型別,型別由mime.type檔案定義 |

? 通常web服務器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_add$拿到的IP地址是反向代理服務器的iP地址,反向代理服務器在轉發請求的http頭資訊中,可以增加x_forwarded_for資訊,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址,
#運行用戶
user nobody;
#作業行程數
worker_processes 1;
#全域錯誤日志及PID檔案
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#作業模式及連接數上限
events {
#epoll是多路復用IO(I/O Multiplexing)中的一種方式,
#僅用于linux2.6以上內核,可以大大提高nginx的性能
use epoll;
#單個后臺worker process行程的最大并發鏈接數
worker_connections 1024;
}
http {
#設定mime型別,型別由mime.type檔案定義
include mime.types;
default_type application/octet-stream;
#設定日志輸出模板
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;
#sendfile 指令指定 nginx 是否呼叫 sendfile 函式(zero copy 方式)來輸出檔案,
#對于普通應用,必須設為 on,
#如果用來進行下載等應用磁盤IO重負載應用,可設定為 off,
#以平衡磁盤與網路I/O處理速度,降低系統的uptime.
sendfile on;
#tcp_nopush on;
#連接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#開啟gzip壓縮
gzip on;
gzip_disable "MSIE [1-6].";
#設定請求緩沖
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#設定虛擬主機配置
server {
#偵聽80埠
listen 80;
#定義使用 www.nginx.cn訪問
server_name www.nginx.cn;
#定義服務器的默認網站根目錄位置
root html;
#設定本虛擬主機的訪問日志
access_log logs/nginx.access.log main;
#默認請求
location / {
#定義首頁索引檔案的名稱
index index.php index.html index.htm;
}
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#靜態檔案,nginx自己處理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#過期30天,靜態檔案不怎么更新,過期可以設大一點,
#如果頻繁更新,則可以設定得小一點,
expires 30d;
}
#PHP 腳本請求全部轉發到 FastCGI處理. 使用FastCGI默認配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止訪問 .htxxx 檔案
location ~ /.ht {
deny all;
}
}
}
?
(1)關于location
? 其中location根據不同前綴的使用方式,大致分為普通location和正則location,多個正則location之間會按照先后順序進行匹配,匹配成功后,就不會繼續匹配后面定義的location,多個普通location之間遵循“最大匹配原則”,匹配度最高的location將會被執行,同時也可以利用 =精準匹配和 ^~非正則匹配可以在正則匹配之前優先匹配,禁止執行原有的正則匹配,因此 當多種型別的 location 匹配同時出現時,最終執行結果為“= ”匹配優先于"~"匹配,“~”匹配優先于正則匹配,正則匹配優先于普通的最大前綴匹配 只要優先的location 匹配成功,就不會執行其他的location ,
? location指令的作用是根據用戶請求的URI來執行不同的應用,也就是根據用戶請求的網站URL進行匹配,匹配成功即進行相關的操作,
即:此模塊專門將請求導向其他服務,
語法

1.精確匹配
location = / {
#精確匹配訪問網站根目錄
}
location = /login {
#精確匹配http://xxx.com/login
}
2. ^~ 表示以什么打頭,關鍵在于正則的開頭符 ^
location ^~ /static/ {
#以/static打頭,比如 http://xxx.com/static/jQuery.js
}
3. 正則匹配(~ 區分大小寫的正則, ~* 不區分大小的正則)
location ~ \.png {
#以png結尾,比如比如 http://xxx.com/img/a.png
}
location ~* \.png$ {
#以png或者PNG或者Png等等結尾,比如比如 http://xxx.com/img/a.pNg,如果是png結尾,會優先匹配上面一條,
}
4.排除法的正則,同樣區分大小寫優先于不區分大小寫
location !~ \.png$ {
#匹配“以png結尾”失敗,進入location,那就情況多了去了,只要不以png結尾就行
}
location !~* \.xhtml$ {
#匹配“以png或者PNG或者PnG等等”結尾失敗,進入location,那情況也多了去了,只要不是PNG的各種大小寫變體就行
}
5. 通用匹配
location / {
#用來兜底的,當前面其他所有的規則都不滿足條件,就歸入這個通用的
}

總結就是如果 p r o x y _ p a s s proxy\_pass proxy_pass 結尾加上 / / /則是絕對根路徑,不會把匹配的路徑部分帶走,否則會帶走,
(2)緩沖
nginx也提供了緩沖的機制,用于提高性能,沒有緩沖的情況下,資料直接從后端服務器發送給客戶端,緩沖的作用是在nginx上臨時存盤來自后端服務器的處理結果,從而可以提早關閉nginx到后端的連接,減少IO的損耗,一般內容存放在記憶體當中,但當內容過多,造成的記憶體不夠時,會把內容存放在臨時檔案目錄下,
(3)nginx配置多個組態檔
? 需要在server中加:include config/*.conf;
(4)跨域
? 跨域請求就是指:當前發起請求的域與該請求指向的資源所在的域不一樣,這里的域指的是這樣的一個概念:我們認為若協議 + 域名 + 埠號均相同,那么就是同域,
2.反向代理
? 對于一個大型網站來說,隨著網站訪問量的快速增長,單臺服務器已經無法承擔大量用戶的并發訪問,必須以增加服務器的方式,提高計算機系統的處理能力,計算速度,進而滿足當前業務量的需求,那么如何實作服務器之間的協同功能呢?Nginx提供的反向代理和負載均衡功能是一個很好的解決方案,
? nginx的代理程序,就是將請求發送給nginx,然后將請求轉發給后端服務器,后端服務器處理完畢之后將結果再發給nginx,nginx再把結果發送給客戶端,后端服務器可在遠程也可在本地,也可以是nginx服務器內部定義的其他虛擬主機,這些接收nginx轉發的服務器被稱為上游(upstream)使用nginx做代理的目的之一是擴展基礎架構的規模,nginx可以處理大量并發連接,請求到來后,nginx可將其轉發給任意數量的后臺服務器進行處理,這等于將負載均衡分散到整個集群,
在Nginx服務器中,反向代理的配置非常簡單,最主要的指令就是“proxy_pass”,用于設定后端服務器的地址,
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:9000;
}
}
3.負載均衡
負載均衡就是將負載分攤到多個操作單元上執行,從而提高服務的可用性和回應速度,帶給用戶更好的體驗,
Nginx默認支持輪詢、權重、ip Hash等多種負載均衡策略,
- 輪詢:默認設定方式,每個請求按時間順序逐一分配到不同的后端服務器進行處理,可以自動剔除宕機服務器,
- 權重方式:利用weight指定輪詢的權重比率,用于后端服務器性能不均的情況,
- ip_hash方式:每個請求按照IP的hash結果分配,這樣可以讓每個訪客每次請求都訪問同一個后端服務器,可以解決session共享的問題,
- 第三方模塊:fair或url_hash等策略,nginx本身不包含該實作,需要下載對應的軟體包,
客戶端訪問nginx的時候,只需要配置一個ip和一個埠,nginx幫助我們把請求轉發不同的后臺服務中,
如上配置 所有 http://localhost:80的請求都會被轉發到http://localhost:9000,

輪詢配置
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web_server;
}
}
#配置負載均衡服務器組 輪詢方式
upstream web_server
{
server 192.168.78.128;
server 192.168.78.129;
}
權重方式配置
upstream web_server1
{
server 192.168.78.128 weight=1;
server 192.168.78.129 weight=3;
}
upstream web_server2
{
server 192.168.78.128 weight=1 max_fails=1 fail_timeout=2;
server 192.168.78.129 weight=3;
server 192.168.78.130 backup;
}
按上圖web_server1配置后,3/4的流量會轉發到192.168.78.129的服務器上,1/4的流量會轉發到192.168.78.128的服務器上,web_server2的配置表示 nginx在2s內發現后端服務例外達到max_fails次,就將該服務器標記為不可用,backup標記為預留的備份機器,當上面上個服務都宕機時,會將流量轉發到備份機器,
IP Hash方式
upstream web_server1
{
ip_hash;
server 192.168.78.128;
server 192.168.78.129;
server 192.168.78.130 down;
}
down引數可以將服務器標記為下線狀態,在路由分配時,會忽略該服務器,
參考文章
傳送門1
傳送門2
傳送門3
傳送門4
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290222.html
標籤:其他
上一篇:vue打包踩坑個人記錄
