Nginx基本概念
什么是Nginx
Nginx是一個高性能的HTTP和反向代理web服務器,特點是占有內存少,並發能力強,有報告表明能支持高達50000個並發連接數。
正向代理
是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。
反向代理
反向代理服務器位於用戶與目標服務器之間,但是對於用戶而言,反向代理服務器就相當於目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定。反向代理服務器通常可用來作為Web加速,即使用反向代理作為Web服務器的前置機來降低網絡和服務器的負載,提高訪問效率。
負載均衡
Load balancing,即負載均衡,是一種計算機技術,用來在多個計算機(計算機集群)、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。
動靜分離
安裝Nginx
①安裝依賴包
yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel
②下載Nginx穩定版
wget http://nginx.org/download/nginx-1.18.0.tar.gz
③解壓、編譯、安裝
# 解壓 tar -zxvf nginx-1.18.0.tar.gz # 進入解壓好的文件 cd nginx-1.18.0/ # 編譯 ./configure --prefix=/usr/local/nginx # 安裝 make && make install
④開放Linux對外網訪問的80端口
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
⑤Nginx服務的啟動操作
##### 啟動方式二選一 ##### # 默認配置文件啟動 cd /usr/local/nginx/sbin ./nginx # 指定配置文件啟動 ./nginx -c /usr/local/nginx/conf/nginx.conf
⑥驗證:瀏覽器訪問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
配置文件的結構
... #全局塊
events { #events塊
...
}
http #http塊
{
... #http全局塊
server #server塊
{
... #server全局塊
location [PATTERN] #location塊
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局塊
}
全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數等。
events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網絡連接序列化等。
http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
location塊:配置請求的路由,以及各種頁面的處理情況。
配置文件詳解
########### 每個指令必須有分號結束。################# #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配置反向代理
方式一
只替換域名
upstream domain { server localhost:8080 weight=5; } server { listen 80; server_name test.com; access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_pass http://domain; } }
方式二
帶前綴訪問
upstream prod { server localhost:8081 weight=5; } upstream user { server localhost:8082 weight=5; } server { listen 80; server_name test.com; access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main; location ^~/prod/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_pass http://prod/; } location ^~/user/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_pass http://user/; } }
方式三
rewrite重寫URL
upstream prod { server localhost:8081 weight=5; } upstream user { server localhost:8082 weight=5; } server { listen 80; server_name test.com; access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main; location ^~/prod/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; rewrite ^/prod/(.*)$ /$1 break; proxy_pass http://prod; } location ^~/user/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; rewrite ^/user/(.*)$ /$1 break; proxy_pass http://user; } }
Nginx配置負載均衡
配置
http { upstream upstream_name{ server 192.168.0.28:8001; server 192.168.0.28:8002; } server { listen 8080; server_name localhost; location / { proxy_pass http://upstream_name; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
負載均衡策略
策略一:輪詢(默認)
最基本的配置方法,它是upstream的默認策略,每個請求會按時間順序逐一分配到不同的后端服務器。
參數 | 描述 |
---|---|
fail_timeout | 與max_fails結合使用。 |
max_fails | 設置在fail_timeout參數設置的時間內最大失敗次數,如果在這個時間內,所有針對該服務器的請求都失敗了,那么認為該服務器會被認為是停機了。 |
fail_time | 服務器會被認為停機的時間長度,默認為10s。 |
backup | 標記該服務器為備用服務器,當主服務器停止時,請求會被發送到它這里。 |
down | 標記服務器永久停機了。 |
注意:
①在輪詢中,如果服務器down掉了,會自動剔除該服務器。
②缺省配置就是輪詢策略。
③此策略適合服務器配置相當,無狀態且短平快的服務使用。
策略二:權重
在輪詢策略的基礎上制定淪陷的幾率。
如:
upstream foo { server localhost:8001 weight=2; server localhost:8002; server localhost:8003 backup; server localhost:8004 max_fails=3 fail_timeout=20s; }
這里例子中,weight參數用於制定輪詢的幾率,weight默認值為1;weight的數值和被訪問的幾率成正比。
注意:
①權重越高分配到需要處理的請求越多。
②此策略可以與least_conn和ip_hash結合使用。
③此策略比較適合服務器的硬件配置差別比較大的情況。
策略三:ip_hash
負載均衡器按照客戶端IP地址的分配方式,可以確保相同客戶端的請求一直發送到相同的服務器。這樣每個訪客都固定訪問一個后端服務器。
upstream foo { ip_hash; server localhost:8001 weight=2; server localhost:8002; server localhost:8003; server localhost:8004 max_fails=3 fail_timeout=20s; }
注意:
①在nginx版本1.3.1之前,不能在ip_hash中使用權重(weight)。
②ip_hash不能與backup同時使用。
③此策略適合有狀態服務,比如session。
④當有服務器需要剔除,必須手動down掉。
策略四:least_conn最小連接
把請求轉發給連接數較少的后端服務器。輪詢算法是把請求平均的轉發給各個后端,使它們的負載大致相同;但是,有些請求占用的時間很長,會導致其所在的后端負載較高。這種情況下,least_conn這種方式就可以達到更好的負載均衡效果。
upstream foo { least_conn; server localhost:8001 weight=2; server localhost:8002; server localhost:8003 backup; server localhost:8004 max_fails=3 fail_timeout=20s; }
注意:此負載均衡策略適合請求處理時間長短不一造成服務器過載的情況。
Nginx配置動靜分離
架構分析
配置
動靜分離的原理很簡單,通過location對請求url進行匹配即可,在/Users/Hao/Desktop/Test(任意目錄)下創建 /static/imgs 。
配置如下:
worker_processes 1; events { worker_connections 1024; } http { server { listen 10000; server_name localhost; #攔截后台請求 location / { proxy_pass http://localhost:8888; proxy_set_header X-Real-IP $remote_addr; } #攔截靜態資源 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ { root /Users/dalaoyang/Downloads/static; } } }
動靜分離與前后分離的區別
動靜分離:動態資源與靜態資源分離,不會部署在同一台服務器上。
前后分離:網站架構模式,微服務開發基於SOA面向於服務器開發,后台和前端都采用調用接口方式。將一個項目拆分成一個控制Web(前端)和接口(后端),最終使用rpc遠程調用技術。視圖層和業務邏輯層拆分,中間采用RPC遠程調用技術。
常見問題
①為什么互聯網公司項目中,靜態資源url后面會加上一個時間戳?
目的:最終的目的是為了控制項目上線的時候,新靜態資源與老的瀏覽器緩存靜態資源避免沖突問題。
解決方案:加上時間戳規范t=項目上線。
②304走本地緩存狀態碼的原理是什么?
默認瀏覽器圖片緩存是7天。
第一次下載資源的時候,客戶端保存修改資源時間。
第二次下載資源的時候,服務端判斷客戶端上一次修改的時間是否需返回200還是304。
第二次下載資源的時候,服務端判斷當前資源文件與客戶端上一次修改的時間是否需返回200還是304客戶端第二次下載資源最后修改時間2018/6/28 下午11:07:11。
服務端最后一次修改時間大於客戶端最后一次修改的時間200重新加載資源。
服務器端最后一次修改的時間小於客戶端最后修改的時間返回304走本地緩存。