nginx反向代理

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結構詳解

       wKioL1j8qNvhQzk0AAA3_zxtkz0511.jpg

  •  

    • 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反向緩存代理服務器搭建

   實驗環境

   wKiom1j8qcGj2bMkAAAqh6BdgGs895.png

   1. 後端web服務器的配置

    1)   爲了實驗模擬的更爲真實,咱們將兩臺後端服務器的域名改成同樣的

      wKioL1j8qeCR-9AlAADAN_2ao3I717.jpg

     2)   爲了能夠模擬負載均衡,咱們爲兩個後端服務器配置相同文件名,內容不一樣的html文件

        Web1(192.168.1.5)

        wKiom1j8qf_C4MuhAAB_xmzAJn4558.jpg

        Web2(192.168.1.6)

        wKioL1j8qg3zzkVIAACFC3Mfih0552.jpg

     3)   分別在兩臺後端服務器上開啓80端口例外

        wKioL1j8qjfDIK9SAABre6QbY44731.jpg

   2. Nginx的安裝

     首先安裝依賴包

     wKiom1j8qlnxATruAAA7yBflrfc989.jpg

  •  

    •  

    • Nginx的session和緩存清除功能都須要第三方模塊的支持,在編譯nginx的時候須要指定,因此咱們首先解壓第三方模塊

     wKiom1j8qmeRhzELAADlP6lsF04844.jpg

     而後建立nginx運行時須要的用戶

     wKiom1j8qpLypXDjAAAoiqCGO5w536.jpg

     解壓nginx而且進行編譯安裝

  •  

    •  

    • nginx默認自帶的 ngx_http_proxy_module 模塊 和ngx_http_upstream_module模塊實現後端服務器的健康檢查

    • 使用第三方模塊nginx-sticky-module擴展模塊實現Cookie會話黏貼(保持會話)

    • 使用第三方模塊ngx_cache_purge實現更強大的緩存清除功能

     wKiom1j8qrLzDEJlAAFwEfPd-aA560.jpg

     wKiom1j8qr7gpQl4AAAsiXDpjI8048.jpg

     安裝完成後的優化及其處理

     wKioL1j8qtCArY8LAAIu_9uWhlA334.jpg

     Nginx不支持動態加載模塊,可是第三方模塊能夠在nginx安裝後再次添加,添加方法是:

  •  

    •  

    • 解壓模塊文件

    • 解壓nginx文件

    • ./configure  --add-module=第三方模塊壓縮文件位置

    • 而後make,可是不make  install

    • 最後將新的nginx主程序替換舊的nginx主程序

    • cp  objs/nginx /usr/local/nginx1.10/sbin/nginx

     查看nignx安裝的模塊

     wKiom1j8qvSQYOHdAAErsH73HYg661.jpg

4、 修改nginx配置文件實現:反向代理+負載均衡+健康檢查

  1. 配置文件總覽

    wKiom1j8qxjCyBE5AAKXyUnzGXk560.jpg

     圖片不太清晰,下面我直接將配置粘貼了過來

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. 分區解釋:一

    wKioL1j8q5OQgx8MAACLyzWXet8163.jpg

  3. 分區解釋:二

    wKiom1j8q6HxrMMHAACU-ilnOHM919.jpg

  4. 分區解釋:三

    wKioL1j8q62T7BipAABmoOcpXVE108.jpg

  5. 分區解釋:四

    wKiom1j8q7zCZDDcAAD45IjFwwg758.jpg

  6. 分區解釋:五

    wKioL1j8q86A-M_mAACYB3Cgyss671.jpg

 

    • 例:若是須要指定其餘調度方法直接在這個配置區域中添加調度方法的配置項便可,如:使用IP_hash算法

     wKioL1j8q_LjxwbuAABhFCww2FA818.jpg

  7. 分區解釋:六

    wKiom1j8rADB_IpeAABv3r1xbuM772.jpg

  8. 分區解釋:七

    wKiom1j8rBqxQvs4AAE9ve2hZ4Y654.jpg  

    • 要想修改代理服務器發送給後端服務器的頭信息,實現後端服務器記錄真實的客戶機IP,只修改這裏不行,還須要修改後端服務器的web配置文件

    • 我使用的後端服務器是apache,下面是須要修改的參數,兩臺後端服務器都須要修改

    wKiom1j8rEiAt040AAEs4DQ6lk4834.jpg

  9. 分區解釋:八

    wKiom1j8rGyCQRuXAACrqxzU2YI246.jpg

  10. 分區解釋:九

    wKioL1j8rLniqQ9XAABlIxru2aI591.jpg

5、 驗證

  1. 驗證緩存

   第一次訪問

   wKiom1j8rKbSr0MWAAGnMwJD1p0097.jpg

   第二次訪問

   wKiom1j8rM_jitCTAAEiuH2y2QQ300.jpg

  2. 驗證緩存清除功能:清空在代理服務器上的緩存

   wKioL1j8rN-BF-QxAABwdQ-v5tY886.jpg

  3. 驗證負載均衡功能

  •  

    • 由於有會話保持和緩存功能,在此環境中體現不出負載均衡功能,因此先將這裏兩個參數註釋掉不用

   wKioL1j8rPLy7TvsAADsEqYyd-c736.jpg

   重啓nginx使配置生效

   wKiom1j8rP_TRoX0AAAuhjbXEnw787.jpg

   第一次訪問web頁面

   wKiom1j8rQ7yKAB_AABtqZF_b48327.jpg

   第二次訪問web頁面

   wKiom1j8rRyAWOxGAABrAKJ6Jnk819.jpg

  4. 驗證健康檢查

   首先關閉一臺後端web服務器的web服務

   wKiom1j8rS_hwkFqAABpwn6_nyU914.jpg

   驗證

   wKiom1j8rT7jnSLoAACIFmqVkVQ276.jpg

   而後啓動剛剛停掉的後端第一臺web服務器的httpd服務

   wKioL1j8rUuhoBp2AAA2ybinS6U218.jpg

   再次驗證

   wKiom1j8rVeD49aRAABiw8tZPb8460.jpg

  5. 驗證後端服務器日誌記錄的IP是否爲真實客戶端的IP

   首先使用客戶端訪問web頁面

   wKiom1j8rXHR_m0oAAA0N2KKieU047.png

   而後在後端服務器上查看訪問日誌

   wKiom1j8rYPxdGAwAADk8-grnas753.jpg

相關文章
相關標籤/搜索