Nginx基本概念
什么是Nginx
Nginx是一個高性能的HTTP和反向代理web服務器,特點是占有記憶體少,并發能力強,有報告表明能支持高達50000個并發連接數,
正向代理
是一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容回傳給客戶端,客戶端才能使用正向代理,

反向代理
反向代理服務器位于用戶與目標服務器之間,但是對于用戶而言,反向代理服務器就相當于目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源,同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定,反向代理服務器通常可用來作為Web加速,即使用反向代理作為Web服務器的前置機來降低網路和服務器的負載,提高訪問效率,

負載均衡
Load balancing,即負載均衡,是一種計算機技術,用來在多個計算機(計算機集群)、網路連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化回應時間、同時避免過載的目的,

動靜分離

安裝Nginx
-
安裝依賴包
1 yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel - 下載Nginx穩定版
1 wget http://nginx.org/download/nginx-1.18.0.tar.gz - 解壓、編譯、安裝
1 # 解壓 2 tar -zxvf nginx-1.18.0.tar.gz 3 4 # 進入解壓好的檔案 5 cd nginx-1.18.0/ 6 7 # 編譯 8 ./configure --prefix=/usr/local/nginx 9 10 # 安裝 11 make && make install
- 開放Linux對外網訪問的80埠
1 /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT - Nginx服務的啟動操作
1 ##### 啟動方式二選一 ##### 2 3 # 默認組態檔啟動 4 cd /usr/local/nginx/sbin 5 ./nginx 6 7 # 指定組態檔啟動 8 ./nginx -c /usr/local/nginx/conf/nginx.conf
- 驗證
1 http://公網ip/
Nginx常用命令
使用Nginx操作命令前提條件:必須進入到Nginx的目錄 /usr/local/nginx/sbin ,
| 作用 | 命令 |
| 查看nginx版本 | ./nginx -v |
| 啟動nginx | ./nginx |
| 關閉nginx | ./nginx -s stop |
| 重新加載nginx | ./nginx -s reload |
Nginx組態檔
組態檔的位置
/usr/local/nginx/conf/nginx.conf
組態檔的結構
1 ... #全域塊 2 3 events { #events塊 4 ... 5 } 6 7 http #http塊 8 { 9 ... #http全域塊 10 server #server塊 11 { 12 ... #server全域塊 13 location [PATTERN] #location塊 14 { 15 ... 16 } 17 location [PATTERN] 18 { 19 ... 20 } 21 } 22 server 23 { 24 ... 25 } 26 ... #http全域塊 27 }
- 全域塊:配置影響nginx全域的指令,一般有運行nginx服務器的用戶組,nginx行程pid存放路徑,日志存放路徑,組態檔引入,允許生成worker process數等,
- events塊:配置影響nginx服務器或與用戶的網路連接,有每個行程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網路連接序列化等,
- http塊:可以嵌套多個server,配置代理,快取,日志定義等絕大多數功能和第三方模塊的配置,如檔案引入,mime-type定義,日志自定義,是否使用sendfile傳輸檔案,連接超時時間,單連接請求數等,
- server塊:配置虛擬主機的相關引數,一個http中可以有多個server,
- location塊:配置請求的路由,以及各種頁面的處理情況,
組態檔詳解
1 ########### 每個指令必須有分號結束,################# 2 #user administrator administrators; #配置用戶或者組,默認為nobody nobody, 3 #worker_processes 2; #允許生成的行程數,默認為1 4 #pid /nginx/pid/nginx.pid; #指定nginx行程運行檔案存放地址 5 error_log log/error.log debug; #制定日志路徑,級別,這個設定可以放入全域塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg 6 events { 7 accept_mutex on; #設定網路連接序列化,防止驚群現象發生,默認為on 8 multi_accept on; #設定一個行程是否同時接受多個網路連接,默認為off 9 #use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport 10 worker_connections 1024; #最大連接數,默認為512 11 } 12 http { 13 include mime.types; #檔案擴展名與檔案型別映射表 14 default_type application/octet-stream; #默認檔案型別,默認為text/plain 15 #access_log off; #取消服務日志 16 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式 17 access_log log/access.log myFormat; #combined為日志格式的默認值 18 sendfile on; #允許sendfile方式傳輸檔案,默認為off,可以在http塊,server塊,location塊, 19 sendfile_max_chunk 100k; #每個行程每次呼叫傳輸數量不能大于設定的值,默認為0,即不設上限, 20 keepalive_timeout 65; #連接超時時間,默認為75s,可以在http,server,location塊, 21 22 upstream mysvr { 23 server 127.0.0.1:7878; 24 server 192.168.10.121:3333 backup; #熱備 25 } 26 error_page 404 https://www.baidu.com; #錯誤頁 27 server { 28 keepalive_requests 120; #單連接請求上限次數, 29 listen 4545; #監聽埠 30 server_name 127.0.0.1; #監聽地址 31 location ~*^.+$ { #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫, 32 #root path; #根目錄 33 #index vv.txt; #設定默認頁 34 proxy_pass http://mysvr; #請求轉向mysvr 定義的服務器串列 35 deny 127.0.0.1; #拒絕的ip 36 allow 172.18.5.54; #允許的ip 37 } 38 } 39 }
Nginx配置反向代理
方式一
只替換域名
1 upstream domain { 2 server localhost:8080 weight=5; 3 } 4 5 server { 6 listen 80; 7 server_name test.com; 8 access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main; 9 location / { 10 proxy_set_header Host $host; 11 proxy_set_header X-Real-IP $remote_addr; 12 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 13 proxy_set_header X-NginX-Proxy true; 14 proxy_pass http://domain; 15 } 16 }
方式二
帶前綴訪問
1 upstream prod { 2 server localhost:8081 weight=5; 3 } 4 upstream user { 5 server localhost:8082 weight=5; 6 } 7 8 server { 9 listen 80; 10 server_name test.com; 11 access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main; 12 location ^~/prod/ { 13 proxy_set_header Host $host; 14 proxy_set_header X-Real-IP $remote_addr; 15 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 16 proxy_set_header X-NginX-Proxy true; 17 proxy_pass http://prod/; 18 } 19 location ^~/user/ { 20 proxy_set_header Host $host; 21 proxy_set_header X-Real-IP $remote_addr; 22 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 23 proxy_set_header X-NginX-Proxy true; 24 proxy_pass http://user/; 25 } 26 27 }
方式三
rewrite重寫URL
1 upstream prod { 2 server localhost:8081 weight=5; 3 } 4 upstream user { 5 server localhost:8082 weight=5; 6 } 7 8 server { 9 listen 80; 10 server_name test.com; 11 access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main; 12 location ^~/prod/ { 13 proxy_set_header Host $host; 14 proxy_set_header X-Real-IP $remote_addr; 15 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 16 proxy_set_header X-NginX-Proxy true; 17 rewrite ^/prod/(.*)$ /$1 break; 18 proxy_pass http://prod; 19 } 20 location ^~/user/ { 21 proxy_set_header Host $host; 22 proxy_set_header X-Real-IP $remote_addr; 23 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 24 proxy_set_header X-NginX-Proxy true; 25 rewrite ^/user/(.*)$ /$1 break; 26 proxy_pass http://user; 27 } 28 }
Nginx配置負載均衡
配置
1 http { 2 upstream upstream_name{ 3 server 192.168.0.28:8001; 4 server 192.168.0.28:8002; 5 } 6 7 server { 8 listen 8080; 9 server_name localhost; 10 11 location / { 12 proxy_pass http://upstream_name; 13 proxy_set_header Host $host; 14 proxy_set_header X-Real-IP $remote_addr; 15 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 16 } 17 } 18 }
負載均衡策略
策略一:輪詢(默認)
最基本的配置方法,它是upstream的默認策略,每個請求會按時間順序逐一分配到不同的后端服務器,
| 引數 | 描述 |
| fail_timeout | 與max_fails結合使用, |
| max_fails | 設定在fail_timeout引數設定的時間內最大失敗次數,如果在這個時間內,所有針對該服務器的請求都失敗了,那么認為該服務器會被認為是停機了, |
| fail_time | 服務器會被認為停機的時間長度,默認為10s, |
| backup | 標記該服務器為備用服務器,當主服務器停止時,請求會被發送到它這里, |
| down | 標記服務器永久停機了, |
注意:
- 在輪詢中,如果服務器down掉了,會自動剔除該服務器,
- 預設配置就是輪詢策略,
- 此策略適合服務器配置相當,無狀態且短平快的服務使用,
策略二:權重
在輪詢策略的基礎上制定淪陷的幾率,
如:
1 upstream foo { 2 server localhost:8001 weight=2; 3 server localhost:8002; 4 server localhost:8003 backup; 5 server localhost:8004 max_fails=3 fail_timeout=20s; 6 }
這里例子中,weight引數用于制定輪詢的幾率,weight默認值為1;weight的數值和被訪問的幾率成正比,
注意:
- 權重越高分配到需要處理的請求越多,
- 此策略可以與least_conn和ip_hash結合使用,
- 此策略比較適合服務器的硬體配置差別比較大的情況,
策略三:ip_hash
負載均衡器按照客戶端IP地址的分配方式,可以確保相同客戶端的請求一直發送到相同的服務器,這樣每個訪客都固定訪問一個后端服務器,
1 upstream foo { 2 ip_hash; 3 server localhost:8001 weight=2; 4 server localhost:8002; 5 server localhost:8003; 6 server localhost:8004 max_fails=3 fail_timeout=20s; 7 }
注意:
- 在nginx版本1.3.1之前,不能在ip_hash中使用權重(weight),
- ip_hash不能與backup同時使用,
- 此策略適合有狀態服務,比如session,
- 當有服務器需要剔除,必須手動down掉,
策略四:least_conn最小連接
把請求轉發給連接數較少的后端服務器,輪詢演算法是把請求平均的轉發給各個后端,使它們的負載大致相同;但是,有些請求占用的時間很長,會導致其所在的后端負載較高,這種情況下,least_conn這種方式就可以達到更好的負載均衡效果,
1 upstream foo { 2 least_conn; 3 server localhost:8001 weight=2; 4 server localhost:8002; 5 server localhost:8003 backup; 6 server localhost:8004 max_fails=3 fail_timeout=20s; 7 }
注意:
- 此負載均衡策略適合請求處理時間長短不一造成服務器過載的情況,
Nginx配置動靜分離
架構分析

配置
動靜分離的原理很簡單,通過location對請求url進行匹配即可,在/Users/Hao/Desktop/Test(任意目錄)下創建 /static/imgs ,
配置如下:
1 worker_processes 1; 2 3 events { 4 worker_connections 1024; 5 } 6 7 http { 8 9 server { 10 listen 10000; 11 server_name localhost; 12 13 #攔截后臺請求 14 location / { 15 proxy_pass http://localhost:8888; 16 proxy_set_header X-Real-IP $remote_addr; 17 } 18 19 #攔截靜態資源 20 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ { 21 root /Users/dalaoyang/Downloads/static; 22 } 23 24 } 25 26 }
動靜分離與前后分離的區別
- 動靜分離:動態資源與靜態資源分離,不會部署在同一臺服務器上,
- 前后分離:網站架構模式,微服務開發基于SOA面向于服務器開發,后臺和前端都采用呼叫介面方式,將一個專案拆分成一個控制Web(前端)和介面(后端),最終使用rpc遠程呼叫技術,視圖層和業務邏輯層拆分,中間采用RPC遠程呼叫技術,
常見問題
- 為什么互聯網公司專案中,靜態資源url后面會加上一個時間戳?
- 目的:最終的目的是為了控制專案上線的時候,新靜態資源與老的瀏覽器快取靜態資源避免沖突問題,
- 解決方案:加上時間戳規范t = 專案上線,
- 304走本地快取狀態碼的原理是什么?
- 默認瀏覽器圖片快取是7天,
- 第一次下載資源的時候,客戶端保存修改資源時間,
- 第二次下載資源的時候,服務端判斷客戶端上一次修改的時間是否需回傳200還是304,
- 第二次下載資源的時候,服務端判斷當前資源檔案與客戶端上一次修改的時間是否需回傳200還是304客戶端第二次下載資源最后修改時間2018/6/28 下午11:07:11,
- 服務端最后一次修改時間大于客戶端最后一次修改的時間200重新加載資源,
- 服務器端最后一次修改的時間小于客戶端最后修改的時間回傳304走本地快取,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13901.html
標籤:Java
下一篇:快取擊穿 解決方案
