Nginx反向代理

一、安裝

        ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module


二、配置

      Nginx的反向代理功能,其實就是一個upstream模塊加一段主機SERVER定義。

    

三、upstream模塊詳解

       Nginx的負載均衡功能主要由upstream模塊來完成,完整模塊名爲ngx_http_upstream_module。Nginx支持的代理方式有3種,PHP使用fastcgi_pass,反向代理使用proxy_pass。

       1. proxy_pass

       2. fastcgi_pass

       3. memcached_pass 

       重要參數:

       proxy_next_upstream

       fastcgi_next_upstream

       memcached_next_upstream

       請求失敗時不給用戶返回錯誤信息,而是請求下一臺機器,用戶體驗很好!需要配合max_fails=1參數使用,並且只能是1.


四、調度算法相關

    1、ip_hash參數的缺點:

      1. 根據來源IP來做哈希算法,但是國內所有的單位都是通過NAT上網,多臺機器只有一個IP。

      2. 必須是最前端的服務器,如果前端還有LVS負載均衡就無法實現。

      3. 使用ip_hash的時候,權重weight和備份backup都不能用!

      LVS裏面可以通過-P選項來實現同樣的功能,KeepAlived裏面也可以通過persistence_timeout 50參數來實現。

    2、fair算法

      根據頁面大小和相應時間來智能調度。第三方的算法,需要下載nginx的upstream_fair模塊。

      缺點是也會導致負載不均。


    3、URL算法

       根據不同的URL調度到不同的服務器,最有利於緩存服務器,常見於CDN公司,也是第三方算法,需要下載模塊。


    4、最小連接數least_conn

       顧名思義


五、location指令詳解

    語法:

    location [  = | ~ | ~* | ^~   ]   {

    ...................

     }

    = 精確匹配(優先級最高)

    ~ 區分大小寫

    ^~只區分字符串,不匹配正則

    ~*不區分大小寫

    

    

六、Nginx的http proxy模塊詳解

      重要參數:

      proxy_set_header Host $host:      增加主機名!主要用於後端服務器存在多個主機的場景。


      proxy_set_header X-Forwarded-For $remote_addr  :

      如果後端服務器需要取得用戶IP,從header取得,使用 $remote_addr 變量建議修改日誌格式以顯示訪問用戶的IP!


七、NginxProxy根據URI實現轉發(實現動靜分離的重要方法,也是落伍論壇服務器的優化方法)

       落伍論壇的服務器爲單臺,前端Nginx處理靜態請求,PHP拋給後端APACHE。

       系統架構爲Linux+Nginx+Apache+MySQL。


       實例:根據user_agent實現手機訪問轉發

       語法:

       location / {

       if ($http_user_agent ~* "android")

          {

          proxy_pass http://android;

          }

        if ($http_user_agent ~* "iphone")

          {

          proxy_pass http://iphone;

          }

         proxy_pass http://backend;         

}



公司使用nginx作爲負載均衡,有時候需要自定義header頭髮送給後端的真實服務器. 想過去應該是非常的簡單的事情.

例子如下:

設置代理服務器ip頭

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


然後自己在自定義個header,remote_header_test,如下:

proxy_set_header remote_header_test "123123123";


接着後端真實服務器打開www.ttlsa.com/nginx_header.php

源代碼是簡單的phpinfo

<?php

phpinfo();

 ?>


在phpinfo結果頁面中搜索剛纔設置的頭部,發現沒有找到,網上查找資料,才發現原來nginx會忽略掉下劃線的頭部變量.於是改成如下:

proxy_set_header remoteheadertest "123123123";


再次打開www.ttlsa.com/nginx_header.php,搜索remoteheadertest,有內容. 看來果真不能用下劃線. 然後改成'-',如下:

proxy_set_header remote-header-test "123123123";


打開頁面,搜索到的頭部是remote_header_test. 自動轉換成下劃線了.

如果想要支持下劃線的話,需要增加如下配置:

underscores_in_headers on;


可以加到http或者server中

語法:underscores_in_headers on|off

默認值:off

使用字段:http, server

是否允許在header的字段中帶下劃線





   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章