1、 代理和nginx相關概念javascript
1. 代理類型php
正向代理:代理局域網對internet的鏈接請求css
反向代理:代理internet對局域網的鏈接請求html
2. Nginx反向代理(reverseproxy)的做用java
在必定程度上確保web服務器的安全(由於任何來自internet的請求都須要通過代理服務器)nginx
經過緩存功能加速web訪問web
能夠實現後端服務器的負載均衡算法
3. Nginx簡介apache
1) 核心特色json
支持跨平臺
配置簡單
使用非阻塞模型、高併發鏈接(官測5W,實際2-3W)
事件驅動:通訊機制使用epoll模型(一個進程處理多個請求)
Master/worker結構:一個master進程,生成一個或多個woker進程
內存消耗小:進程開啓數量影響內存佔用,而nginx的一個進程能夠處理多請求
內置健康檢查功能
節省帶寬:支持Gzip壓縮
穩定性高
2) Nginx的master/worker結構詳解
Master:維護worker隊列
Worker:進行實際邏輯運算,並將結果返回給master
一個Master進程產生多個worker進程,而後每一個worker進程處理多個請求,一個worker進程中斷後,不會影響其餘worker進程,而且master會從新啓動新的worker進程
3) 阻塞和非阻塞模型的區別
阻塞模式:當讀寫事件沒有準備好時,只能等待,當前線程將被掛起
非阻塞模式:事件立刻返回,可是響應爲事件還沒準備好,過會再來,而後每隔一段時間就來檢查一下事件,直到事件準備好,在這期間這個線程能夠處理其餘事情
4) Nginx使用的epoll非阻塞通訊機制的特色
Epoll工做機制也稱爲:異步非阻塞事件處理機制
Epoll存在一個隊列事件,全部未完成的事件,將被放到epoll事件隊列中,非阻塞模式須要在每一個未完成的事件之間進行切換,這樣致使了cpu開銷很大,而epoll模型的通訊機制不會,epoll模型只是在請求之間進行切換,並且切換也是由於異步事件未準備好,而主動讓出的,因此這裏的切換不須要任何代價,這樣nginx實現了高併發和輕量級(只須要幾個進程便可)
2、 主要知識點簡介
1. nginx-sticky-module模塊
主要實現會話保持,後面會介紹配置項
其餘實現會話保持的方法:ip_hash
2. Nginx實現LB的調度方案
RR:輪詢(默認)
Ip_hash:請求按訪問IP的hash結果分配,能夠有效解決session共享問題
Least_conn:請求被髮送到當前活躍鏈接最少的後端服務器上,會考慮weight的值
url_hash:按照url的hash結果分配請求,須要nginx的hash包nginx_upstream_hash支持
fair:依據頁面大小和加載時間長短智能地進行負載均衡,須要第三方nginx模塊upstream_fair支持
3. 負載均衡與健康檢查
nginx自帶是沒有針對負載均衡後端節點的健康檢查的,可是能夠經過默認自帶的ngx_http_proxy_module 模塊和ngx_http_upstream_module 模塊中的相關指令來完成當後端節點出現故障時,自動切換到下一個節點來提供訪問
4. Nginx的proxy緩存
緩存也就是將js、css、image等靜態文件從後端服務器緩存到nginx指定的緩存目錄下,既能夠減輕後端服務器負擔,也能夠加快訪問速度,但這樣緩存及時清理成爲了一個問題,因此須要 ngx_cache_purge 這個模塊來在過時時間未到以前,手動清理緩存。
3、 nginx反向緩存代理服務器搭建
實驗環境
1. 後端web服務器的配置
1) 爲了實驗模擬的更爲真實,咱們將兩臺後端服務器的域名改成同樣的
2) 爲了能夠模擬負載均衡,咱們爲兩個後端服務器配置相同文件名,內容不一樣的html文件
Web1(192.168.1.5)
Web2(192.168.1.6)
3) 分別在兩臺後端服務器上開啓80端口例外
2. Nginx的安裝
首先安裝依賴包
Nginx的session和緩存清除功能都須要第三方模塊的支持,在編譯nginx的時候須要指定,因此咱們首先解壓第三方模塊
而後建立nginx運行時須要的用戶
解壓nginx而且進行編譯安裝
nginx默認自帶的 ngx_http_proxy_module 模塊 和ngx_http_upstream_module模塊實現後端服務器的健康檢查
使用第三方模塊nginx-sticky-module擴展模塊實現Cookie會話黏貼(保持會話)
使用第三方模塊ngx_cache_purge實現更強大的緩存清除功能
安裝完成後的優化及其處理
Nginx不支持動態加載模塊,可是第三方模塊能夠在nginx安裝後再次添加,添加方法是:
解壓模塊文件
解壓nginx文件
./configure --add-module=第三方模塊壓縮文件位置
而後make,可是不make install
最後將新的nginx主程序替換舊的nginx主程序
cp objs/nginx /usr/local/nginx1.10/sbin/nginx
查看nignx安裝的模塊
4、 修改nginx配置文件實現:反向代理+負載均衡+健康檢查
1. 配置文件總覽
圖片不太清晰,下面我直接將配置粘貼了過來
user www www;
worker_processes 2;
worker_cpu_affinity 01 10;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
worker_rlimit_nofile 10240;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 4096;
}
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"'
'"$upstream_cache_status"';
access_log logs/access.log main;
server_tokens off;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#Compression Settings
gzip on;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 16 8k;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
#end gzip
# http_proxy Settings
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_buffering off;
proxy_temp_path /usr/local/nginx1.10/proxy_temp;
proxy_cache_path /usr/local/nginx1.10/proxy_cache levels=1:2 keys_zone=my-cache:100m max_size=1000m inactive=600m max_size=2g;
#load balance Settings
upstream backend {
#sticky;
server 192.168.1.5:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.6:80 weight=1 max_fails=2 fail_timeout=10s;
}
#virtual host Settings
server {
listen 80;
server_name localhost;
charset utf-8;
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
proxy_cache_purge my-cache $host$1$is_args$args;
}
location / {
index index.php index.html index.htm;
proxy_pass http://backend;
proxy_redirect off;
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_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) {
proxy_pass http://backend;
proxy_redirect off;
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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_cache my-cache;
add_header Nginx-Cache $upstream_cache_status;
proxy_cache_valid 200 304 301 302 8h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1d;
proxy_cache_key $host$uri$is_args$args;
expires 30d;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.1.0/24;
deny all;
}
}
}
2. 分區解釋:一
3. 分區解釋:二
4. 分區解釋:三
5. 分區解釋:四
6. 分區解釋:五
例:若是須要指定其餘調度方法直接在這個配置區域中添加調度方法的配置項便可,如:使用IP_hash算法
7. 分區解釋:六
8. 分區解釋:七
要想修改代理服務器發送給後端服務器的頭信息,實現後端服務器記錄真實的客戶機IP,只修改這裏不行,還須要修改後端服務器的web配置文件
我使用的後端服務器是apache,下面是須要修改的參數,兩臺後端服務器都須要修改
9. 分區解釋:八
10. 分區解釋:九
5、 驗證
1. 驗證緩存
第一次訪問
第二次訪問
2. 驗證緩存清除功能:清空在代理服務器上的緩存
3. 驗證負載均衡功能
由於有會話保持和緩存功能,在此環境中體現不出負載均衡功能,因此先將這裏兩個參數註釋掉不用
重啓nginx使配置生效
第一次訪問web頁面
第二次訪問web頁面
4. 驗證健康檢查
首先關閉一臺後端web服務器的web服務
驗證
而後啓動剛剛停掉的後端第一臺web服務器的httpd服務
再次驗證
5. 驗證後端服務器日誌記錄的IP是否爲真實客戶端的IP
首先使用客戶端訪問web頁面
而後在後端服務器上查看訪問日誌