寫在前面:
負載均衡:請求分發(轉發)–一次請求
反向代理:代理服務器重新發起請求(重定向)–兩次請求
一、nginx的安裝
1、下載
http://nginx.org/download/ –> ./configure 運行nginx配置文件 –> make 編譯 –> make install 安裝
brew install nginx
2、啓動
終端輸入 > nginx
3、目錄
mac下使用brew安裝其目錄在
/usr/local/etc/
中。
配置文件:nginx.conf
二、常用命令
nginx # 啓動Nginx
nginx -t # 測試配置文件是否有錯誤
nginx -v # 查看Nginx版本
nginx -V # 查看Nginx版本和編譯安裝時的編譯參數
nginx -s stop # 強制停止Nginx服務
nginx -s quit # 優雅地停止Nginx服務(即處理完所有請求後再停止服務)
nginx -s reload # 重新加載Nginx配置文件,然後以優雅的方式重啓Nginx
三、常用配置
#運行用戶
#user nobody;
#開啓進程數<=CPU數
worker_processes 1;
#錯誤日誌保存位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#進程號PID保存文件
#pid logs/nginx.pid;
#工作模式及連接數上限
events {
#epoll是多路複用IO(I/O Multiplexing)中的一種方式,
#僅用於linux2.6以上內核,可以大大提高nginx的性能
use epoll;
#單個後臺worker process進程的最大併發鏈接數
worker_connections 1024;
# 併發總數是 worker_processes 和 worker_connections 的乘積
}
http {
#文件擴展名與文件類型映射表
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 65;
#打開gzip壓縮
#gzip on;
#設定請求緩衝
#client_header_buffer_size 1k;
#large_client_header_buffers 4 4k;
#設定[負載均衡]的服務器列表
upstream myapp {
#指定負載均衡算法
#ip_hash;
server 192.168.1.171:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
server 192.168.1.172:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
server 192.168.1.173:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80 backup;
#service 反向服務地址,加端口
#weigth 參數表示權值,權值越高被分配到的機率越大
#max_fails 當有#max_fails個請求失敗,就表示後端的服務器不可用,踢出。默認爲1,將其設置爲0可以關閉檢查
#fail_timeout 踢出後重新探測時間
#max_conns 服務允許的最大連接數,可以控制併發量
#backup 指的是這臺服務不啓動,當所有服務不可用時再啓用
}
#配置虛擬主機
server {
#監聽端口
listen 80;
#監聽域名
server_name hoaven.com; #測試時需要配置hosts,線上可配置域名解析
#nginx訪問日誌放在logs/host.access.log下,並且使用main格式(還可以自定義格式)
#access_log logs/host.access.log main;
#站點,指客戶端訪問虛擬服務時,攔截某些特定路由,反向代理到某個負載均衡服務列表
#一個server可以配置多個location
location / { #攔截所有請求
#指的就是location站點
#配置的值是相對路徑(相對於nginx目錄:/usr/local/etc/nginx/)
root html;
#默認訪問文件
index index.html index.htm;
#負載均衡反向代理
#如果不配置此項,客戶端訪問到此站點時,直接訪問/usr/local/etc/nginx/html/uri資源,資源沒找到就會訪問index.html或index.htm資源,不會被代理
proxy_pass http://myapp;
}
#整體訪問流程:
#1、客戶端請求http:hoaven.com訪問(server_name + listen)到nginx的虛擬主機;
#2、nginx將請求轉發到myapp的web集羣(選擇服務器:權重+輪詢,如果權重一樣,每個服務輪流進行服務);
#配置[反向代理]tomcat服務器:攔截.jsp結尾的請求轉向到指定的服務器及端口
#location ~ \.jsp$ {
# proxy_pass http://192.168.1.171:8080;
#}
#錯誤頁面及其返回地址
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
四、負載均衡算法
權重+輪詢(默認)
權重相同的情況下,‘一人一次’
ip_hash
同一ip,每次請求都負載到一臺服務,應用於保持session的一致性
url_hash
同一url,每次請求都負載到一臺服務,應用於靜態資源的緩存優化(每臺服務節點只需要從文件服務器緩存該客戶端需要訪問的文件資源)
弊端:當某臺服務器掛掉後,某些url客戶端就訪問不到靜態資源了
least_conn:最少連接
選擇當前最少連接的服務節點
least_time:最小響應時間
計算節點平均響應時間,選取響應最快的節點
五、server和location
客戶端訪問流程:
(1) 客戶端通過server_name + listen找到相應的nginx虛擬服務server;
(2) 通過請求uri定位到具體的location(根據uri和location後面配置的目錄路徑、正則表達式、條件語句等進行匹配);
(3) 通過location代理到具體的upstream,再通過負載均衡算法請求具體的服務節點;
注:location可以直接定位到具體的服務節點地址或靜態地址
六、動靜分離的實現
靜態資源請求代理到靜態資源服務節點(前端);動態請求代理到動態服務節點(後端);
方案一:
upstream static_servers {
server 192.168.1.171:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
server 192.168.1.172:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
}
upstream dynamic_servers {
server 192.168.1.191:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
server 192.168.1.192:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
}
server {
listen 80;
#訪問任何一個域名都能定位到這個虛擬服務
server_name static.hoaven.com dynamic.hoaven.com;
location static.hoaven.com {
root html;
index index.html index.htm;
proxy_pass http://static_servers;
}
location dynamic.hoaven.com {
root html;
index index.html index.htm;
proxy_pass http://dynamic_servers;
}
}
方案二:配置兩個server
server {
listen 80;
server_name static.hoaven.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://static_servers;
}
}
server {
listen 80;
server_name dynamic.hoaven.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://dynamic_servers;
}
}
寫在最後:
歡迎關注個人訂閱號,一起學習和分享。
公衆號中搜索:IT技術分享中心 或 hoaven