1. 程式人生 > >Nginx的正反向代理和合買平臺出租配置文件詳解

Nginx的正反向代理和合買平臺出租配置文件詳解

forward ons 接受 區別 負載 keepaliv 網頁服務器 多臺 0.12

簡述:合買平臺出租 Q1446595067
Nginx ("engine x") 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。並在一個BSD-like 協議下發行,其特點是占有內存少,
並發能力強,事實上nginx的並發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。

負載均衡的簡述:
  多臺服務器處於一個內網,而我們要訪問這些服務器,中間加一臺 反向代理,根據各臺服務器的負載,指定訪問其中一臺。這就叫負載均衡。
  代理服務器來接受外部的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給外部的請求連接的客戶端,此時代理

服務器對外就表現為一個服務器。

作用:大型網站在接受用戶請求的時候,這個訪問量是巨大的,這個時候他就要設計怎麽去分擔這些請求壓力。按照我們的理解就是搭建一個應用服務器的集群(tomcat)
每個用戶請求進來都會按照不同的分發方式去訪問相對應的服務器,這個時候負載均衡的實現就達到了。

反向代理和正向代理的區別:

正向代理:

正向代理,代理,他的工作原理就像一個跳板,
簡單的說,
我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器
這個代理服務器呢,他能訪問那個我不能訪問的網站
於是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容
代理服務器去取回來,然後返回給我,這個時候我們用戶取回的東西還是直接的最終服務端口。

反向代理:
(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet
上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。

繼續舉例:
例用戶訪問 http://ooxx.me/readme
但ooxx.me上並不存在readme頁面
他是偷偷從另外一臺服務器上取回來,然後作為自己的內容吐給用戶

但用戶並不知情
這很正常,用戶一般都很笨

這裏所提到的 ooxx.me 這個域名對應的服務器就設置了反向代理功能

結論就是 反向代理正好相反,對於客戶端而言它就像是原始服務器,並
且客戶端不需要進行任何特別的設置。客戶端向反向代理 的命名空間(name-space)

中的內容發送普通請求,接著反向代理將判斷向何處(原始服務器)轉交請求,
並將獲得的內容返回給客戶端,就像這些內容 原本就是它自己的一樣。這個時候的
用戶請求不知道訪問的是哪裏,用戶其實是很笨的,在這裏只是發送了請求而已。

配置項:
1、輪詢
輪詢是upstream的默認分配方式,即每個請求按照時間順序輪流分配到不同的後端服務器,如果某個後端服務器down掉後,能自動剔除。
upstream backend {
server 192.168.1.101:8888;
server 192.168.1.102:8888;
server 192.168.1.103:8888;
}
2、weight
輪詢的加強版,即可以指定輪詢比率,weight和訪問幾率成正比,主要應用於後端服務器異質的場景下。
upstream backend {
server 192.168.1.101 weight=1;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=3;
}
3、ip_hash
每個請求按照訪問ip(即Nginx的前置服務器或者客戶端IP)的hash結果分配,這樣每個訪客會固定訪問一個後端服務器,可以解決session一致問題。
upstream backend {
ip_hash;
server 192.168.1.101:7777;
server 192.168.1.102:8888;
server 192.168.1.103:9999;
}
4、fair
fair顧名思義,公平地按照後端服務器的響應時間(rt)來分配請求,響應時間短即rt小的後端服務器優先分配請求。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
fair;
}
5、url_hash
與ip_hash類似,但是按照訪問url的hash結果來分配請求,使得每個url定向到同一個後端服務器,主要應用於後端服務器為緩存時的場景下。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
hash $request_uri;
hash_method crc32;
}
其中,hash_method為使用的hash算法,需要註意的是:此時,server語句中不能加weight等參數。
關於,如何在負載均衡中使用upstream請參看這裏。

具體nginx.conf配置說明:

########### 每個指令必須有分號結束。#################
#user administrator administrators; #配置用戶或者組,默認為nobody nobody。
#worker_processes 2; #允許生成的進程數,默認為1
#pid /nginx/pid/nginx.pid; #指定nginx進程運行文件存放地址
error_log log/error.log debug; #制定日誌路徑,級別。這個設置可以放入全局塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #設置網路連接序列化,防止驚群現象發生,默認為on
multi_accept on; #設置一個進程是否同時接受多個網絡連接,默認為off
#use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大連接數,默認為512
}
http {
include mime.types; #文件擴展名與文件類型映射表
default_type application/octet-stream; #默認文件類型,默認為text/plain
#access_log off; #取消服務日誌
log_format myFormat ‘$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for‘; #自定義格式
access_log log/access.log myFormat; #combined為日誌格式的默認值
sendfile on; #允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。
sendfile_max_chunk 100k; #每個進程每次調用傳輸數量不能大於設定的值,默認為0,即不設上限。
keepalive_timeout 65; #連接超時時間,默認為75s,可以在http,server,location塊。

upstream mysvr {   
  server 127.0.0.1:7878;
  server 192.168.10.121:3333 backup;  #熱備
}
error_page 404 https://www.baidu.com; #錯誤頁
server {
    keepalive_requests 120; #單連接請求上限次數。
    listen       4545;   #監聽端口
    server_name  127.0.0.1;   #監聽地址       
    location  ~*^.+$ {       #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。
       #root path;  #根目錄
       #index vv.txt;  #設置默認頁
       proxy_pass  http://mysvr;  #請求轉向mysvr 定義的服務器列表
       deny 127.0.0.1;  #拒絕的ip
       allow 172.18.5.54; #允許的ip           
    } 
}

}

項目應用描述:
我們發現我們雲平臺停車這個項目部署之後,發現用戶訪問量增加了很多,這個時候我們的服務器就承載不了了,所以我們公司提出的解決方案就是搭建一個tomcat+Nginx的應用服務器的集群
這麽搭建的好好處就是我們的用戶請求進來之後我們可以通過nginx的反向代理服務器來分配用戶的請求去訪問哪些tomcat服務器,我們在項目中應用的分配策略采是fair(第三方),
為什麽要用這種呢,因為這種是現在nginx常用的分配策略,好處是他能接受請求之後選擇出響應時間最快的服務器來進行響應,這樣能盡快的回復用戶的請求。
Ip_hash和url_hash我沒具體研究過,還有就是為什麽不選用輪詢和權重。先來說不選用輪詢,因為輪詢是最基本的nginx分配策略,這種策略我覺的還是不太合理,如果其中幾臺服務器響應慢,還是影響了
訪問速度,選用第二種權重的話,如果權重大的服務器用的多的話,其他的服務器反而沒有更大程度的利用起來。

權重:舉個例子
upstream mysvr {
server tomcat1 weight=1 1
server tomcat2 weight=2 2,3
server tomcat3 weight=3 4,5,6
}
在這個時候,她會把這些數字123加起來,等於6,然後隨機多少個訪問,比如是25個,然後25%6+1,得到的數去訪問(1)(2,3)(4,5,6)

Nginx的正反向代理和合買平臺出租配置文件詳解