nginx全部知識(讓你窮光蛋秒變負二代,Come on!)
其實吧,有時候很多東西在日常工作中不肯接觸,所以就會忘得特別的快,工作中剛有需要,嚇得我趕緊撿起來,檔案內容比較長,想有點進步,請耐心看
今天主要記錄下Nginx的這幾個方面:
- 《原理 》關於反向代理和正向代理和負載均衡
- 《瞭解》常用Web伺服器介紹
- 《瞭解》Nginx、Apache、Tomcat之間的區別以及聯絡
- 《瞭解》Nginx安裝部署
- 《重要》Nginx核心配置分析
- 《熟練》虛擬主機的配置
- 《熟練》Location匹配規則剖析Rewrite的使用
- 《熟練》關於Nginx日誌配置和及切割處理
- 《瞭解》快取配置及Gzip配置 10.《重要》負載均衡配置說明 11.《原理》《重要》Nginx的程序模型 12.《瞭解》Nginx+keepalived
《原理》關於反向代理和負載均衡
說到代理,很多人都會有疑問,為什麼會有代理,換句話說也就是代理的好處。 現在微信活的不要不要的,很多商人都會發展下線,邀請很多人加盟,這些人也就是所謂的代理(好處:人多力量大,賺錢更快),既然這樣,我們的伺服器代理又會有什麼好處呢?
- 提高訪問效率
你訪問的目標伺服器會存在代理伺服器中,這樣就能夠起到瀏覽器的快取作用,下次訪問效率更高
- 突破訪問限制
就比如你要訪問國外的谷歌或者一些其他翻牆的軟體
- 更加安全
可以給直接訪問的使用者隱藏自己的IP,也可以過濾一些不太友好的訪問
a)正向代理:
既然聊到了反向代理,我們就先了解正向代理。(那生活中的例子說事) 一個女生A喜歡梵蒂岡口紅,但是她並不知道那個廠C商購買,有一天啊,她發現了朋友圈中有一個做微商的B,然後他就直接去找B這個人。 (本來A是去找C的,但是找不到C,找到了B,B在這裡就擔任的是代理的角色)
b).反向代理:
拿我公司的情況說事吧(中國銀聯) 公司有三臺伺服器,然後比如說啊,我和同事需要訪問中國銀聯的時候,有四臺伺服器,誰也不能確定訪問的是那臺伺服器(上圖說話)
main:用於進行nginx全域性資訊的配置
events:用於nginx工作模式的配置
http:用於進行http協議資訊的一些配置
server:用於進行伺服器訪問資訊的配置
location:用於進行訪問路由的配置
upstream:用於進行負載均衡的配置
當你需要重啟nginx的時候,可以先執行./nginx -t (檢驗你的語法是否錯誤的)
正向代理和反向代理的區別: a).正向代理主要是針對客戶端的,反向代理主要是針對伺服器端的 b).反向代理能夠實現高併發,以減少伺服器的壓力 c).正向代理是夠對目標伺服器隱藏資訊,反向代理能夠隱藏客戶不知道訪問的是那臺伺服器(這樣說 有點不太合適感覺)
c).負載均衡
負載均衡是建立在反向代理基礎之上的,他最大的作用就是為了減輕伺服器的訪問壓力。
常見的方法都有:
weight(權重)
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。如下所示,10.0.0.88的訪問比率要比10.0.0.77的訪問比率高一倍。
upstream linuxidc{ server 10.0.0.77 weight=5; server 10.0.0.88 weight=10; }
ip_hash(訪問ip)
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
upstream favresin{ ip_hash; server 10.0.0.10:8080; server 10.0.0.11:8080; }
fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。與weight分配策略類似。
upstream favresin{ server 10.0.0.10:8080; server 10.0.0.11:8080; fair; }
url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。
注意:在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法。
upstream resinserver{ server 10.0.0.10:7777; server 10.0.0.11:8888; hash $request_uri; hash_method crc32; }
upstream還可以為每個裝置設定狀態值,這些狀態值的含義分別如下:
down 表示單前的server暫時不參與負載.
weight 預設為1.weight越大,負載的權重就越大。
max_fails :允許請求失敗的次數預設為1.當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤.
fail_timeout : max_fails次失敗後,暫停的時間。
backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
upstream bakend{ #定義負載均衡裝置的Ip及裝置狀態 ip_hash; server 10.0.0.11:9090 down; server 10.0.0.11:8080 weight=2; server 10.0.0.11:6060; server 10.0.0.11:7070 backup; }
二.常見的Web伺服器 對於我來說常見的有tomcat,nginx,Apache,Jetty等等其他的(weblogic,jboss,沒有用過) 他們之間的區別以及聯絡又是什麼呢?
我總結為如下: tomcat作為的是作為的是servlet容器,而nginx和Apache作為的是http server比對下nginx和apache之間的區別以及聯絡:
Nginx
- 輕量級,採用 C 進行編寫,同樣的 web 服務,會佔用更少的記憶體及資源
- 抗併發,nginx 以 epoll and kqueue 作為開發模型,處理請求是非同步非阻塞的,負載能力比 apache 高很多,而 apache 則是阻塞型的。在高併發下 nginx 能保持低資源低消耗高效能 ,而 apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現程序數飆升,從而拒絕服務的現象。
- nginx 處理靜態檔案好,靜態處理效能比 apache 高三倍以上
- nginx 的設計高度模組化,編寫模組相對簡單
- nginx 配置簡潔,正則配置讓很多事情變得簡單,而且改完配置能使用 -t 測試配置有沒有問題,apache 配置複雜 ,重啟的時候發現配置出錯了,會很崩潰
- nginx 作為負載均衡伺服器,支援 7 層負載均衡
- nginx 本身就是一個反向代理伺服器,而且可以作為非常優秀的郵件代理伺服器
- 啟動特別容易, 並且幾乎可以做到 7*24 不間斷執行,即使執行數個月也不需要重新啟動,還能夠不間斷服務的情況下進行軟體版本的升級
- 社群活躍,各種高效能模組出品迅速
Apache
- apache 的 rewrite 比 nginx 強大,在 rewrite 頻繁的情況下,用 apache
- apache 發展到現在,模組超多,基本想到的都可以找到
- apache 更為成熟,少 bug ,nginx 的 bug 相對較多
- apache 超穩定
- apache 對 PHP 支援比較簡單,nginx 需要配合其他後端用
- apache 在處理動態請求有優勢,nginx 在這方面是雞肋,一般動態請求要 apache 去做,nginx 適合靜態和反向。
- apache 仍然是目前的主流,擁有豐富的特性,成熟的技術和開發社群
三.Nginx下載以及配置
我們從官網下載穩定版本的nginx,http://nginx.org/,當前的穩定版本是nginx-1.12.2,我們下載nginx-1.12.2.tar.gz,並上傳到linux伺服器上面。
然後解壓nginx原始碼包
tar -xvzf nginx-1.12.2.tar.gz
解壓後進入nginx目錄,
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
–prefix指定安裝目錄/usr/local/nginx,–with-http_stub_status_module:支援nginx狀態查詢, –with-http_ssl_module:支援https,–with-XXX表示啟用某個功能模組,–without-XXX則表示禁用某個功能模組。
然後編譯安裝
make
make install
完成安裝後進入/usr/local/nginx/sbin目錄,啟動nginx
[rootUAT-OW-WEB-02 sbin sbin]# ./nginx -c
以下幾條命令是常用的 停止nginx
./nginx -s stop
重啟nginx
./nginx -s reopen
檢查nginx.conf配置檔案的正確性
./nginx -t
重新載入配置檔案
./nginx -s reload
檢視nginx命令
ps -ef | grep nginx
Nginx虛擬配置:
注意:首先需要C:\Windows\System32\drivers\etc配置下host 虛擬主機配置最主要的兩種方法: a)基於域名(我們目前使用的方法) b).基於埠
關於location和rewrite語法:
a)關於location
location ~* /js/.*/\.js
以 = 開頭,表示精確匹配;如只匹配根目錄結尾的請求,後面不能帶任何字串。
以^~ 開頭,表示uri以某個常規字串開頭,不是正則匹配
以~ 開頭,表示區分大小寫的正則匹配;
以~* 開頭,表示不區分大小寫的正則匹配
以/ 開頭,通用匹配, 如果沒有其它匹配,任何請求都會匹配到
關於Location 後邊加"/“和不加”/"的區別
首先是location進行的是模糊匹配 比如要訪問的是localhost:8080/abc/def下邊的目錄 a).不加“/”的時候,還以訪問defg,/defgh,/defghi 等等 b).加"/"的時候,只能訪問的的是abc/def/anything路徑
location匹配原則:
關於rewrite匹配規則:
rewrite功能就是使用nginx提供的全域性變數或自己設定的變數,結合正則表示式和標誌位實現url重寫以及重定向。
《瞭解》關於Nginx日誌配置和及切割處理
主要兩種方式:
log_format: access_log: 日誌級別:debug|info|notice|warn|error|crit|alert|emerg
《瞭解》快取配置及Gzip配置
這兩個配置都是為了提高訪問效率的,GZip主要是針對一些比較大的圖片進行壓縮。
# 開啟gzip
gzip on;
# 啟用gzip壓縮的最小檔案,小於設定值的檔案將不會壓縮
gzip_min_length 1k;
# gzip 壓縮級別,1-10,數字越大壓縮的越好,也越佔用CPU時間,後面會有詳細說明
gzip_comp_level 2;
# 進行壓縮的檔案型別。javascript有多種形式。其中的值可以在 mime.types 檔案中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml;
# 是否在http header中新增Vary: Accept-Encoding,建議開啟
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
# 開啟快取
location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
access_log off;
expires 30d;
}
注意點:
- 圖片、mp3這樣的二進位制檔案,沒必要做壓縮處理,因為這類檔案壓縮比很小,壓縮過程會耗費CPU資源
- 太小的檔案沒必要壓縮,因為壓縮以後會增加一些頭資訊,反而導致檔案變大
- Nginx預設只對text/html進行壓縮 ,如果要對html之外的內容進行壓縮傳輸,我們需要手動來配置
《重要》負載均衡配置說明
貼一段程式碼:至於什麼作用我就不一一說明了
#######注意:每個結束的地方都必須有分號#######
#user administrator administrators; #配置使用者或者組,預設為nobody nobody。
#worker_processes 2; #允許生成的程序數,預設為1
#pid /nginx/pid/nginx.pid; #指定nginx程序執行檔案存放地址
error_log log/error.log debug; #制定日誌路徑,級別。這個設定可以放入全域性塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #設定網路連線序列化,防止驚群現象發生,預設為on
multi_accept on; #設定一個程序是否同時接受多個網路連線,預設為off
#use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大連線數,預設為512
}
http {
include mime.types; #副檔名與檔案型別對映表
default_type application/octet-stream; #預設檔案型別,預設為text/plain
#access_log off; #取消服務日誌
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為日誌格式的預設值
sendfile on; #允許sendfile方式傳輸檔案,預設為off,可以在http塊,server塊,location塊。
sendfile_max_chunk 100k; #每個程序每次呼叫傳輸數量不能大於設定的值,預設為0,即不設上限。
keepalive_timeout 65; #連線超時時間,預設為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; #錯誤頁
server {
keepalive_requests 120; #單連線請求上限次數。
listen 4545; #監聽埠
server_name 127.0.0.1; #監聽地址
location ~*^.+$ { #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。
#root path; #根目錄
#index vv.txt; #設定預設頁
proxy_pass http://mysvr; #請求轉向mysvr 定義的伺服器列表
deny 127.0.0.1; #拒絕的ip
allow 172.18.5.54; #允許的ip
}
}
}
《原理》《重要》Nginx的程序模型
master程序:
充當整個程序組與使用者的互動介面,同時對程序進行監護。它不需要處理網路事件,不負責業務的執行,只會通過管理work程序來實現重啟服務、平滑升級、更換日誌檔案、配置檔案實時生效等功能。主要是用來管理worker程序
- 接收來自外界的訊號 (前面提到的 kill -HUP 訊號等) 我們要控制nginx,只需要通過kill向master程序傳送訊號就行了。比如kill -HUP pid,則是告訴nginx,從容地重啟nginx,我們一般用這個訊號來重啟nginx,或重新載入配置,因為是從容地重啟,因此服務是不中斷的。master程序在接收到HUP訊號後是怎麼做的呢?首先master程序在接到訊號後,會先重新載入配置檔案,然後再啟動新的worker程序,並向所有老的worker程序傳送訊號,告訴他們可以光榮退休了。新的worker在啟動後,就開始接收新的請求,而老的worker在收到來自master的訊號後,就不再接收新的請求,並且在當前程序中的所有未處理完的請求處理完成後,再退出
- 向各個worker程序傳送訊號
- 監控worker程序的執行狀態
- 當worker程序退出後(異常情況下),會自動重新啟動新的worker程序
worker程序:
woker程序主要用來處理網路事件,各個woker程序之間是對等且相互獨立的,它們同等競爭來自客戶端的請求,一個請求只可能在一個woker程序中處理,woker程序個數一般設定為機器CPU核數。
《瞭解》Nginx+keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtp.hysec.com
smtp_connection_timeout 30
router_id nginx_master # 設定nginx master的id,在一個網路應該是唯一的
}
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #最後手動執行下此指令碼,以確保此指令碼能夠正常執行
interval 2 #(檢測指令碼執行的間隔,單位是秒)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER為主,BACKUP為備
interface eth0 # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡)
virtual_router_id 66 # 虛擬路由編號,主從要一直
priority 100 # 優先順序,數值越大,獲取處理請求的優先順序越高
advert_int 1 # 檢查間隔,預設為1s(vrrp組播週期秒數)
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(呼叫檢測指令碼)
}
virtual_ipaddress {
192.168.0.200 # 定義虛擬ip(VIP),可多設,每行一個
}
}
幸運也好,努力也罷,默默無聞又怎樣,這都是我們每個人不同的抉擇。 經歷過好幾天的加班,給總結出來的,雖然眼睛卻是很累,但是慢慢的,我想我會堅持慢慢來寫的,就算是自己的學習成果罷了,好好加油。
文章來源網路,版權歸作者本人所有,如侵犯到原作者權益,請與我們聯絡刪除或授權事宜如果有誤,請聯絡作者更改,謝謝,本人微信:void666666