1. 程式人生 > >NIGINX 中的location上下文的參數詳解及用法

NIGINX 中的location上下文的參數詳解及用法

Nginx location配置參數詳解

nginx中只支持三種請求轉發方式:
round-robin(輪流調度方式):它是把客戶端流量請求依次按順序分發給每個後端服務器。缺點是:會出現某個服務器已經在 處理很多的請求而再有新的請求進來,nginx代理服務器還是會給它分發流量進來,這會導致服務器down掉。
ip_hash ( ip哈希方式 ) : 它是把訪問的客戶端ip進行哈希加密計算後,存到hash表裏。它的工作原理是當你訪問過一次後,我會記住你訪問的是哪個服務器,當你 再次發送請求過來我會自動連接你第一次連接過的服務器,除非你改變了ip.

least_conn ( 最少連接方式 ) :它解決了輪流方式的弊端,它是根據哪個服務器連接的客戶端請求數最少去連接誰。缺點是:可能會發生突發性訪問完後使其down掉。

nginx反向代理中的自檢機制:
這種機制會隨時不斷的檢查代理的後端服務器是否工作正常,相應的設置參數如下:
max_fails=3(最大失敗連接次數,默認是1)
fail_timeout=2(失敗連接的超時時長)
backup(加上它是只有當可用的服務器全部down掉,才會啟用本服務器,一般用於提示客戶端服務器在維護中...)
down(它是自定義停掉某一臺服務器)
nginx代理服務器的權重設置:
weight=1 ;(數字越大權重越大)
加上它是讓某個服務器多處理一些請求任務,多勞多得。誰的配置高誰就設置的權重大一些。
如何正確獲取客戶端的ip地址?
在代理服務器的子配置文件中的location 上下文中添加這句話
proxy_set_header X-client-IP $remote_addr ;
X-Real-IP(這個是自己定義的變量名字)
整句話的意思是把系統變量值傳給自己定義的變量。
在後端服務器中的主配置文件中找到Format日誌格式配置哪一行添加自己的變量 進去,按照人家給定的格式寫。
LogFormat "%{X-client-IP}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

  1. 如何對某個網頁內容進行設置訪問用戶名和密碼?
    生產場景描述: 當有些網頁內容是公司內部的某些人才能訪問時,我們可以這樣 做。
    在代理服務器的子配置文件中的location 上下文中添加這句話
    auth_basic "這裏寫啥都可以,作用是提示用戶輸入啥信息"
    auth_basic_user_file /data/auth.conf;
    在後端服務器上
    [root@localhost ~]# htpasswd -cm /data/auth_conf user1
    /data/auth_conf(文件名)user1(用戶名)
    如果是在增加一個新的對此網頁的訪問只需要把-c去掉即可

nginx 實現反向代理案例1:
[root@www conf.d]# vim /etc/nginx/conf.d/web.conf

upstream webservers{
server 10.18.42.156:80; 這是後端服務器
server 10.18.42.153:80; 這是後端服務器
}
webservers這個名字隨便起。
在後端服務器上要提前設置好它們的網頁內容。
server{
listen 8080;
servername ;
location / {
root /webdata;
index index.html index.php;
proxy_pass http://webservers; proxy_pass這個是代理的關鍵字
}
}
nginx 實現反向代理案例2:
webservers{
server 10.18.42.156:80; 這個是php網頁
server 10.18.42.153:80; 這個是html網頁
}

server{
listen 8080;
servername ;
location / {
root /webdata;
index index.html index.php;
}

    location ~* ".php$" {

            proxy_pass http://webservers;
    }

}

註意觀察兩次實驗得出的結論是:location 是你訪問時的匹配規則,你匹配到哪個就執行哪個裏面的代碼塊。
nginx 實現反向代理案例3:
[root@www conf.d]# vim /etc/nginx/conf.d/web.conf

upstream webservers{
ip_hash;
server 10.18.42.156:80 max_fails=3 fail_timeout=2;
server 10.18.42.153:80 max_fails=3 fail_timeout=2;
server 10.18.42.157 backup; 這個是只有當上面的所有服務器都down掉後,它 才提供服務,一般只是顯示一個友好提示:服務器維護中..........
}

server{
listen 8080;
upstream webservers{
ip_hash; 這個是定義調度方式
server 10.18.42.156:80 max_fails=3 fail_timeout=2; 這個是自檢規則
server 10.18.42.153:80 max_fails=3 fail_timeout=2 down; 這個是手動停掉本 臺服務器。
}

server{
listen 8080;
servername ;
location / {
root /webdata;
index index.html index.php;
}

    location ~* ".php$" {

            proxy_pass http://webservers;
    }

}

nginx 實現反向代理案例3:
upstream webservers{
ip_hash;
server 10.18.42.156 weight=1; 這是權重設置數字越大處理的請求數越多。
server 10.18.42.153 weight=2;
}

server{
listen 8080;
servername ;
location / {
root /webdata;
index index.html index.php;
}

    location ~* ".php$" {

            proxy_pass http://webservers;
    }

}

nginx 中的關於如何獲取客戶端ip地址信息的設置方法實例4:
第一步:在代理服務器的子配置文件中設置變量參數
upstream webservers{
ip_hash;
server 10.18.42.156 weight=1;
server 10.18.42.153 weight=2;
}

server{
listen 8080;
servername ;
location / {
root /webdata;
index index.html index.php;
}

    location ~* ".php$" {

            proxy_pass http://webservers;
            proxy_set_header X-client-IP $remote_addr ; 紅字是關鍵字,中間是自                    己定義的變量名
    }

}
第二步:
在後端服務器中的主配置文件中找到Format日誌格式配置哪一行添加自己的變量 進去,按照人家給定的格式寫。
/etc/httpd/conf/httpd.conf
LogFormat "%{X-client-IP}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

關於反向代理中的訪問路徑的字符匹配問題詳細說明:
第一種是沒有匹配符的訪問路徑
location / {
root /webdata;
index index.html index.php;
proxy_psaa http://10.18.42.10;
}
這種情況下ip地址後面加上路徑在訪問的時候回自動把訪問路徑加到後面,為了避免這種錯誤。所以這種不加任何匹配符的情況下,ip地址後面必須寫明網頁的確切路徑。

第二種情況是加了匹配符的訪問路徑
location ~* ".php$" {

            proxy_pass http://webservers;
            proxy_set_header X-client-IP $remote_addr ;
    }

這種情況下添加了匹配符,那麽訪問ip地址後面絕對不能添加任何路徑或其他東西。

nginx 實現反向代理關於訪問權限案例5:
在代理服務器上輸入下面命令:
[root@localhost ~]# htpasswd -cm /passwd user1
/passwd 這個是存放密碼和用戶名的文件
user1 這個是要創建的用戶名
進到字配置文件中設置如下:
location ~* ".php$" {
proxy_pass http://webservers;
proxy_set_header X-client-IP $remote_addr ;
auth_basic "請輸入您的用戶名及密碼";
auth_basic_user_file /passwd;
}
這樣當我們在去訪問.php的網頁時,客戶端會提示我們輸入用戶名和密碼,否則看不得網頁內容。

NIGINX 中的location上下文的參數詳解及用法